using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.Serialization; using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { /// /// Represents a folder for organizing entities such as content types and data types. /// public sealed class EntityContainer : TreeEntityBase, IUmbracoEntity { private readonly Guid _containedObjectType; private static readonly Dictionary ObjectTypeMap = new Dictionary { { Constants.ObjectTypes.DataType, Constants.ObjectTypes.DataTypeContainer }, { Constants.ObjectTypes.DocumentType, Constants.ObjectTypes.DocumentTypeContainer }, { Constants.ObjectTypes.MediaType, Constants.ObjectTypes.MediaTypeContainer } }; /// /// Initializes a new instance of an class. /// public EntityContainer(Guid containedObjectType) { if (ObjectTypeMap.ContainsKey(containedObjectType) == false) throw new ArgumentException("Not a contained object type.", nameof(containedObjectType)); _containedObjectType = containedObjectType; ParentId = -1; Path = "-1"; Level = 0; SortOrder = 0; } /// /// Initializes a new instance of an class. /// public EntityContainer(int id, Guid uniqueId, int parentId, string path, int level, int sortOrder, Guid containedObjectType, string name, int userId) : this(containedObjectType) { Id = id; Key = uniqueId; ParentId = parentId; Name = name; Path = path; Level = level; SortOrder = sortOrder; CreatorId = userId; } /// /// Gets or sets the node object type of the contained objects. /// public Guid ContainedObjectType => _containedObjectType; /// /// Gets the node object type of the container objects. /// public Guid ContainerObjectType => ObjectTypeMap[_containedObjectType]; /// /// Gets the container object type corresponding to a contained object type. /// /// The contained object type. /// The object type of containers containing objects of the contained object type. public static Guid GetContainerObjectType(Guid containedObjectType) { if (ObjectTypeMap.ContainsKey(containedObjectType) == false) throw new ArgumentException("Not a contained object type.", nameof(containedObjectType)); return ObjectTypeMap[containedObjectType]; } /// /// Gets the contained object type corresponding to a container object type. /// /// The container object type. /// The object type of objects that containers of the container object type can contain. public static Guid GetContainedObjectType(Guid containerObjectType) { var contained = ObjectTypeMap.FirstOrDefault(x => x.Value == containerObjectType).Key; if (contained == null) throw new ArgumentException("Not a container object type.", nameof(containerObjectType)); return contained; } } }