using System; using System.Collections.Generic; using System.Reflection; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models { /// /// Implementation of the for internal use. /// internal class UmbracoEntity : Entity, IUmbracoEntity { private int _creatorId; private int _level; private string _name; private int _parentId; private string _path; private int _sortOrder; private bool _trashed; private bool _hasChildren; private bool _isPublished; private bool _isDraft; private bool _hasPendingChanges; private string _contentTypeAlias; private Guid _nodeObjectTypeId; private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); private static readonly PropertyInfo HasChildrenSelector = ExpressionHelper.GetPropertyInfo(x => x.HasChildren); private static readonly PropertyInfo IsPublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.IsPublished); private static readonly PropertyInfo IsDraftSelector = ExpressionHelper.GetPropertyInfo(x => x.IsDraft); private static readonly PropertyInfo HasPendingChangesSelector = ExpressionHelper.GetPropertyInfo(x => x.HasPendingChanges); private static readonly PropertyInfo ContentTypeAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeAlias); private static readonly PropertyInfo ContentTypeIconSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeIcon); private static readonly PropertyInfo ContentTypeThumbnailSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeThumbnail); private static readonly PropertyInfo NodeObjectTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeObjectTypeId); private string _contentTypeIcon; private string _contentTypeThumbnail; public UmbracoEntity() { AdditionalData = new Dictionary(); } public UmbracoEntity(bool trashed) { AdditionalData = new Dictionary(); Trashed = trashed; } public int CreatorId { get { return _creatorId; } set { SetPropertyValueAndDetectChanges(o => { _creatorId = value; return _creatorId; }, _creatorId, CreatorIdSelector); } } public int Level { get { return _level; } set { SetPropertyValueAndDetectChanges(o => { _level = value; return _level; }, _level, LevelSelector); } } public string Name { get { return _name; } set { SetPropertyValueAndDetectChanges(o => { _name = value; return _name; }, _name, NameSelector); } } public int ParentId { get { return _parentId; } set { SetPropertyValueAndDetectChanges(o => { _parentId = value; return _parentId; }, _parentId, ParentIdSelector); } } public string Path { get { return _path; } set { SetPropertyValueAndDetectChanges(o => { _path = value; return _path; }, _path, PathSelector); } } public int SortOrder { get { return _sortOrder; } set { SetPropertyValueAndDetectChanges(o => { _sortOrder = value; return _sortOrder; }, _sortOrder, SortOrderSelector); } } public bool Trashed { get { return _trashed; } private set { SetPropertyValueAndDetectChanges(o => { _trashed = value; return _trashed; }, _trashed, TrashedSelector); } } public IDictionary AdditionalData { get; private set; } public bool HasChildren { get { return _hasChildren; } set { SetPropertyValueAndDetectChanges(o => { _hasChildren = value; return _hasChildren; }, _hasChildren, HasChildrenSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["HasChildren"] = value; } } public bool IsPublished { get { return _isPublished; } set { SetPropertyValueAndDetectChanges(o => { _isPublished = value; return _isPublished; }, _isPublished, IsPublishedSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["IsPublished"] = value; } } public bool IsDraft { get { return _isDraft; } set { SetPropertyValueAndDetectChanges(o => { _isDraft = value; return _isDraft; }, _isDraft, IsDraftSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["IsDraft"] = value; } } public bool HasPendingChanges { get { return _hasPendingChanges; } set { SetPropertyValueAndDetectChanges(o => { _hasPendingChanges = value; return _hasPendingChanges; }, _hasPendingChanges, HasPendingChangesSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["HasPendingChanges"] = value; } } public string ContentTypeAlias { get { return _contentTypeAlias; } set { SetPropertyValueAndDetectChanges(o => { _contentTypeAlias = value; return _contentTypeAlias; }, _contentTypeAlias, ContentTypeAliasSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["ContentTypeAlias"] = value; } } public string ContentTypeIcon { get { return _contentTypeIcon; } set { SetPropertyValueAndDetectChanges(o => { _contentTypeIcon = value; return _contentTypeIcon; }, _contentTypeIcon, ContentTypeIconSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["ContentTypeIcon"] = value; } } public string ContentTypeThumbnail { get { return _contentTypeThumbnail; } set { SetPropertyValueAndDetectChanges(o => { _contentTypeThumbnail = value; return _contentTypeThumbnail; }, _contentTypeThumbnail, ContentTypeThumbnailSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["ContentTypeThumbnail"] = value; } } public Guid NodeObjectTypeId { get { return _nodeObjectTypeId; } set { SetPropertyValueAndDetectChanges(o => { _nodeObjectTypeId = value; return _nodeObjectTypeId; }, _nodeObjectTypeId, NodeObjectTypeIdSelector); //This is a custom property that is not exposed in IUmbracoEntity so add it to the additional data AdditionalData["NodeObjectTypeId"] = value; } } /// /// Some entities may expose additional data that other's might not, this custom data will be available in this collection /// public IList UmbracoProperties { get; set; } internal class UmbracoProperty { public string PropertyEditorAlias { get; set; } public string Value { get; set; } } } }