diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs
index 69e0f7c68e..d6c4003fcf 100644
--- a/src/Umbraco.Core/Constants-Conventions.cs
+++ b/src/Umbraco.Core/Constants-Conventions.cs
@@ -4,18 +4,6 @@ using Umbraco.Core.Models;
namespace Umbraco.Core
{
- ///
- /// Contains the valid selector values.
- ///
- internal static class DeploySelector
- {
- public const string This = "this";
- public const string ThisAndChildren = "this-and-children";
- public const string ThisAndDescendants = "this-and-descendants";
- public const string ChildrenOfThis = "children";
- public const string DescendantsOfThis = "descendants";
- }
-
///
/// Defines well-known entity types.
///
diff --git a/src/Umbraco.Core/Constants-DatabaseProviders.cs b/src/Umbraco.Core/Constants-DatabaseProviders.cs
new file mode 100644
index 0000000000..2a64ade081
--- /dev/null
+++ b/src/Umbraco.Core/Constants-DatabaseProviders.cs
@@ -0,0 +1,12 @@
+namespace Umbraco.Core
+{
+ public static partial class Constants
+ {
+ public static class DatabaseProviders
+ {
+ public const string SqlCe = "System.Data.SqlServerCe.4.0";
+ public const string SqlServer = "System.Data.SqlClient";
+ public const string MySql = "MySql.Data.MySqlClient";
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Constants-DeployEntityType.cs b/src/Umbraco.Core/Constants-DeployEntityType.cs
new file mode 100644
index 0000000000..2c0ea81be3
--- /dev/null
+++ b/src/Umbraco.Core/Constants-DeployEntityType.cs
@@ -0,0 +1,129 @@
+using System;
+using System.Collections.Generic;
+using Umbraco.Core.Models;
+
+namespace Umbraco.Core
+{
+
+ public static partial class Constants
+ {
+
+ ///
+ /// Defines well-known entity types.
+ ///
+ /// 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.
+ internal static class DeployEntityType
+ {
+ // guid entity types
+
+ public const string AnyGuid = "any-guid"; // that one is for tests
+
+ public const string Document = "document";
+ public const string Media = "media";
+ public const string Member = "member";
+
+ public const string DictionaryItem = "dictionary-item";
+ public const string Macro = "macro";
+ public const string Template = "template";
+
+ public const string DocumentType = "document-type";
+ public const string DocumentTypeContainer = "document-type-container";
+ public const string MediaType = "media-type";
+ public const string MediaTypeContainer = "media-type-container";
+ public const string DataType = "data-type";
+ public const string DataTypeContainer = "data-type-container";
+ public const string MemberType = "member-type";
+ public const string MemberGroup = "member-group";
+
+ public const string RelationType = "relation-type";
+
+ // string entity types
+
+ public const string AnyString = "any-string"; // that one is for tests
+
+ public const string MediaFile = "media-file";
+ public const string TemplateFile = "template-file";
+ public const string Script = "script";
+ public const string Stylesheet = "stylesheet";
+ public const string PartialView = "partial-view";
+ public const string PartialViewMacro = "partial-view-macro";
+ public const string Xslt = "xslt";
+
+ public static string FromUmbracoObjectType(UmbracoObjectTypes umbracoObjectType)
+ {
+ switch (umbracoObjectType)
+ {
+ case UmbracoObjectTypes.Document:
+ return Document;
+ case UmbracoObjectTypes.Media:
+ return Media;
+ case UmbracoObjectTypes.Member:
+ return Member;
+ case UmbracoObjectTypes.Template:
+ return Template;
+ case UmbracoObjectTypes.DocumentType:
+ return DocumentType;
+ case UmbracoObjectTypes.DocumentTypeContainer:
+ return DocumentTypeContainer;
+ case UmbracoObjectTypes.MediaType:
+ return MediaType;
+ case UmbracoObjectTypes.MediaTypeContainer:
+ return MediaTypeContainer;
+ case UmbracoObjectTypes.DataType:
+ return DataType;
+ case UmbracoObjectTypes.DataTypeContainer:
+ return DataTypeContainer;
+ case UmbracoObjectTypes.MemberType:
+ return MemberType;
+ case UmbracoObjectTypes.MemberGroup:
+ return MemberGroup;
+ case UmbracoObjectTypes.Stylesheet:
+ return Stylesheet;
+ case UmbracoObjectTypes.RelationType:
+ return RelationType;
+ }
+ throw new NotSupportedException(string.Format("UmbracoObjectType \"{0}\" does not have a matching EntityType.", umbracoObjectType));
+ }
+
+ public static UmbracoObjectTypes ToUmbracoObjectType(string entityType)
+ {
+ switch (entityType)
+ {
+ case Document:
+ return UmbracoObjectTypes.Document;
+ case Media:
+ return UmbracoObjectTypes.Media;
+ case Member:
+ return UmbracoObjectTypes.Member;
+ case Template:
+ return UmbracoObjectTypes.Template;
+ case DocumentType:
+ return UmbracoObjectTypes.DocumentType;
+ case DocumentTypeContainer:
+ return UmbracoObjectTypes.DocumentTypeContainer;
+ case MediaType:
+ return UmbracoObjectTypes.MediaType;
+ case MediaTypeContainer:
+ return UmbracoObjectTypes.MediaTypeContainer;
+ case DataType:
+ return UmbracoObjectTypes.DataType;
+ case DataTypeContainer:
+ return UmbracoObjectTypes.DataTypeContainer;
+ case MemberType:
+ return UmbracoObjectTypes.MemberType;
+ case MemberGroup:
+ return UmbracoObjectTypes.MemberGroup;
+ case Stylesheet:
+ return UmbracoObjectTypes.Stylesheet;
+ case RelationType:
+ return UmbracoObjectTypes.RelationType;
+ }
+ throw new NotSupportedException(
+ string.Format("EntityType \"{0}\" does not have a matching UmbracoObjectType.", entityType));
+ }
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Constants-DeploySelector.cs b/src/Umbraco.Core/Constants-DeploySelector.cs
new file mode 100644
index 0000000000..b2415fb37f
--- /dev/null
+++ b/src/Umbraco.Core/Constants-DeploySelector.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using Umbraco.Core.Models;
+
+namespace Umbraco.Core
+{
+ public static partial class Constants
+ {
+ ///
+ /// Contains the valid selector values.
+ ///
+ internal static class DeploySelector
+ {
+ public const string This = "this";
+ public const string ThisAndChildren = "this-and-children";
+ public const string ThisAndDescendants = "this-and-descendants";
+ public const string ChildrenOfThis = "children";
+ public const string DescendantsOfThis = "descendants";
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Constants-Security.cs b/src/Umbraco.Core/Constants-Security.cs
new file mode 100644
index 0000000000..bd2e1c5acf
--- /dev/null
+++ b/src/Umbraco.Core/Constants-Security.cs
@@ -0,0 +1,33 @@
+using System;
+using System.ComponentModel;
+
+namespace Umbraco.Core
+{
+ public static partial class Constants
+ {
+ public static class Security
+ {
+
+ public const string BackOfficeAuthenticationType = "UmbracoBackOffice";
+ public const string BackOfficeExternalAuthenticationType = "UmbracoExternalCookie";
+ public const string BackOfficeExternalCookieName = "UMB_EXTLOGIN";
+ public const string BackOfficeTokenAuthenticationType = "UmbracoBackOfficeToken";
+ public const string BackOfficeTwoFactorAuthenticationType = "UmbracoTwoFactorCookie";
+
+ ///
+ /// The prefix used for external identity providers for their authentication type
+ ///
+ ///
+ /// By default we don't want to interfere with front-end external providers and their default setup, for back office the
+ /// providers need to be setup differently and each auth type for the back office will be prefixed with this value
+ ///
+ public const string BackOfficeExternalAuthenticationTypePrefix = "Umbraco.";
+
+ public const string StartContentNodeIdClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/startcontentnode";
+ public const string StartMediaNodeIdClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/startmedianode";
+ public const string AllowedApplicationsClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/allowedapp";
+ public const string SessionIdClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/sessionid";
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Constants-System.cs b/src/Umbraco.Core/Constants-System.cs
index d1ac6fbb38..b38417c39b 100644
--- a/src/Umbraco.Core/Constants-System.cs
+++ b/src/Umbraco.Core/Constants-System.cs
@@ -29,12 +29,6 @@
public const string UmbracoConnectionName = "umbracoDbDSN";
public const string UmbracoMigrationName = "Umbraco";
}
-
- public static class DatabaseProviders
- {
- public const string SqlCe = "System.Data.SqlServerCe.4.0";
- public const string SqlServer = "System.Data.SqlClient";
- public const string MySql = "MySql.Data.MySqlClient";
- }
+
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Constants-Web.cs b/src/Umbraco.Core/Constants-Web.cs
index f596820506..67b5698610 100644
--- a/src/Umbraco.Core/Constants-Web.cs
+++ b/src/Umbraco.Core/Constants-Web.cs
@@ -29,30 +29,6 @@ namespace Umbraco.Core
public const string AuthCookieName = "UMB_UCONTEXT";
}
-
- public static class Security
- {
-
- public const string BackOfficeAuthenticationType = "UmbracoBackOffice";
- public const string BackOfficeExternalAuthenticationType = "UmbracoExternalCookie";
- public const string BackOfficeExternalCookieName = "UMB_EXTLOGIN";
- public const string BackOfficeTokenAuthenticationType = "UmbracoBackOfficeToken";
- public const string BackOfficeTwoFactorAuthenticationType = "UmbracoTwoFactorCookie";
-
- ///
- /// The prefix used for external identity providers for their authentication type
- ///
- ///
- /// By default we don't want to interfere with front-end external providers and their default setup, for back office the
- /// providers need to be setup differently and each auth type for the back office will be prefixed with this value
- ///
- public const string BackOfficeExternalAuthenticationTypePrefix = "Umbraco.";
-
- public const string StartContentNodeIdClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/startcontentnode";
- public const string StartMediaNodeIdClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/startmedianode";
- public const string AllowedApplicationsClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/allowedapp";
- public const string SessionIdClaimType = "http://umbraco.org/2015/02/identity/claims/backoffice/sessionid";
-
- }
+
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/ArtifactBase.cs b/src/Umbraco.Core/Deploy/ArtifactBase.cs
new file mode 100644
index 0000000000..4d6bc687cb
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/ArtifactBase.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json;
+
+namespace Umbraco.Core.Deploy
+{
+ ///
+ /// Provides a base class to all artifacts.
+ ///
+ public abstract class ArtifactBase : IArtifact
+ where TUdi : Udi
+ {
+ protected ArtifactBase(TUdi udi, IEnumerable dependencies = null)
+ {
+ if (udi == null)
+ throw new ArgumentNullException("udi");
+ Udi = udi;
+
+ Dependencies = dependencies ?? Enumerable.Empty();
+ _checksum = new Lazy(GetChecksum);
+ }
+
+ private readonly Lazy _checksum;
+
+ protected abstract string GetChecksum();
+
+ #region Abstract implementation of IArtifactSignature
+
+ Udi IArtifactSignature.Udi
+ {
+ get { return Udi; }
+ }
+
+ public TUdi Udi { get; set; }
+
+ [JsonIgnore]
+ public string Checksum
+ {
+ get { return _checksum.Value; }
+ }
+
+ public IEnumerable Dependencies { get; set; }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/ArtifactSignature.cs b/src/Umbraco.Core/Deploy/ArtifactSignature.cs
new file mode 100644
index 0000000000..4bea6a5ce8
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/ArtifactSignature.cs
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Umbraco.Core.Deploy
+{
+ public sealed class ArtifactSignature : IArtifactSignature
+ {
+ public ArtifactSignature(Udi udi, string checksum, IEnumerable dependencies = null)
+ {
+ Udi = udi;
+ Checksum = checksum;
+ Dependencies = dependencies ?? Enumerable.Empty();
+ }
+
+ public Udi Udi { get; private set; }
+
+ public string Checksum { get; private set; }
+
+ public IEnumerable Dependencies { get; private set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/GridValue.cs b/src/Umbraco.Core/Deploy/GridValue.cs
new file mode 100644
index 0000000000..39a38a665c
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/GridValue.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace Umbraco.Core.Deploy
+{
+ public class GridValue
+ {
+ [JsonProperty("name")]
+ public string Name { get; set; }
+
+ [JsonProperty("sections")]
+ public IEnumerable Sections { get; set; }
+
+ public class Section
+ {
+ [JsonProperty("grid")]
+ public string Grid { get; set; }
+
+ [JsonProperty("rows")]
+ public IEnumerable Rows { get; set; }
+ }
+
+ public class Row
+ {
+ [JsonProperty("name")]
+ public string Name { get; set; }
+
+ [JsonProperty("id")]
+ public Guid Id { get; set; }
+
+ [JsonProperty("areas")]
+ public IEnumerable Areas { get; set; }
+
+ [JsonProperty("styles")]
+ public JToken Styles { get; set; }
+
+ [JsonProperty("config")]
+ public JToken Config { get; set; }
+ }
+
+ public class Area
+ {
+ [JsonProperty("grid")]
+ public string Grid { get; set; }
+
+ [JsonProperty("controls")]
+ public IEnumerable Controls { get; set; }
+
+ [JsonProperty("styles")]
+ public JToken Styles { get; set; }
+
+ [JsonProperty("config")]
+ public JToken Config { get; set; }
+ }
+
+ public class Control
+ {
+ [JsonProperty("value")]
+ public JToken Value { get; set; }
+
+ [JsonProperty("editor")]
+ public Editor Editor { get; set; }
+
+ [JsonProperty("styles")]
+ public JToken Styles { get; set; }
+
+ [JsonProperty("config")]
+ public JToken Config { get; set; }
+ }
+
+ public class Editor
+ {
+ [JsonProperty("alias")]
+ public string Alias { get; set; }
+
+ [JsonProperty("view")]
+ public string View { get; set; }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/IGridCellValueConnector.cs b/src/Umbraco.Core/Deploy/IGridCellValueConnector.cs
new file mode 100644
index 0000000000..f95a4e7cf1
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/IGridCellValueConnector.cs
@@ -0,0 +1,41 @@
+using System.Collections.Generic;
+using Umbraco.Core.Models;
+
+namespace Umbraco.Core.Deploy
+{
+ ///
+ /// Defines methods that can convert a grid cell value to / from an environment-agnostic string.
+ ///
+ /// Grid cell values may contain values such as content identifiers, that would be local
+ /// to one environment, and need to be converted in order to be deployed.
+ public interface IGridCellValueConnector
+ {
+ ///
+ /// Gets a value indicating whether the connector supports a specified grid editor alias.
+ ///
+ /// The grid editor alias.
+ /// A value indicating whether the connector supports the grid editor alias.
+ /// Note that can be string.Empty to indicate the "default" connector.
+ bool IsConnector(string alias);
+
+ ///
+ /// Gets the value to be deployed from the control value as a string.
+ ///
+ /// The control containing the value.
+ /// The property where the control is located. Do not modify - only used for context
+ /// The dependencies of the property.
+ /// The grid cell value to be deployed.
+ /// Note that
+ string GetValue(GridValue.Control control, Property property, ICollection dependencies);
+
+ ///
+ /// Allows you to modify the value of a control being deployed.
+ ///
+ /// The control being deployed.
+ /// The property where the is located. Do not modify - only used for context.
+ /// Follows the pattern of the property value connectors (). The SetValue method is used to modify the value of the .
+ /// Note that only the value should be modified - not the .
+ /// The should only be used to assist with context data relevant when setting the value.
+ void SetValue(GridValue.Control control, Property property);
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/IImageSourceParser.cs b/src/Umbraco.Core/Deploy/IImageSourceParser.cs
new file mode 100644
index 0000000000..d8e8d860ac
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/IImageSourceParser.cs
@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+
+namespace Umbraco.Core.Deploy
+{
+ ///
+ /// Provides methods to parse image tag sources in property values.
+ ///
+ public interface IImageSourceParser
+ {
+ ///
+ /// Parses an Umbraco property value and produces an artifact property value.
+ ///
+ /// The property value.
+ /// A list of dependencies.
+ /// The parsed value.
+ /// Turns src="/media/..." into src="umb://media/..." and adds the corresponding udi to the dependencies.
+ string ToArtifact(string value, ICollection dependencies);
+
+ ///
+ /// Parses an artifact property value and produces an Umbraco property value.
+ ///
+ /// The artifact property value.
+ /// The parsed value.
+ /// Turns umb://media/... into /media/....
+ string FromArtifact(string value);
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/ILocalLinkParser.cs b/src/Umbraco.Core/Deploy/ILocalLinkParser.cs
new file mode 100644
index 0000000000..c5906c2060
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/ILocalLinkParser.cs
@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+
+namespace Umbraco.Core.Deploy
+{
+ ///
+ /// Provides methods to parse local link tags in property values.
+ ///
+ public interface ILocalLinkParser
+ {
+ ///
+ /// Parses an Umbraco property value and produces an artifact property value.
+ ///
+ /// The property value.
+ /// A list of dependencies.
+ /// The parsed value.
+ /// Turns {{localLink:1234}} into {{localLink:umb://{type}/{id}}} and adds the corresponding udi to the dependencies.
+ string ToArtifact(string value, ICollection dependencies);
+
+ ///
+ /// Parses an artifact property value and produces an Umbraco property value.
+ ///
+ /// The artifact property value.
+ /// The parsed value.
+ /// Turns {{localLink:umb://{type}/{id}}} into {{localLink:1234}}.
+ string FromArtifact(string value);
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/IMacroParser.cs b/src/Umbraco.Core/Deploy/IMacroParser.cs
new file mode 100644
index 0000000000..9cde8ef8b6
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/IMacroParser.cs
@@ -0,0 +1,32 @@
+using System.Collections.Generic;
+
+namespace Umbraco.Core.Deploy
+{
+ public interface IMacroParser
+ {
+ ///
+ /// Parses an Umbraco property value and produces an artifact property value.
+ ///
+ /// Property value.
+ /// A list of dependencies.
+ /// Parsed value.
+ string ToArtifact(string value, ICollection dependencies);
+
+ ///
+ /// Parses an artifact property value and produces an Umbraco property value.
+ ///
+ /// Artifact property value.
+ /// Parsed value.
+ string FromArtifact(string value);
+
+ ///
+ /// Tries to replace the value of the attribute/parameter with a value containing a converted identifier.
+ ///
+ /// Value to attempt to convert
+ /// Alias of the editor used for the parameter
+ /// Collection to add dependencies to when performing ToArtifact
+ /// Indicates which action is being performed (to or from artifact)
+ /// Value with converted identifiers
+ string ReplaceAttributeValue(string value, string editorAlias, ICollection dependencies, Direction direction);
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/IPreValueConnector.cs b/src/Umbraco.Core/Deploy/IPreValueConnector.cs
new file mode 100644
index 0000000000..4ef898cc74
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/IPreValueConnector.cs
@@ -0,0 +1,32 @@
+using System.Collections.Generic;
+
+namespace Umbraco.Core.Deploy
+{
+ ///
+ /// Defines methods that can convert a preValue to / from an environment-agnostic string.
+ ///
+ /// PreValues may contain values such as content identifiers, that would be local
+ /// to one environment, and need to be converted in order to be deployed.
+ public interface IPreValueConnector
+ {
+ ///
+ /// Gets the property editor aliases that the value converter supports by default.
+ ///
+ IEnumerable PropertyEditorAliases { get; }
+
+ ///
+ /// Gets the environment-agnostic preValues corresponding to environment-specific preValues.
+ ///
+ /// The environment-specific preValues.
+ /// The dependencies.
+ ///
+ IDictionary ConvertToDeploy(IDictionary preValues, ICollection dependencies);
+
+ ///
+ /// Gets the environment-specific preValues corresponding to environment-agnostic preValues.
+ ///
+ /// The environment-agnostic preValues.
+ ///
+ IDictionary ConvertToLocalEnvironment(IDictionary preValues);
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/IPrettyArtifact.cs b/src/Umbraco.Core/Deploy/IPrettyArtifact.cs
new file mode 100644
index 0000000000..38c0ddee4c
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/IPrettyArtifact.cs
@@ -0,0 +1,8 @@
+namespace Umbraco.Core.Deploy
+{
+ public interface IPrettyArtifact
+ {
+ string Name { get; }
+ string Alias { get; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Deploy/IValueConnector.cs b/src/Umbraco.Core/Deploy/IValueConnector.cs
new file mode 100644
index 0000000000..a93e5a05a4
--- /dev/null
+++ b/src/Umbraco.Core/Deploy/IValueConnector.cs
@@ -0,0 +1,35 @@
+using System.Collections.Generic;
+using Umbraco.Core.Models;
+
+namespace Umbraco.Core.Deploy
+{
+ ///
+ /// Defines methods that can convert a property value to / from an environment-agnostic string.
+ ///
+ /// Property values may contain values such as content identifiers, that would be local
+ /// to one environment, and need to be converted in order to be deployed. Connectors also deal
+ /// with serializing to / from string.
+ public interface IValueConnector
+ {
+ ///
+ /// Gets the property editor aliases that the value converter supports by default.
+ ///
+ IEnumerable PropertyEditorAliases { get; }
+
+ ///
+ /// Gets the deploy property corresponding to a content property.
+ ///
+ /// The content property.
+ /// The content dependencies.
+ /// The deploy property value.
+ string GetValue(Property property, ICollection dependencies);
+
+ ///
+ /// Sets a content property value using a deploy property.
+ ///
+ /// The content item.
+ /// The property alias.
+ /// The deploy property value.
+ void SetValue(IContentBase content, string alias, string value);
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/NamedUdiRange.cs b/src/Umbraco.Core/NamedUdiRange.cs
index 4e81631e03..c87e5db82e 100644
--- a/src/Umbraco.Core/NamedUdiRange.cs
+++ b/src/Umbraco.Core/NamedUdiRange.cs
@@ -10,7 +10,7 @@ namespace Umbraco.Core
///
/// A .
/// An optional selector.
- public NamedUdiRange(Udi udi, string selector = DeploySelector.This)
+ public NamedUdiRange(Udi udi, string selector = Constants.DeploySelector.This)
: base(udi, selector)
{ }
@@ -20,7 +20,7 @@ namespace Umbraco.Core
/// A .
/// A name.
/// An optional selector.
- public NamedUdiRange(Udi udi, string name, string selector = DeploySelector.This)
+ public NamedUdiRange(Udi udi, string name, string selector = Constants.DeploySelector.This)
: base(udi, selector)
{
Name = name;
diff --git a/src/Umbraco.Core/Serialization/StreamResultExtensions.cs b/src/Umbraco.Core/Serialization/StreamResultExtensions.cs
new file mode 100644
index 0000000000..96490a933c
--- /dev/null
+++ b/src/Umbraco.Core/Serialization/StreamResultExtensions.cs
@@ -0,0 +1,22 @@
+using System.IO;
+using System.Text;
+using System.Xml.Linq;
+
+namespace Umbraco.Core.Serialization
+{
+ public static class StreamResultExtensions
+ {
+ public static string ToJsonString(this Stream stream)
+ {
+ byte[] bytes = new byte[stream.Length];
+ stream.Position = 0;
+ stream.Read(bytes, 0, (int)stream.Length);
+ return Encoding.UTF8.GetString(bytes);
+ }
+
+ public static XDocument ToXDoc(this Stream stream)
+ {
+ return XDocument.Load(stream);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Serialization/StreamedResult.cs b/src/Umbraco.Core/Serialization/StreamedResult.cs
index 9b73fd06bf..0a50751229 100644
--- a/src/Umbraco.Core/Serialization/StreamedResult.cs
+++ b/src/Umbraco.Core/Serialization/StreamedResult.cs
@@ -1,6 +1,4 @@
using System.IO;
-using System.Text;
-using System.Xml.Linq;
namespace Umbraco.Core.Serialization
{
@@ -20,20 +18,4 @@ namespace Umbraco.Core.Serialization
#endregion
}
-
- public static class StreamResultExtensions
- {
- public static string ToJsonString(this Stream stream)
- {
- byte[] bytes = new byte[stream.Length];
- stream.Position = 0;
- stream.Read(bytes, 0, (int)stream.Length);
- return Encoding.UTF8.GetString(bytes);
- }
-
- public static XDocument ToXDoc(this Stream stream)
- {
- return XDocument.Load(stream);
- }
- }
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Serialization/UdiJsonConverter.cs b/src/Umbraco.Core/Serialization/UdiJsonConverter.cs
index 7d2db92e81..ff62535825 100644
--- a/src/Umbraco.Core/Serialization/UdiJsonConverter.cs
+++ b/src/Umbraco.Core/Serialization/UdiJsonConverter.cs
@@ -4,26 +4,6 @@ using Newtonsoft.Json.Linq;
namespace Umbraco.Core.Serialization
{
- public class UdiRangeJsonConverter : JsonConverter
- {
- public override bool CanConvert(Type objectType)
- {
- return typeof(UdiRange).IsAssignableFrom(objectType);
- }
-
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- writer.WriteValue(value.ToString());
- }
-
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- var jo = JToken.ReadFrom(reader);
- var val = jo.ToObject();
- return val == null ? null : UdiRange.Parse(val);
- }
- }
-
public class UdiJsonConverter : JsonConverter
{
diff --git a/src/Umbraco.Core/Serialization/UdiRangeJsonConverter.cs b/src/Umbraco.Core/Serialization/UdiRangeJsonConverter.cs
new file mode 100644
index 0000000000..099c46f29d
--- /dev/null
+++ b/src/Umbraco.Core/Serialization/UdiRangeJsonConverter.cs
@@ -0,0 +1,26 @@
+using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace Umbraco.Core.Serialization
+{
+ public class UdiRangeJsonConverter : JsonConverter
+ {
+ public override bool CanConvert(Type objectType)
+ {
+ return typeof(UdiRange).IsAssignableFrom(objectType);
+ }
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ writer.WriteValue(value.ToString());
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ var jo = JToken.ReadFrom(reader);
+ var val = jo.ToObject();
+ return val == null ? null : UdiRange.Parse(val);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/UdiRange.cs b/src/Umbraco.Core/UdiRange.cs
index e1aa49e079..a708220066 100644
--- a/src/Umbraco.Core/UdiRange.cs
+++ b/src/Umbraco.Core/UdiRange.cs
@@ -19,19 +19,19 @@ namespace Umbraco.Core
///
/// A .
/// An optional selector.
- public UdiRange(Udi udi, string selector = DeploySelector.This)
+ public UdiRange(Udi udi, string selector = Constants.DeploySelector.This)
{
Udi = udi;
switch (selector)
{
- case DeploySelector.This:
+ case Constants.DeploySelector.This:
Selector = selector;
_uriValue = udi.UriValue;
break;
- case DeploySelector.ChildrenOfThis:
- case DeploySelector.DescendantsOfThis:
- case DeploySelector.ThisAndChildren:
- case DeploySelector.ThisAndDescendants:
+ case Constants.DeploySelector.ChildrenOfThis:
+ case Constants.DeploySelector.DescendantsOfThis:
+ case Constants.DeploySelector.ThisAndChildren:
+ case Constants.DeploySelector.ThisAndDescendants:
Selector = selector;
_uriValue = new Uri(Udi + "?" + selector);
break;
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 38f2920f7d..d06547ff19 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -290,27 +290,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -541,7 +555,9 @@
+
+
diff --git a/src/Umbraco.Tests/UdiTests.cs b/src/Umbraco.Tests/UdiTests.cs
index 8654f4b458..2587e245aa 100644
--- a/src/Umbraco.Tests/UdiTests.cs
+++ b/src/Umbraco.Tests/UdiTests.cs
@@ -118,7 +118,7 @@ namespace Umbraco.Tests
Assert.AreEqual(Guid.Empty, ((GuidUdi)guidUdi).Guid);
// can create a range
- var range = new UdiRange(stringUdi, DeploySelector.ChildrenOfThis);
+ var range = new UdiRange(stringUdi, Constants.DeploySelector.ChildrenOfThis);
// cannot create invalid ranges
Assert.Throws(() => new UdiRange(guidUdi, "x"));
@@ -142,14 +142,14 @@ namespace Umbraco.Tests
Assert.AreEqual(DeployEntityType.AnyGuid, dudi.EntityType);
Assert.AreEqual(guid, ((GuidUdi)dudi).Guid);
- var range = new UdiRange(udi, DeploySelector.ChildrenOfThis);
+ var range = new UdiRange(udi, Constants.DeploySelector.ChildrenOfThis);
json = JsonConvert.SerializeObject(range, settings);
Assert.AreEqual(string.Format("\"umb://any-guid/{0:N}?children\"", guid), json);
var drange = JsonConvert.DeserializeObject(json, settings);
Assert.AreEqual(udi, drange.Udi);
Assert.AreEqual(string.Format("umb://any-guid/{0:N}", guid), drange.Udi.UriValue.ToString());
- Assert.AreEqual(DeploySelector.ChildrenOfThis, drange.Selector);
+ Assert.AreEqual(Constants.DeploySelector.ChildrenOfThis, drange.Selector);
}
}
}
\ No newline at end of file