using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Web; using Umbraco.Web.PublishedCache; namespace Umbraco.Tests.PublishedContent { class SolidPublishedCaches : IPublishedCaches { public readonly SolidPublishedContentCache ContentCache = new SolidPublishedContentCache(); public ContextualPublishedContentCache CreateContextualContentCache(UmbracoContext context) { return new ContextualPublishedContentCache(ContentCache, context); } public ContextualPublishedMediaCache CreateContextualMediaCache(UmbracoContext context) { return null; } } class SolidPublishedContentCache : IPublishedContentCache { private readonly Dictionary _content = new Dictionary(); public void Add(SolidPublishedContent content) { _content[content.Id] = content.CreateModel(); } public void Clear() { _content.Clear(); } public void ContentHasChanged(UmbracoContext umbracoContext) { throw new NotImplementedException(); } public IPublishedContent GetByRoute(UmbracoContext umbracoContext, bool preview, string route, bool? hideTopLevelNode = null) { throw new NotImplementedException(); } public string GetRouteById(UmbracoContext umbracoContext, bool preview, int contentId) { throw new NotImplementedException(); } public IPublishedContent GetById(UmbracoContext umbracoContext, bool preview, int contentId) { return _content.ContainsKey(contentId) ? _content[contentId] : null; } public IEnumerable GetAtRoot(UmbracoContext umbracoContext, bool preview) { return _content.Values.Where(x => x.Parent == null); } public IPublishedContent GetSingleByXPath(UmbracoContext umbracoContext, bool preview, string xpath, Core.Xml.XPathVariable[] vars) { throw new NotImplementedException(); } public IPublishedContent GetSingleByXPath(UmbracoContext umbracoContext, bool preview, System.Xml.XPath.XPathExpression xpath, Core.Xml.XPathVariable[] vars) { throw new NotImplementedException(); } public IEnumerable GetByXPath(UmbracoContext umbracoContext, bool preview, string xpath, Core.Xml.XPathVariable[] vars) { throw new NotImplementedException(); } public IEnumerable GetByXPath(UmbracoContext umbracoContext, bool preview, System.Xml.XPath.XPathExpression xpath, Core.Xml.XPathVariable[] vars) { throw new NotImplementedException(); } public System.Xml.XPath.XPathNavigator GetXPathNavigator(UmbracoContext umbracoContext, bool preview) { throw new NotImplementedException(); } public bool XPathNavigatorIsNavigable { get { throw new NotImplementedException(); } } public bool HasContent(UmbracoContext umbracoContext, bool preview) { return _content.Count > 0; } public IPublishedProperty CreateDetachedProperty(PublishedPropertyType propertyType, object value, bool isPreviewing) { throw new NotImplementedException(); } } class SolidPublishedContent : IPublishedContent { #region Constructor public SolidPublishedContent(PublishedContentType contentType) { // initialize boring stuff TemplateId = 0; WriterName = CreatorName = string.Empty; WriterId = CreatorId = 0; CreateDate = UpdateDate = DateTime.Now; Version = Guid.Empty; IsDraft = false; ContentType = contentType; DocumentTypeAlias = contentType.Alias; DocumentTypeId = contentType.Id; } #endregion #region Content public int Id { get; set; } public int TemplateId { get; set; } public int SortOrder { get; set; } public string Name { get; set; } public string UrlName { get; set; } public string DocumentTypeAlias { get; private set; } public int DocumentTypeId { get; private set; } public string WriterName { get; set; } public string CreatorName { get; set; } public int WriterId { get; set; } public int CreatorId { get; set; } public string Path { get; set; } public DateTime CreateDate { get; set; } public DateTime UpdateDate { get; set; } public Guid Version { get; set; } public int Level { get; set; } public string Url { get; set; } public PublishedItemType ItemType { get { return PublishedItemType.Content; } } public bool IsDraft { get; set; } public int GetIndex() { var index = this.Siblings().FindIndex(x => x.Id == Id); if (index < 0) throw new IndexOutOfRangeException("Failed to find content in its siblings collection?!"); return index; } #endregion #region Tree public int ParentId { get; set; } public IEnumerable ChildIds { get; set; } public IPublishedContent Parent { get { return UmbracoContext.Current.ContentCache.GetById(ParentId); } } public IEnumerable Children { get { return ChildIds.Select(id => UmbracoContext.Current.ContentCache.GetById(id)); } } #endregion #region ContentSet public IEnumerable ContentSet { get { return this.Siblings(); } } #endregion #region ContentType public PublishedContentType ContentType { get; private set; } #endregion #region Properties public ICollection Properties { get; set; } public IPublishedProperty GetProperty(string alias) { return Properties.FirstOrDefault(p => p.PropertyTypeAlias.InvariantEquals(alias)); } public IPublishedProperty GetProperty(string alias, bool recurse) { var property = GetProperty(alias); if (recurse == false) return property; IPublishedContent content = this; while (content != null && (property == null || property.HasValue == false)) { content = content.Parent; property = content == null ? null : content.GetProperty(alias); } return property; } public object this[string alias] { get { var property = GetProperty(alias); return property == null || property.HasValue == false ? null : property.Value; } } #endregion } class SolidPublishedProperty : IPublishedProperty { public SolidPublishedProperty() { // initialize boring stuff } public string PropertyTypeAlias { get; set; } public object DataValue { get; set; } public object Value { get; set; } public bool HasValue { get; set; } public object XPathValue { get; set; } } [PublishedContentModel("ContentType2")] internal class ContentType2 : PublishedContentModel { #region Plumbing public ContentType2(IPublishedContent content) : base(content) { } #endregion // fast, if you know that the appropriate IPropertyEditorValueConverter is wired public int Prop1 { get { return (int)this["prop1"]; } } // almost as fast, not sure I like it as much, though //public int Prop1 { get { return this.GetPropertyValue("prop1"); } } } [PublishedContentModel("ContentType2Sub")] internal class ContentType2Sub : ContentType2 { #region Plumbing public ContentType2Sub(IPublishedContent content) : base(content) { } #endregion } class PublishedContentStrong1 : PublishedContentExtended { public PublishedContentStrong1(IPublishedContent content) : base(content) { } public int StrongValue { get { return (int)this["strongValue"]; } } } class PublishedContentStrong1Sub : PublishedContentStrong1 { public PublishedContentStrong1Sub(IPublishedContent content) : base(content) { } public int AnotherValue { get { return (int)this["anotherValue"]; } } } class PublishedContentStrong2 : PublishedContentExtended { public PublishedContentStrong2(IPublishedContent content) : base(content) { } public int StrongValue { get { return (int)this["strongValue"]; } } } class AutoPublishedContentType : PublishedContentType { private static readonly PublishedPropertyType Default = new PublishedPropertyType("*", 0, "?"); public AutoPublishedContentType(int id, string alias, IEnumerable propertyTypes) : base(id, alias, propertyTypes) { } public override PublishedPropertyType GetPropertyType(string alias) { var propertyType = base.GetPropertyType(alias); return propertyType ?? Default; } } }