diff --git a/src/Umbraco.Core/CodeAnnotations/UmbracoUdiTypeAttribute.cs b/src/Umbraco.Core/CodeAnnotations/UmbracoUdiTypeAttribute.cs
new file mode 100644
index 0000000000..0bb9de6c86
--- /dev/null
+++ b/src/Umbraco.Core/CodeAnnotations/UmbracoUdiTypeAttribute.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace Umbraco.Core.CodeAnnotations
+{
+ [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
+ internal class UmbracoUdiTypeAttribute : Attribute
+ {
+ public string UdiType { get; private set; }
+
+ public UmbracoUdiTypeAttribute(string udiType)
+ {
+ UdiType = udiType;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs
index 02dc44c4ce..162c66e174 100644
--- a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs
+++ b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs
@@ -26,7 +26,7 @@ namespace Umbraco.Core.Models
///
/// Root
///
- [UmbracoObjectType(Constants.ObjectTypes.SystemRoot)]
+ [UmbracoObjectType(Constants.ObjectTypes.SystemRoot)]
[FriendlyName("Root")]
ROOT,
@@ -35,6 +35,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.Document, typeof(IContent))]
[FriendlyName("Document")]
+ [UmbracoUdiType(Constants.UdiEntityType.Document)]
Document,
///
@@ -42,6 +43,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.Media, typeof(IMedia))]
[FriendlyName("Media")]
+ [UmbracoUdiType(Constants.UdiEntityType.Media)]
Media,
///
@@ -49,6 +51,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.MemberType, typeof(IMemberType))]
[FriendlyName("Member Type")]
+ [UmbracoUdiType(Constants.UdiEntityType.MemberType)]
MemberType,
///
@@ -56,6 +59,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.Template, typeof(ITemplate))]
[FriendlyName("Template")]
+ [UmbracoUdiType(Constants.UdiEntityType.Template)]
Template,
///
@@ -63,6 +67,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.MemberGroup)]
[FriendlyName("Member Group")]
+ [UmbracoUdiType(Constants.UdiEntityType.MemberGroup)]
MemberGroup,
//TODO: What is a 'Content Item' supposed to be???
@@ -80,6 +85,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.MediaType, typeof(IMediaType))]
[FriendlyName("Media Type")]
+ [UmbracoUdiType(Constants.UdiEntityType.MediaType)]
MediaType,
///
@@ -87,13 +93,14 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.DocumentType, typeof(IContentType))]
[FriendlyName("Document Type")]
+ [UmbracoUdiType(Constants.UdiEntityType.DocumentType)]
DocumentType,
///
/// Recycle Bin
///
[UmbracoObjectType(Constants.ObjectTypes.ContentRecycleBin)]
- [FriendlyName("Recycle Bin")]
+ [FriendlyName("Recycle Bin")]
RecycleBin,
///
@@ -101,6 +108,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.Stylesheet)]
[FriendlyName("Stylesheet")]
+ [UmbracoUdiType(Constants.UdiEntityType.Stylesheet)]
Stylesheet,
///
@@ -108,6 +116,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.Member, typeof(IMember))]
[FriendlyName("Member")]
+ [UmbracoUdiType(Constants.UdiEntityType.Member)]
Member,
///
@@ -115,6 +124,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.DataType, typeof(IDataTypeDefinition))]
[FriendlyName("Data Type")]
+ [UmbracoUdiType(Constants.UdiEntityType.DataType)]
DataType,
///
@@ -122,6 +132,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.DocumentTypeContainer)]
[FriendlyName("Document Type Container")]
+ [UmbracoUdiType(Constants.UdiEntityType.DocumentTypeContainer)]
DocumentTypeContainer,
///
@@ -129,6 +140,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.MediaTypeContainer)]
[FriendlyName("Media Type Container")]
+ [UmbracoUdiType(Constants.UdiEntityType.MediaTypeContainer)]
MediaTypeContainer,
///
@@ -136,6 +148,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.DataTypeContainer)]
[FriendlyName("Data Type Container")]
+ [UmbracoUdiType(Constants.UdiEntityType.DataTypeContainer)]
DataTypeContainer,
///
@@ -143,6 +156,7 @@ namespace Umbraco.Core.Models
///
[UmbracoObjectType(Constants.ObjectTypes.RelationType)]
[FriendlyName("Relation Type")]
+ [UmbracoUdiType(Constants.UdiEntityType.RelationType)]
RelationType
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs b/src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs
index 34ee29b96f..5f92e6425e 100644
--- a/src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs
+++ b/src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs
@@ -12,6 +12,7 @@ namespace Umbraco.Core.Models
{
//MUST be concurrent to avoid thread collisions!
private static readonly ConcurrentDictionary UmbracoObjectTypeCache = new ConcurrentDictionary();
+ private static readonly ConcurrentDictionary UmbracoObjectTypeUdiCache = new ConcurrentDictionary();
///
/// Get an UmbracoObjectTypes value from it's name
@@ -43,6 +44,21 @@ namespace Umbraco.Core.Models
return umbracoObjectType;
}
+ public static string GetUdiType(Guid guid)
+ {
+ var umbracoObjectType = Constants.UdiEntityType.Unknown;
+
+ foreach (var name in Enum.GetNames(typeof(UmbracoObjectTypes)))
+ {
+ var objType = GetUmbracoObjectType(name);
+ if (objType.GetGuid() == guid)
+ {
+ umbracoObjectType = GetUdiType(objType);
+ }
+ }
+ return umbracoObjectType;
+ }
+
///
/// Extension method for the UmbracoObjectTypes enum to return the enum GUID
///
@@ -68,6 +84,26 @@ namespace Umbraco.Core.Models
});
}
+ public static string GetUdiType(this UmbracoObjectTypes umbracoObjectType)
+ {
+ return UmbracoObjectTypeUdiCache.GetOrAdd(umbracoObjectType, types =>
+ {
+ var type = typeof(UmbracoObjectTypes);
+ var memInfo = type.GetMember(umbracoObjectType.ToString());
+ var attributes = memInfo[0].GetCustomAttributes(typeof(UmbracoUdiTypeAttribute),
+ false);
+
+ if (attributes.Length == 0)
+ return Constants.UdiEntityType.Unknown;
+
+ var attribute = ((UmbracoUdiTypeAttribute)attributes[0]);
+ if (attribute == null)
+ return Constants.UdiEntityType.Unknown;
+
+ return attribute.UdiType;
+ });
+ }
+
///
/// Extension method for the UmbracoObjectTypes enum to return the enum name
///
diff --git a/src/Umbraco.Core/Udi.cs b/src/Umbraco.Core/Udi.cs
index a7298c6f89..ae43bbf270 100644
--- a/src/Umbraco.Core/Udi.cs
+++ b/src/Umbraco.Core/Udi.cs
@@ -40,12 +40,12 @@ namespace Umbraco.Core
static Udi()
{
// for tests etc.
- UdiTypes[Constants.DeployEntityType.AnyGuid] = UdiType.GuidUdi;
- UdiTypes[Constants.DeployEntityType.AnyString] = UdiType.StringUdi;
+ UdiTypes[Constants.UdiEntityType.AnyGuid] = UdiType.GuidUdi;
+ UdiTypes[Constants.UdiEntityType.AnyString] = UdiType.StringUdi;
// we don't have connectors for these...
- UdiTypes[Constants.DeployEntityType.Member] = UdiType.GuidUdi;
- UdiTypes[Constants.DeployEntityType.MemberGroup] = UdiType.GuidUdi;
+ UdiTypes[Constants.UdiEntityType.Member] = UdiType.GuidUdi;
+ UdiTypes[Constants.UdiEntityType.MemberGroup] = UdiType.GuidUdi;
// fixme - or inject from...?
// there is no way we can get the "registered" service connectors, as registration
diff --git a/src/Umbraco.Core/Constants-DeployEntityType.cs b/src/Umbraco.Core/UdiEntityType.cs
similarity index 98%
rename from src/Umbraco.Core/Constants-DeployEntityType.cs
rename to src/Umbraco.Core/UdiEntityType.cs
index f622661dff..4e43cb06c5 100644
--- a/src/Umbraco.Core/Constants-DeployEntityType.cs
+++ b/src/Umbraco.Core/UdiEntityType.cs
@@ -13,11 +13,14 @@ namespace Umbraco.Core
///
/// Well-known entity types are those that Deploy already knows about,
/// but entity types are strings and so can be extended beyond what is defined here.
- public static class DeployEntityType
+ public static class UdiEntityType
{
+ public const string Unknown = "unknown";
+
// guid entity types
public const string AnyGuid = "any-guid"; // that one is for tests
+
public const string Document = "document";
public const string Media = "media";
diff --git a/src/Umbraco.Core/UdiGetterExtensions.cs b/src/Umbraco.Core/UdiGetterExtensions.cs
index 1bd018a754..8acaab6512 100644
--- a/src/Umbraco.Core/UdiGetterExtensions.cs
+++ b/src/Umbraco.Core/UdiGetterExtensions.cs
@@ -17,7 +17,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this ITemplate entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.Template, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.Template, entity.Key).EnsureClosed();
}
///
@@ -28,7 +28,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IContentType entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.DocumentType, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.DocumentType, entity.Key).EnsureClosed();
}
///
@@ -39,7 +39,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IMediaType entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.MediaType, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.MediaType, entity.Key).EnsureClosed();
}
///
@@ -50,7 +50,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IMemberType entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.MemberType, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.MemberType, entity.Key).EnsureClosed();
}
///
@@ -61,7 +61,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IMemberGroup entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.MemberGroup, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.MemberGroup, entity.Key).EnsureClosed();
}
///
@@ -74,9 +74,9 @@ namespace Umbraco.Core
if (entity == null) throw new ArgumentNullException("entity");
string type;
- if (entity is IContentType) type = Constants.DeployEntityType.DocumentType;
- else if (entity is IMediaType) type = Constants.DeployEntityType.MediaType;
- else if (entity is IMemberType) type = Constants.DeployEntityType.MemberType;
+ if (entity is IContentType) type = Constants.UdiEntityType.DocumentType;
+ else if (entity is IMediaType) type = Constants.UdiEntityType.MediaType;
+ else if (entity is IMemberType) type = Constants.UdiEntityType.MemberType;
else throw new NotSupportedException(string.Format("Composition type {0} is not supported.", entity.GetType().FullName));
return new GuidUdi(type, entity.Key).EnsureClosed();
}
@@ -89,7 +89,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IDataTypeDefinition entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.DataType, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.DataType, entity.Key).EnsureClosed();
}
///
@@ -103,11 +103,11 @@ namespace Umbraco.Core
string entityType;
if (entity.ContainedObjectType == Constants.ObjectTypes.DataTypeGuid)
- entityType = Constants.DeployEntityType.DataTypeContainer;
+ entityType = Constants.UdiEntityType.DataTypeContainer;
else if (entity.ContainedObjectType == Constants.ObjectTypes.DocumentTypeGuid)
- entityType = Constants.DeployEntityType.DocumentTypeContainer;
+ entityType = Constants.UdiEntityType.DocumentTypeContainer;
else if (entity.ContainedObjectType == Constants.ObjectTypes.MediaTypeGuid)
- entityType = Constants.DeployEntityType.MediaTypeContainer;
+ entityType = Constants.UdiEntityType.MediaTypeContainer;
else
throw new NotSupportedException(string.Format("Contained object type {0} is not supported.", entity.ContainedObjectType));
return new GuidUdi(entityType, entity.Key).EnsureClosed();
@@ -121,7 +121,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IMedia entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.Media, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.Media, entity.Key).EnsureClosed();
}
///
@@ -132,7 +132,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IContent entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.Document, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.Document, entity.Key).EnsureClosed();
}
///
@@ -143,7 +143,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IMember entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.Member, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.Member, entity.Key).EnsureClosed();
}
///
@@ -154,7 +154,7 @@ namespace Umbraco.Core
public static StringUdi GetUdi(this Stylesheet entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new StringUdi(Constants.DeployEntityType.Stylesheet, entity.Path.TrimStart('/')).EnsureClosed();
+ return new StringUdi(Constants.UdiEntityType.Stylesheet, entity.Path.TrimStart('/')).EnsureClosed();
}
///
@@ -165,7 +165,7 @@ namespace Umbraco.Core
public static StringUdi GetUdi(this Script entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new StringUdi(Constants.DeployEntityType.Script, entity.Path.TrimStart('/')).EnsureClosed();
+ return new StringUdi(Constants.UdiEntityType.Script, entity.Path.TrimStart('/')).EnsureClosed();
}
///
@@ -176,7 +176,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IDictionaryItem entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.DictionaryItem, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.DictionaryItem, entity.Key).EnsureClosed();
}
///
@@ -187,7 +187,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IMacro entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.Macro, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.Macro, entity.Key).EnsureClosed();
}
///
@@ -198,7 +198,7 @@ namespace Umbraco.Core
public static StringUdi GetUdi(this IPartialView entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new StringUdi(Constants.DeployEntityType.PartialView, entity.Path.TrimStart('/')).EnsureClosed();
+ return new StringUdi(Constants.UdiEntityType.PartialView, entity.Path.TrimStart('/')).EnsureClosed();
}
///
@@ -209,7 +209,7 @@ namespace Umbraco.Core
public static StringUdi GetUdi(this IXsltFile entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new StringUdi(Constants.DeployEntityType.Xslt, entity.Path.TrimStart('/')).EnsureClosed();
+ return new StringUdi(Constants.UdiEntityType.Xslt, entity.Path.TrimStart('/')).EnsureClosed();
}
///
@@ -222,9 +222,9 @@ namespace Umbraco.Core
if (entity == null) throw new ArgumentNullException("entity");
string type;
- if (entity is IContent) type = Constants.DeployEntityType.Document;
- else if (entity is IMedia) type = Constants.DeployEntityType.Media;
- else if (entity is IMember) type = Constants.DeployEntityType.Member;
+ if (entity is IContent) type = Constants.UdiEntityType.Document;
+ else if (entity is IMedia) type = Constants.UdiEntityType.Media;
+ else if (entity is IMember) type = Constants.UdiEntityType.Member;
else throw new NotSupportedException(string.Format("ContentBase type {0} is not supported.", entity.GetType().FullName));
return new GuidUdi(type, entity.Key).EnsureClosed();
}
@@ -237,7 +237,7 @@ namespace Umbraco.Core
public static GuidUdi GetUdi(this IRelationType entity)
{
if (entity == null) throw new ArgumentNullException("entity");
- return new GuidUdi(Constants.DeployEntityType.RelationType, entity.Key).EnsureClosed();
+ return new GuidUdi(Constants.UdiEntityType.RelationType, entity.Key).EnsureClosed();
}
///
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 3a53f273f4..05854890f7 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -164,6 +164,7 @@
+
@@ -290,7 +291,6 @@
-
@@ -1406,6 +1406,7 @@
+
diff --git a/src/Umbraco.Tests/UdiTests.cs b/src/Umbraco.Tests/UdiTests.cs
index 36242bab13..9b803d5fa3 100644
--- a/src/Umbraco.Tests/UdiTests.cs
+++ b/src/Umbraco.Tests/UdiTests.cs
@@ -13,41 +13,41 @@ namespace Umbraco.Tests
[Test]
public void StringEntityCtorTest()
{
- var udi = new StringUdi(Constants.DeployEntityType.AnyString, "test-id");
- Assert.AreEqual(Constants.DeployEntityType.AnyString, udi.EntityType);
+ var udi = new StringUdi(Constants.UdiEntityType.AnyString, "test-id");
+ Assert.AreEqual(Constants.UdiEntityType.AnyString, udi.EntityType);
Assert.AreEqual("test-id", udi.Id);
- Assert.AreEqual("umb://" + Constants.DeployEntityType.AnyString + "/test-id", udi.ToString());
+ Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/test-id", udi.ToString());
}
[Test]
public void StringEntityParseTest()
{
- var udi = Udi.Parse("umb://" + Constants.DeployEntityType.AnyString + "/test-id");
- Assert.AreEqual(Constants.DeployEntityType.AnyString, udi.EntityType);
+ var udi = Udi.Parse("umb://" + Constants.UdiEntityType.AnyString + "/test-id");
+ Assert.AreEqual(Constants.UdiEntityType.AnyString, udi.EntityType);
Assert.IsInstanceOf(udi);
var stringEntityId = udi as StringUdi;
Assert.IsNotNull(stringEntityId);
Assert.AreEqual("test-id", stringEntityId.Id);
- Assert.AreEqual("umb://" + Constants.DeployEntityType.AnyString + "/test-id", udi.ToString());
+ Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/test-id", udi.ToString());
}
[Test]
public void GuidEntityCtorTest()
{
var guid = Guid.NewGuid();
- var udi = new GuidUdi(Constants.DeployEntityType.AnyGuid, guid);
- Assert.AreEqual(Constants.DeployEntityType.AnyGuid, udi.EntityType);
+ var udi = new GuidUdi(Constants.UdiEntityType.AnyGuid, guid);
+ Assert.AreEqual(Constants.UdiEntityType.AnyGuid, udi.EntityType);
Assert.AreEqual(guid, udi.Guid);
- Assert.AreEqual("umb://" + Constants.DeployEntityType.AnyGuid + "/" + guid.ToString("N"), udi.ToString());
+ Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyGuid + "/" + guid.ToString("N"), udi.ToString());
}
[Test]
public void GuidEntityParseTest()
{
var guid = Guid.NewGuid();
- var s = "umb://" + Constants.DeployEntityType.AnyGuid + "/" + guid.ToString("N");
+ var s = "umb://" + Constants.UdiEntityType.AnyGuid + "/" + guid.ToString("N");
var udi = Udi.Parse(s);
- Assert.AreEqual(Constants.DeployEntityType.AnyGuid, udi.EntityType);
+ Assert.AreEqual(Constants.UdiEntityType.AnyGuid, udi.EntityType);
Assert.IsInstanceOf(udi);
var gudi = udi as GuidUdi;
Assert.IsNotNull(gudi);
@@ -82,9 +82,9 @@ namespace Umbraco.Tests
var guid1 = Guid.NewGuid();
var entities = new[]
{
- new GuidUdi(Constants.DeployEntityType.AnyGuid, guid1),
- new GuidUdi(Constants.DeployEntityType.AnyGuid, guid1),
- new GuidUdi(Constants.DeployEntityType.AnyGuid, guid1),
+ new GuidUdi(Constants.UdiEntityType.AnyGuid, guid1),
+ new GuidUdi(Constants.UdiEntityType.AnyGuid, guid1),
+ new GuidUdi(Constants.UdiEntityType.AnyGuid, guid1),
};
Assert.AreEqual(1, entities.Distinct().Count());
}
@@ -93,12 +93,12 @@ namespace Umbraco.Tests
public void CreateTest()
{
var guid = Guid.NewGuid();
- var udi = Udi.Create(Constants.DeployEntityType.AnyGuid, guid);
- Assert.AreEqual(Constants.DeployEntityType.AnyGuid, udi.EntityType);
+ var udi = Udi.Create(Constants.UdiEntityType.AnyGuid, guid);
+ Assert.AreEqual(Constants.UdiEntityType.AnyGuid, udi.EntityType);
Assert.AreEqual(guid, ((GuidUdi)udi).Guid);
- Assert.Throws(() => Udi.Create(Constants.DeployEntityType.AnyString, guid));
- Assert.Throws(() => Udi.Create(Constants.DeployEntityType.AnyGuid, "foo"));
+ Assert.Throws(() => Udi.Create(Constants.UdiEntityType.AnyString, guid));
+ Assert.Throws(() => Udi.Create(Constants.UdiEntityType.AnyGuid, "foo"));
Assert.Throws(() => Udi.Create("barf", "foo"));
}
@@ -106,13 +106,13 @@ namespace Umbraco.Tests
public void RangeTest()
{
// can parse open string udi
- var stringUdiString = "umb://" + Constants.DeployEntityType.AnyString;
+ var stringUdiString = "umb://" + Constants.UdiEntityType.AnyString;
Udi stringUdi;
Assert.IsTrue(Udi.TryParse(stringUdiString, out stringUdi));
Assert.AreEqual(string.Empty, ((StringUdi)stringUdi).Id);
// can parse open guid udi
- var guidUdiString = "umb://" + Constants.DeployEntityType.AnyGuid;
+ var guidUdiString = "umb://" + Constants.UdiEntityType.AnyGuid;
Udi guidUdi;
Assert.IsTrue(Udi.TryParse(guidUdiString, out guidUdi));
Assert.AreEqual(Guid.Empty, ((GuidUdi)guidUdi).Guid);
@@ -134,12 +134,12 @@ namespace Umbraco.Tests
var guid = Guid.NewGuid();
- var udi = new GuidUdi(Constants.DeployEntityType.AnyGuid, guid);
+ var udi = new GuidUdi(Constants.UdiEntityType.AnyGuid, guid);
var json = JsonConvert.SerializeObject(udi, settings);
Assert.AreEqual(string.Format("\"umb://any-guid/{0:N}\"", guid), json);
var dudi = JsonConvert.DeserializeObject(json, settings);
- Assert.AreEqual(Constants.DeployEntityType.AnyGuid, dudi.EntityType);
+ Assert.AreEqual(Constants.UdiEntityType.AnyGuid, dudi.EntityType);
Assert.AreEqual(guid, ((GuidUdi)dudi).Guid);
var range = new UdiRange(udi, Constants.DeploySelector.ChildrenOfThis);
diff --git a/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs b/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs
index 40d884d653..b17b876e76 100644
--- a/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs
+++ b/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs
@@ -6,6 +6,7 @@ using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
+using Umbraco.Core;
using Umbraco.Core.Models.Validation;
namespace Umbraco.Web.Models.ContentEditing
@@ -25,7 +26,11 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "id", IsRequired = true)]
[Required]
public object Id { get; set; }
-
+
+ [DataMember(Name = "udi")]
+ [ReadOnly(true)]
+ public Udi Udi { get; set; }
+
[DataMember(Name = "icon")]
public string Icon { get; set; }
diff --git a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
index 27f34a12e6..afed4bfb20 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
@@ -28,6 +28,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IContent TO ContentItemDisplay
config.CreateMap()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Document, content.Key)))
.ForMember(display => display.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(display => display.Updater, expression => expression.ResolveUsing(new CreatorResolver()))
.ForMember(display => display.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
@@ -58,6 +59,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IContent TO ContentItemBasic
config.CreateMap>()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Document, content.Key)))
.ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(dto => dto.Updater, expression => expression.ResolveUsing(new CreatorResolver()))
.ForMember(dto => dto.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
@@ -68,6 +70,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IContent TO ContentItemDto
config.CreateMap>()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Document, content.Key)))
.ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(dto => dto.HasPublishedVersion, expression => expression.MapFrom(content => content.HasPublishedVersion))
.ForMember(dto => dto.Updater, expression => expression.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs
index bf0ec1f457..de5b5a14fd 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs
@@ -161,9 +161,12 @@ namespace Umbraco.Web.Models.Mapping
});
- config.CreateMap();
- config.CreateMap();
- config.CreateMap();
+ config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.MemberType, content.Key)));
+ config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.MediaType, content.Key)));
+ config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.DocumentType, content.Key)));
config.CreateMap()
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapperExtensions.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapperExtensions.cs
index 52f2dbad4b..cd42c87a56 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapperExtensions.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapperExtensions.cs
@@ -126,6 +126,7 @@ namespace Umbraco.Web.Models.Mapping
where TPropertyTypeDisplay : PropertyTypeDisplay, new()
{
return mapping
+ .ForMember(x => x.Udi, expression => expression.ResolveUsing(new ContentTypeUdiResolver()))
.ForMember(display => display.Notifications, expression => expression.Ignore())
.ForMember(display => display.Errors, expression => expression.Ignore())
.ForMember(display => display.AllowAsRoot, expression => expression.MapFrom(type => type.AllowedAsRoot))
diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeUdiResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeUdiResolver.cs
new file mode 100644
index 0000000000..142ff43a99
--- /dev/null
+++ b/src/Umbraco.Web/Models/Mapping/ContentTypeUdiResolver.cs
@@ -0,0 +1,21 @@
+using AutoMapper;
+using Umbraco.Core;
+using Umbraco.Core.Models;
+
+namespace Umbraco.Web.Models.Mapping
+{
+ ///
+ /// Resolves a UDI for a content type based on it's type
+ ///
+ internal class ContentTypeUdiResolver : ValueResolver
+ {
+ protected override Udi ResolveCore(IContentTypeComposition source)
+ {
+ return Udi.Create(
+ source.GetType() == typeof(IMemberType)
+ ? Constants.UdiEntityType.MemberType
+ : source.GetType() == typeof(IMediaType)
+ ? Constants.UdiEntityType.MediaType : Constants.UdiEntityType.DocumentType, source.Key);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs
index d7dfdbf9d0..e78aeaf6a3 100644
--- a/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs
@@ -35,6 +35,7 @@ namespace Umbraco.Web.Models.Mapping
};
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.Ignore())
.ForMember(x => x.HasPrevalues, expression => expression.Ignore())
.ForMember(x => x.IsSystemDataType, expression => expression.Ignore())
.ForMember(x => x.Id, expression => expression.Ignore())
@@ -45,6 +46,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(x => x.AdditionalData, expression => expression.Ignore());
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.DataType, content.Key)))
.ForMember(x => x.HasPrevalues, expression => expression.Ignore())
.ForMember(x => x.Icon, expression => expression.Ignore())
.ForMember(x => x.Alias, expression => expression.Ignore())
@@ -62,6 +64,7 @@ namespace Umbraco.Web.Models.Mapping
});
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.DataType, content.Key)))
.ForMember(display => display.AvailableEditors, expression => expression.ResolveUsing(new AvailablePropertyEditorsResolver(UmbracoConfig.For.UmbracoSettings().Content)))
.ForMember(display => display.PreValues, expression => expression.ResolveUsing(
new PreValueDisplayResolver(lazyDataTypeService)))
diff --git a/src/Umbraco.Web/Models/Mapping/EntityModelMapper.cs b/src/Umbraco.Web/Models/Mapping/EntityModelMapper.cs
index 5610a70008..361836e529 100644
--- a/src/Umbraco.Web/Models/Mapping/EntityModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/EntityModelMapper.cs
@@ -17,11 +17,13 @@ namespace Umbraco.Web.Models.Mapping
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(x => Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(x.NodeObjectTypeId), x.Key)))
.ForMember(basic => basic.Icon, expression => expression.MapFrom(entity => entity.ContentTypeIcon))
.ForMember(dto => dto.Trashed, expression => expression.Ignore())
.ForMember(x => x.Alias, expression => expression.Ignore());
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.Ignore())
.ForMember(basic => basic.Icon, expression => expression.UseValue("icon-box"))
.ForMember(basic => basic.Path, expression => expression.UseValue(""))
.ForMember(basic => basic.ParentId, expression => expression.UseValue(-1))
@@ -29,6 +31,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(x => x.AdditionalData, expression => expression.Ignore());
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.Ignore())
.ForMember(basic => basic.Icon, expression => expression.UseValue("icon-tab"))
.ForMember(basic => basic.Path, expression => expression.UseValue(""))
.ForMember(basic => basic.ParentId, expression => expression.UseValue(-1))
@@ -38,6 +41,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(x => x.AdditionalData, expression => expression.Ignore());
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.Ignore())
.ForMember(basic => basic.Icon, expression => expression.UseValue("icon-user"))
.ForMember(basic => basic.Path, expression => expression.UseValue(""))
.ForMember(basic => basic.ParentId, expression => expression.UseValue(-1))
@@ -46,6 +50,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(x => x.AdditionalData, expression => expression.Ignore());
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(x => Udi.Create(Constants.UdiEntityType.Template, x.Key)))
.ForMember(basic => basic.Icon, expression => expression.UseValue("icon-layout"))
.ForMember(basic => basic.Path, expression => expression.MapFrom(template => template.Path))
.ForMember(basic => basic.ParentId, expression => expression.UseValue(-1))
@@ -70,6 +75,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(x => x.SortOrder, expression => expression.Ignore());
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.ResolveUsing(new ContentTypeUdiResolver()))
.ForMember(basic => basic.Path, expression => expression.MapFrom(x => x.Path))
.ForMember(basic => basic.ParentId, expression => expression.MapFrom(x => x.ParentId))
.ForMember(dto => dto.Trashed, expression => expression.Ignore())
@@ -77,6 +83,7 @@ namespace Umbraco.Web.Models.Mapping
config.CreateMap()
//default to document icon
+ .ForMember(x => x.Udi, expression => expression.Ignore())
.ForMember(x => x.Icon, expression => expression.Ignore())
.ForMember(x => x.Id, expression => expression.MapFrom(result => result.Id))
.ForMember(x => x.Name, expression => expression.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs
index 54ebca6e68..3dc86e61c9 100644
--- a/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/MacroModelMapper.cs
@@ -20,6 +20,7 @@ namespace Umbraco.Web.Models.Mapping
{
//FROM IMacro TO EntityBasic
config.CreateMap()
+ .ForMember(x => x.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Macro, content.Key)))
.ForMember(entityBasic => entityBasic.Icon, expression => expression.UseValue("icon-settings-alt"))
.ForMember(dto => dto.ParentId, expression => expression.UseValue(-1))
.ForMember(dto => dto.Path, expression => expression.ResolveUsing(macro => "-1," + macro.Id))
diff --git a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs
index 4bcdf7a158..eddb4a582e 100644
--- a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs
@@ -25,6 +25,7 @@ namespace Umbraco.Web.Models.Mapping
{
//FROM IMedia TO MediaItemDisplay
config.CreateMap()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
.ForMember(display => display.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(display => display.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(display => display.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias))
@@ -45,6 +46,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMedia TO ContentItemBasic
config.CreateMap>()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
.ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(dto => dto.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(dto => dto.Trashed, expression => expression.MapFrom(content => content.Trashed))
@@ -56,6 +58,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMedia TO ContentItemDto
config.CreateMap>()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Media, content.Key)))
.ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(dto => dto.Published, expression => expression.Ignore())
.ForMember(dto => dto.Updater, expression => expression.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
index 0536efd307..3982302906 100644
--- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
@@ -61,6 +61,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMember TO MediaItemDisplay
config.CreateMap()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key)))
.ForMember(display => display.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(display => display.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(display => display.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias))
@@ -84,6 +85,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMember TO MemberBasic
config.CreateMap()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key)))
.ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(dto => dto.Icon, expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(dto => dto.ContentTypeAlias, expression => expression.MapFrom(content => content.ContentType.Alias))
@@ -96,9 +98,10 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dto => dto.HasPublishedVersion, expression => expression.Ignore());
//FROM MembershipUser TO MemberBasic
- config.CreateMap()
+ config.CreateMap()
//we're giving this entity an ID of 0 - we cannot really map it but it needs an id so the system knows it's not a new entity
.ForMember(member => member.Id, expression => expression.MapFrom(user => int.MaxValue))
+ .ForMember(display => display.Udi, expression => expression.Ignore())
.ForMember(member => member.CreateDate, expression => expression.MapFrom(user => user.CreationDate))
.ForMember(member => member.UpdateDate, expression => expression.MapFrom(user => user.LastActivityDate))
.ForMember(member => member.Key, expression => expression.MapFrom(user => user.ProviderUserKey.TryConvertTo().Result.ToString("N")))
@@ -121,6 +124,7 @@ namespace Umbraco.Web.Models.Mapping
//FROM IMember TO ContentItemDto
config.CreateMap>()
+ .ForMember(display => display.Udi, expression => expression.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key)))
.ForMember(dto => dto.Owner, expression => expression.ResolveUsing(new OwnerResolver()))
.ForMember(dto => dto.Published, expression => expression.Ignore())
.ForMember(dto => dto.Updater, expression => expression.Ignore())
diff --git a/src/Umbraco.Web/Models/Mapping/OwnerResolver.cs b/src/Umbraco.Web/Models/Mapping/OwnerResolver.cs
index 5f3697c3d5..067d495591 100644
--- a/src/Umbraco.Web/Models/Mapping/OwnerResolver.cs
+++ b/src/Umbraco.Web/Models/Mapping/OwnerResolver.cs
@@ -1,5 +1,6 @@
using AutoMapper;
using Umbraco.Core.Models;
+using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Membership;
using Umbraco.Web.Models.ContentEditing;
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index e4bb3c9e88..48cb6a455b 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -342,6 +342,7 @@
+