Merge remote-tracking branch 'origin/dev/AR-1_serialization' into dev/AR-8_line_endings

Conflicts:
	app/Umbraco/Archetype.Tests/Serialization/UseCases/ArchetypeJsonConverterTest.cs
	app/Umbraco/Archetype.Tests/Serialization/UseCases/Complex/ArchetypeJsonConverterTest.cs
	app/Umbraco/Archetype.Tests/Serialization/UseCases/JsonTestModels.cs
	app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj
	app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs
	app/Umbraco/Umbraco.Archetype/Properties/VersionInfo.cs
	app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs
	app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs
	app/Umbraco/Umbraco.Archetype/Serialization/AsArchetypeAttribute.cs
	app/Umbraco/Umbraco.Archetype/Serialization/AsFieldsetAttribute.cs
	app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs
This commit is contained in:
cankoluman
2014-06-27 12:42:40 +01:00
29 changed files with 3338 additions and 1420 deletions
+270 -250
View File
@@ -1,251 +1,271 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Archetype.Tests</RootNamespace>
<AssemblyName>Archetype.Tests</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
</Reference>
<Reference Include="AutoMapper.Net4">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
</Reference>
<Reference Include="businesslogic, Version=1.0.5242.22740, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll</HintPath>
</Reference>
<Reference Include="ClientDependency.Core">
<HintPath>..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll</HintPath>
</Reference>
<Reference Include="ClientDependency.Core.Mvc">
<HintPath>..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll</HintPath>
</Reference>
<Reference Include="cms, Version=1.0.5242.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
</Reference>
<Reference Include="controls, Version=1.0.5242.22742, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll</HintPath>
</Reference>
<Reference Include="CookComputing.XmlRpcV2">
<HintPath>..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll</HintPath>
</Reference>
<Reference Include="Examine, Version=0.1.55.2941, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll</HintPath>
</Reference>
<Reference Include="HtmlAgilityPack">
<HintPath>..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll</HintPath>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="ImageProcessor, Version=1.9.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll</HintPath>
</Reference>
<Reference Include="ImageProcessor.Web, Version=3.2.3.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll</HintPath>
</Reference>
<Reference Include="interfaces, Version=1.0.5242.22737, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll</HintPath>
</Reference>
<Reference Include="Lucene.Net">
<HintPath>..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data, Version=1.0.1559.20655, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Mvc.FixedDisplayModes">
<HintPath>..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll</HintPath>
</Reference>
<Reference Include="MiniProfiler">
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
</Reference>
<Reference Include="Moq">
<HintPath>..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll</HintPath>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="SQLCE4Umbraco, Version=1.0.5242.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll</HintPath>
</Reference>
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
</Reference>
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="TidyNet, Version=1.0.0.0, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
</Reference>
<Reference Include="umbraco, Version=1.0.5242.22743, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Core, Version=1.0.5242.22738, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll</HintPath>
</Reference>
<Reference Include="umbraco.DataLayer, Version=1.0.5242.22740, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll</HintPath>
</Reference>
<Reference Include="umbraco.editorControls, Version=1.0.5242.22746, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll</HintPath>
</Reference>
<Reference Include="umbraco.MacroEngines, Version=1.0.5242.22747, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll</HintPath>
</Reference>
<Reference Include="umbraco.providers, Version=1.0.5242.22742, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Web.UI, Version=1.0.5242.22748, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll</HintPath>
</Reference>
<Reference Include="umbraco.XmlSerializers, Version=1.0.5242.22743, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll</HintPath>
</Reference>
<Reference Include="UmbracoExamine, Version=0.6.0.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll</HintPath>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter, Version=2.0.60829.1, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Models\FieldsetTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="PropertyValueConverter\PropertyValueConverterTests.cs" />
<Compile Include="Serialization\ArchetypeJsonConverterComplexModelTest.cs" />
<Compile Include="Serialization\ArchetypeJsonConverterTest.cs" />
<Compile Include="Serialization\JsonTestStrings.cs" />
<Compile Include="Serialization\JsonTestModels.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Data\sample-1.json" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Umbraco.Archetype\Archetype.Umbraco.csproj">
<Project>{7D185D41-4228-4978-ACB8-83F9A48AD94F}</Project>
<Name>Archetype.Umbraco</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Archetype.Tests</RootNamespace>
<AssemblyName>Archetype.Tests</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
</Reference>
<Reference Include="AutoMapper.Net4">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
</Reference>
<Reference Include="businesslogic, Version=1.0.5242.22740, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll</HintPath>
</Reference>
<Reference Include="ClientDependency.Core">
<HintPath>..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll</HintPath>
</Reference>
<Reference Include="ClientDependency.Core.Mvc">
<HintPath>..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll</HintPath>
</Reference>
<Reference Include="cms, Version=1.0.5242.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
</Reference>
<Reference Include="controls, Version=1.0.5242.22742, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll</HintPath>
</Reference>
<Reference Include="CookComputing.XmlRpcV2">
<HintPath>..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll</HintPath>
</Reference>
<Reference Include="Examine, Version=0.1.55.2941, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll</HintPath>
</Reference>
<Reference Include="HtmlAgilityPack">
<HintPath>..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll</HintPath>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="ImageProcessor, Version=1.9.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll</HintPath>
</Reference>
<Reference Include="ImageProcessor.Web, Version=3.2.3.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll</HintPath>
</Reference>
<Reference Include="interfaces, Version=1.0.5242.22737, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll</HintPath>
</Reference>
<Reference Include="Lucene.Net">
<HintPath>..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data, Version=1.0.1559.20655, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Mvc.FixedDisplayModes">
<HintPath>..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll</HintPath>
</Reference>
<Reference Include="MiniProfiler">
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
</Reference>
<Reference Include="Moq">
<HintPath>..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll</HintPath>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="nunit.framework">
<HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="SQLCE4Umbraco, Version=1.0.5242.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll</HintPath>
</Reference>
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
</Reference>
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="TidyNet, Version=1.0.0.0, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
</Reference>
<Reference Include="umbraco, Version=1.0.5242.22743, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Core, Version=1.0.5242.22738, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll</HintPath>
</Reference>
<Reference Include="umbraco.DataLayer, Version=1.0.5242.22740, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll</HintPath>
</Reference>
<Reference Include="umbraco.editorControls, Version=1.0.5242.22746, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll</HintPath>
</Reference>
<Reference Include="umbraco.MacroEngines, Version=1.0.5242.22747, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll</HintPath>
</Reference>
<Reference Include="umbraco.providers, Version=1.0.5242.22742, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll</HintPath>
</Reference>
<Reference Include="Umbraco.Web.UI, Version=1.0.5242.22748, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll</HintPath>
</Reference>
<Reference Include="umbraco.XmlSerializers, Version=1.0.5242.22743, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll</HintPath>
</Reference>
<Reference Include="UmbracoExamine, Version=0.6.0.22741, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll</HintPath>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter, Version=2.0.60829.1, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Models\FieldsetTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="PropertyValueConverter\PropertyValueConverterTests.cs" />
<Compile Include="Serialization\Base\ArchetypeJsonConverterTestBase.cs" />
<Compile Include="Serialization\Base\RegressionTestBase.cs" />
<Compile Include="Serialization\Delinter\ArchetypeJsonDelinterTest.cs" />
<Compile Include="Serialization\Regression\ArchetypeJsonConverterTest.cs" />
<Compile Include="Serialization\Regression\SerializationTestHelper.cs" />
<Compile Include="Serialization\Regression\JsonTestModels.cs" />
<Compile Include="Serialization\Regression\JsonTestStrings.cs" />
<Compile Include="Serialization\UseCases\ArchetypeJsonConverterTest.cs" />
<Compile Include="Serialization\UseCases\Complex\ArchetypeJsonConverterTest.cs" />
<Compile Include="Serialization\UseCases\Complex\JsonTestModels.cs" />
<Compile Include="Serialization\UseCases\Complex\JsonTestStrings.cs" />
<Compile Include="Serialization\UseCases\Enumerable\ArchetypeJsonConverterTest.cs" />
<Compile Include="Serialization\UseCases\Enumerable\JsonTestModels.cs" />
<Compile Include="Serialization\UseCases\Enumerable\JsonTestStrings.cs" />
<Compile Include="Serialization\UseCases\JsonTestModels.cs" />
<Compile Include="Serialization\UseCases\JsonTestStrings.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Data\sample-1.json" />
<None Include="packages.config" />
<None Include="SupportingFiles\config\umbracoSettings.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Umbraco.Archetype\Archetype.Umbraco.csproj">
<Project>{7D185D41-4228-4978-ACB8-83F9A48AD94F}</Project>
<Name>Archetype.Umbraco</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>xcopy $(ProjectDir)SupportingFiles\config\* $(TargetDir)config /I /O /X /E /K /D /Y</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -0,0 +1,33 @@
using Archetype.PropertyConverters;
using at = Archetype.Models;
using Newtonsoft.Json;
namespace Archetype.Tests.Serialization.Base
{
public abstract class ArchetypeJsonConverterTestBase
{
public at.ArchetypeModel ConvertModelToArchetype<T>(T model)
{
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(model);
var archetype = (at.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
return archetype;
}
public string ConvertModelToArchetypeJson<T>(T model, Formatting formatting = Formatting.None)
{
return JsonConvert.SerializeObject(model, formatting);
}
public T ConvertArchetypeJsonToModel<T>(string json)
{
return JsonConvert.DeserializeObject<T>(json);
}
public T ConvertModelToArchetypeAndBack<T>(T model)
{
var json = ConvertModelToArchetypeJson(model);
return ConvertArchetypeJsonToModel<T>(json);
}
}
}
@@ -0,0 +1,166 @@
using System.Collections;
using System.Linq;
using System.Reflection;
using Archetype.Serialization;
using Moq;
using Newtonsoft.Json;
using NUnit.Framework;
using Umbraco.Core;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
namespace Archetype.Tests.Serialization.Base
{
public abstract class RegressionTestBase : ArchetypeJsonConverterTestBase
{
protected void SimpleModel_Regression_Battery<T>(T model)
{
var archetype = ConvertModelToArchetype(model);
Assert.IsNotNull(archetype);
var archetypeJson = archetype.SerializeForPersistence();
var modelJson = ConvertModelToArchetypeJson(model, Formatting.Indented);
Assert.IsNotNullOrEmpty(modelJson);
var result = ConvertModelToArchetypeAndBack(model);
var resultfromArchetypeJson = ConvertArchetypeJsonToModel<T>(archetypeJson);
Assert.IsInstanceOf<T>(result);
Assert.IsInstanceOf<T>(resultfromArchetypeJson);
AssertAreEqual(model, result);
AssertAreEqual(model, resultfromArchetypeJson);
}
protected void SimpleModels_Regression_Battery<T>(T model)
where T : IList
{
var archetype = ConvertModelToArchetype(model);
Assert.IsNotNull(archetype);
var archetypeJson = archetype.SerializeForPersistence();
var modelJson = ConvertModelToArchetypeJson(model, Formatting.Indented);
Assert.IsNotNullOrEmpty(modelJson);
var result = ConvertModelToArchetypeAndBack(model);
var resultfromArchetypeJson = ConvertArchetypeJsonToModel<T>(archetypeJson);
Assert.IsInstanceOf<T>(result);
Assert.IsInstanceOf<T>(resultfromArchetypeJson);
Assert.AreEqual(model.Count, result.Count);
Assert.AreEqual(model.Count, resultfromArchetypeJson.Count);
foreach (var resultItem in result)
{
var index = result.IndexOf(resultItem);
AssertAreEqual(model[index], resultItem);
}
foreach (var resultItem in resultfromArchetypeJson)
{
var index = resultfromArchetypeJson.IndexOf(resultItem);
AssertAreEqual(model[index], resultItem);
}
}
protected void CompoundModel_Regression_Battery<T>(T model)
{
var archetype = ConvertModelToArchetype(model);
Assert.IsNotNull(archetype);
var archetypeJson = archetype.SerializeForPersistence();
var modelJson = ConvertModelToArchetypeJson(model, Formatting.Indented);
Assert.IsNotNullOrEmpty(modelJson);
var result = ConvertModelToArchetypeAndBack(model);
var resultfromArchetypeJson = ConvertArchetypeJsonToModel<T>(archetypeJson);
Assert.IsInstanceOf<T>(result);
AssertAreEqual(model, result);
Assert.IsInstanceOf<T>(resultfromArchetypeJson);
AssertAreEqual(model, resultfromArchetypeJson);
}
protected void NestedModel_Regression_Battery<T>(T model)
{
CompoundModel_Regression_Battery(model);
}
protected void ComplexModel_Regression_Battery<T>(T model)
{
CompoundModel_Regression_Battery(model);
}
protected void AssertAreEqual<T>(T model, T result)
{
foreach (var propInfo in model.GetSerialiazableProperties())
{
var expected = GetExpectedValue(model, propInfo);
var actual = GetActualValue(result, propInfo);
if (propInfo.PropertyType.Namespace.Equals("System"))
{
Assert.AreEqual(expected, actual);
continue;
}
var list = expected as IList;
if (list != null)
{
foreach (var expectedItem in list)
{
var index = list.IndexOf(expectedItem);
AssertAreEqual(expectedItem, ((IList)actual)[index]);
}
continue;
}
AssertAreEqual(expected, actual);
}
}
protected void EnsureUmbracoContext(Mock<IDataTypeService> dataTypeService)
{
var cacheHelper = CacheHelper.CreateDisabledCacheHelper();
var serviceContext = new ServiceContext(
Mock.Of<IContentService>(),
Mock.Of<IMediaService>(),
Mock.Of<IContentTypeService>(),
dataTypeService.Object,
Mock.Of<IFileService>(),
Mock.Of<ILocalizationService>(),
Mock.Of<IPackagingService>(),
Mock.Of<IEntityService>(),
Mock.Of<IRelationService>(),
Mock.Of<IMemberGroupService>(),
Mock.Of<IMemberTypeService>(),
Mock.Of<IMemberService>(),
Mock.Of<IUserService>(),
Mock.Of<ISectionService>(),
Mock.Of<IApplicationTreeService>(),
Mock.Of<ITagService>(),
Mock.Of<INotificationService>()
);
ApplicationContext.EnsureContext(
new DatabaseContext(Mock.Of<IDatabaseFactory>()), serviceContext, cacheHelper, true);
}
private object GetExpectedValue<T>(T expected, PropertyInfo propInfo)
{
return propInfo.GetValue(expected, null);
}
private object GetActualValue<T>(T actual, PropertyInfo propInfo)
{
var actualProp = actual.GetSerialiazableProperties().SingleOrDefault(pinfo => pinfo.Name.Equals(propInfo.Name));
return actualProp != null
? actualProp.GetValue(actual, null)
: null;
}
}
}
@@ -0,0 +1,253 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Archetype.PropertyEditors;
using Archetype.Serialization;
using Archetype.Tests.Serialization.Base;
using Moq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NUnit.Framework;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
namespace Archetype.Tests.Serialization.Delinter
{
[TestFixture]
public class ArchetypeJsonDelinterTest : RegressionTestBase
{
private const string _ESCAPED_JSON = @"{""fieldsets"":[{""properties"":[{""alias"":""slides"",""value"":""2680""}],""alias"":""slides""},{""properties"":[{""alias"":""captions"",""value"":""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test1 test1\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test2 test2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b test3b\""}],\""alias\"":\""textstringArray\""}]}""}],""alias"":""captions""}]}";
private const string _JSON = @"{""fieldsets"":[{""properties"":[{""alias"":""slides"",""value"":""2680""}],""alias"":""slides""},{""properties"":[{""alias"":""captions"",""value"":{""fieldsets"":[{""properties"":[{""alias"":""textstring"",""value"":""test1 test1""}],""alias"":""textstringArray""},{""properties"":[{""alias"":""textstring"",""value"":""test2 test2""}],""alias"":""textstringArray""},{""properties"":[{""alias"":""textstring"",""value"":""test3b test3b""}],""alias"":""textstringArray""}]}}],""alias"":""captions""}]}";
private const string _ESCAPED_JSON_DEEP_NESTED = @"{""fieldsets"":[{""properties"":[{""alias"":""pages"",""value"":""""},{""alias"":""captions"",""value"":""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""captions\"",\""value\"":\""{\\\""fieldsets\\\"":[{\\\""properties\\\"":[{\\\""alias\\\"":\\\""textString\\\"",\\\""value\\\"":\\\""{\\\\\\\""fieldsets\\\\\\\"":[{\\\\\\\""properties\\\\\\\"":[{\\\\\\\""alias\\\\\\\"":\\\\\\\""textString\\\\\\\"",\\\\\\\""value\\\\\\\"":\\\\\\\""\\\\\\\""}],\\\\\\\""alias\\\\\\\"":\\\\\\\""textItem\\\\\\\""}]}\\\""}],\\\""alias\\\"":\\\""textList\\\""}]}\""}],\""alias\"":\""captions\""}]}""}],""alias"":""pages""}]}";
private const string _ESCAPED_JSON_FROM_APP = @"{
""alias"": ""captions"",
""value"": ""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test1 test1\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test2 test2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b test3b\""}],\""alias\"":\""textstringArray\""}]}""
}";
private SlideShow _referenceModel;
private NestedClass _nestedClass;
[SetUp]
public void SetUp()
{
_referenceModel = new SlideShow()
{
Slides = "2680",
Captions = new Captions()
{
new TextString(){Text = "test1 test1"},
new TextString(){Text = "test2 test2"},
new TextString(){Text = "test3b test3b"}
}
};
_nestedClass = GetNestedClass();
_nestedClass.SlideShow = _referenceModel;
_nestedClass.Nested = GetNestedClass();
_nestedClass.Nested.SlideShow = _referenceModel;
_nestedClass.Nested.Nested = GetNestedClass();
}
[Test]
public void Delinter_RemoveNewLine_ByPasses_Values()
{
const string _JSON_WITH_RESERVED_CHARS = @"{
""alias"": ""captions"",
""value"": ""{ \""fieldsets\"": [
{
\""properties\"":
[
{ \""alias\"": \""textstring\"" , \""value\"":\""test1 \r\n test1\r\n\""}], \""alias\"":\""textstringArray\"" },{\""properties\"": [ { \""alias\"":\""textstring\"",\""value\"":\""test2\r\ntest2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b \""quote\"" \\r\\r\\rtest3\""}],\""alias\"":\""textstringArray\"" } ] }""
}";
var referenceModel = new Captions()
{
new TextString() {Text = @"test1
test1
"},
new TextString() {Text = @"test2
test2"},
new TextString() {Text = @"test3b ""quote"" \r\r\rtest3"}
};
var delintedJson = _JSON_WITH_RESERVED_CHARS.DelintArchetypeJson();
var actualModel = ConvertArchetypeJsonToModel<Captions>(delintedJson);
var t = JToken.Parse(delintedJson).ToString(Formatting.None);
Assert.IsInstanceOf<Captions>(actualModel);
Assert.IsNotNull(actualModel);
Assert.AreEqual(3, actualModel.Count);
foreach (var refItem in referenceModel)
{
var index = referenceModel.IndexOf(refItem);
AssertAreEqual(refItem, actualModel.ElementAt(index));
}
}
[Test]
public void ReferenceJsonAndModel_Equal_ExpectedJsonAndModel()
{
const string expectedJson = _JSON;
var expectedModel = ConvertArchetypeJsonToModel<SlideShow>(expectedJson);
var referenceModel = ConvertModelToArchetypeAndBack(_referenceModel);
Assert.IsInstanceOf<SlideShow>(expectedModel);
Assert.IsInstanceOf<SlideShow>(referenceModel);
Assert.AreEqual(3, expectedModel.Captions.Count);
Assert.AreEqual(3, referenceModel.Captions.Count);
AssertAreEqual(expectedModel, referenceModel);
}
[Test]
public void UnescapedJsonAndModel_Equal_ExpectedJsonAndModel()
{
const string expectedJson = _JSON;
var unescapedJson = _ESCAPED_JSON.DelintArchetypeJson();
var expectedModel = ConvertArchetypeJsonToModel<SlideShow>(expectedJson);
var actualModel = ConvertArchetypeJsonToModel<SlideShow>(unescapedJson);
Assert.IsInstanceOf<SlideShow>(expectedModel);
Assert.IsInstanceOf<SlideShow>(actualModel);
Assert.AreEqual(3, expectedModel.Captions.Count);
Assert.AreEqual(3, actualModel.Captions.Count);
AssertAreEqual(expectedModel, actualModel);
}
[Test]
public void EscapedJson_FromApp_SerializesToModel()
{
var delintedJson = _ESCAPED_JSON_FROM_APP.DelintArchetypeJson();
var referenceModel = new Captions()
{
new TextString() {Text = "test1 test1"},
new TextString() {Text = "test2 test2"},
new TextString() {Text = "test3b test3b"}
};
var actualModel = ConvertArchetypeJsonToModel<Captions>(delintedJson);
Assert.IsInstanceOf<Captions>(actualModel);
Assert.AreEqual(3, actualModel.Count);
foreach (var refItem in referenceModel)
{
var index = referenceModel.IndexOf(refItem);
AssertAreEqual(refItem, actualModel.ElementAt(index));
}
}
[Test]
public void DeepNestedJson_Escapes_Correctly()
{
var propGuid = new Guid();
var dtd = new DataTypeDefinition(-1, String.Empty) { Id = 0 };
var dataTypeService = new Mock<IDataTypeService>();
dataTypeService.Setup(dts => dts.GetDataTypeDefinitionById(Guid.Parse(propGuid.ToString()))).Returns(dtd);
dataTypeService.Setup(dts => dts.GetPreValuesCollectionByDataTypeId(dtd.Id)).Returns(new PreValueCollection(new Dictionary<string, PreValue>()));
var propValueEditor = new Mock<ArchetypePropertyEditor.ArchetypePropertyValueEditor>(new PropertyValueEditor());
propValueEditor.Setup(pe => pe.GetPropertyEditor(dtd)).Returns(new ArchetypePropertyEditor());
var archetype = ConvertModelToArchetype(_nestedClass);
foreach (var prop in archetype.Fieldsets.SelectMany(fs => fs.Properties))
{
prop.DataTypeGuid = propGuid.ToString();
if (prop.Value.ToString().Contains("fieldsets"))
prop.PropertyEditorAlias = Constants.PropertyEditorAlias;
}
var archetypeJson = JsonConvert.SerializeObject(archetype);
Assert.IsNotNullOrEmpty(archetypeJson);
EnsureUmbracoContext(dataTypeService);
var propEditor = new ArchetypePropertyEditor.ArchetypePropertyValueEditor(new PropertyValueEditor());
var convertedJson = propEditor.ConvertEditorToDb(new ContentPropertyData(JObject.FromObject(archetype),
new PreValueCollection(new Dictionary<string, PreValue>()), new Dictionary<string, object>()),
archetypeJson);
Assert.IsNotNull(convertedJson);
var delintedJson = convertedJson.ToString().DelintArchetypeJson();
Assert.IsNotNullOrEmpty(delintedJson);
var modelfromArchetypeJson = ConvertArchetypeJsonToModel<NestedClass>(archetypeJson);
var modelfromConvertedJson = ConvertArchetypeJsonToModel<NestedClass>(delintedJson);
Assert.IsInstanceOf<NestedClass>(modelfromArchetypeJson);
Assert.IsInstanceOf<NestedClass>(modelfromConvertedJson);
Assert.AreEqual(3, modelfromArchetypeJson.SlideShow.Captions.Count);
Assert.AreEqual(3, modelfromConvertedJson.SlideShow.Captions.Count);
Assert.AreEqual(3, modelfromArchetypeJson.Nested.SlideShow.Captions.Count);
Assert.AreEqual(3, modelfromConvertedJson.Nested.SlideShow.Captions.Count);
AssertAreEqual(modelfromArchetypeJson, modelfromConvertedJson);
}
#region private methods
private NestedClass GetNestedClass()
{
return new NestedClass();
}
#endregion
#region classes
[AsArchetype("slides")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SlideShow
{
[JsonProperty("slides")]
public string Slides { get; set; }
[AsFieldset]
[JsonProperty("captions")]
public Captions Captions { get; set; }
}
[AsArchetype("textstringArray")] /* Note: when inheriting from a list, archetype alias is not used */
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Captions : List<TextString>
{
}
[AsArchetype("textstringArray")] /* due to hard coded string calues above, must have same archetype alias as list class */
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextString
{
[JsonProperty("textstring")]
public String Text { get; set; }
}
[AsArchetype("nestedClass")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class NestedClass
{
[JsonProperty("nestedClass")]
public NestedClass Nested { get; set; }
[JsonProperty("slides")]
public SlideShow SlideShow { get; set; }
}
#endregion
}
}
@@ -0,0 +1,150 @@
using Archetype.Tests.Serialization.Base;
using Newtonsoft.Json;
using NUnit.Framework;
namespace Archetype.Tests.Serialization.Regression
{
[TestFixture]
public class ArchetypeJsonConverterTest : RegressionTestBase
{
private SerializationTestHelper _testHelper;
[SetUp]
public void SetUp()
{
_testHelper = new SerializationTestHelper();
}
[Test]
public void EmptyArray_Returns_Null()
{
var archetypeJson = @"{""fieldsets"": []}";
var result = ConvertArchetypeJsonToModel<SimpleModel>(archetypeJson);
Assert.IsNull(result);
}
[Test]
public void SimpleModel_Regression_Battery()
{
var simpleModel = _testHelper.GetModel<SimpleModel>();
SimpleModel_Regression_Battery(simpleModel);
var json = ConvertModelToArchetypeJson(simpleModel, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._SIMPLE_JSON, json);
}
[Test]
public void SimpleModelWithFieldsets_Regression_Battery()
{
var simpleModel = _testHelper.GetModel<SimpleModelWithFieldsets>();
SimpleModel_Regression_Battery(simpleModel);
}
[Test]
public void SimpleModelWithMixedFieldsets_Regression_Battery()
{
var simpleModel = _testHelper.GetModel<SimpleModelWithMixedFieldsets>();
SimpleModel_Regression_Battery(simpleModel);
}
[Test]
public void SimpleModels_Regression_Battery()
{
var simpleModels = _testHelper.GetModel<SimpleModels>();
SimpleModels_Regression_Battery(simpleModels);
}
[Test]
public void SimpleModelsWithFieldsets_Regression_Battery()
{
var simpleModels = _testHelper.GetModel<SimpleModelsWithFieldsets>();
SimpleModels_Regression_Battery(simpleModels);
}
[Test]
public void SimpleModelsWithMixedFieldsets_Regression_Battery()
{
var simpleModels = _testHelper.GetModel<SimpleModelsWithMixedFieldsets>();
SimpleModels_Regression_Battery(simpleModels);
}
[Test]
public void CompoundModel_Regression_Battery()
{
var compoundModel = _testHelper.GetModel<CompoundModel>();
CompoundModel_Regression_Battery(compoundModel);
}
[Test]
public void CompoundModelWithMixedFieldsetVariant1_Regression_Battery()
{
var compoundModel = _testHelper.GetModel<CompoundModelWithMixedFieldsetVariant1>();
CompoundModel_Regression_Battery(compoundModel);
}
[Test]
public void CompoundModelWithMixedFieldsetVariant2_Regression_Battery()
{
var compoundModel = _testHelper.GetModel<CompoundModelWithMixedFieldsetVariant2>();
CompoundModel_Regression_Battery(compoundModel);
}
[Test]
public void CompoundModelWithFieldset_Regression_Battery()
{
var compoundModel = _testHelper.GetModel<CompoundModelWithFieldset>();
CompoundModel_Regression_Battery(compoundModel);
}
[Test]
public void CompoundModelWithList_Regression_Battery()
{
var compoundModelWithList = _testHelper.GetModel<CompoundModelWithList>();
CompoundModel_Regression_Battery(compoundModelWithList);
}
[Test]
public void CompoundModelWithMixedFieldsetWithList_Regression_Battery()
{
var compoundModelWithList = _testHelper.GetModel<CompoundModelWithMixedFieldsetWithList>();
CompoundModel_Regression_Battery(compoundModelWithList);
}
[Test]
public void CompoundModelWithFieldsetWithList_Regression_Battery()
{
var compoundModelWithList = _testHelper.GetModel<CompoundModelWithFieldsetWithList>();
CompoundModel_Regression_Battery(compoundModelWithList);
}
[Test]
public void NestedModel_Regression_Battery()
{
var nestedModel = _testHelper.GetModel<NestedModel>();
NestedModel_Regression_Battery(nestedModel);
}
[Test]
public void NestedModelWithMixedFieldset_Regression_Battery()
{
var nestedModel = _testHelper.GetModel<NestedModelWithMixedFieldset>();
NestedModel_Regression_Battery(nestedModel);
}
[Test]
public void NestedModelWithFieldset_Regression_Battery()
{
var nestedModel = _testHelper.GetModel<NestedModelWithFieldset>();
NestedModel_Regression_Battery(nestedModel);
}
[Test]
public void ComplexModel_Regression_Battery()
{
var complexModel = _testHelper.GetModel<ComplexModel>();
NestedModel_Regression_Battery(complexModel);
}
}
}
@@ -0,0 +1,257 @@
using System;
using System.Collections.Generic;
using Archetype.Serialization;
using Newtonsoft.Json;
namespace Archetype.Tests.Serialization.Regression
{
[AsArchetype("simpleModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SimpleModel
{
[JsonProperty("text")]
public String Text { get; set; }
[JsonProperty("integer")]
public int Id { get; set; }
[JsonProperty("nullableInteger")]
public int? NullableId { get; set; }
[JsonProperty("double")]
public double Amount { get; set; }
[JsonProperty("nullableDouble")]
public double? NullableAmount { get; set; }
[JsonProperty("dateTime")]
public DateTime DateOne { get; set; }
[JsonProperty("nullableDateTime")]
public DateTime? DateTwo { get; set; }
}
[AsArchetype("simpleModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SimpleModelWithFieldsets
{
[AsFieldset]
[JsonProperty("text")]
public string Text { get; set; }
[AsFieldset]
[JsonProperty("integer")]
public int Id { get; set; }
[AsFieldset]
[JsonProperty("nullableInteger")]
public int? NullableId { get; set; }
[AsFieldset]
[JsonProperty("double")]
public double Amount { get; set; }
[AsFieldset]
[JsonProperty("nullableDouble")]
public double? NullableAmount { get; set; }
[AsFieldset]
[JsonProperty("dateTime")]
public DateTime DateOne { get; set; }
[AsFieldset]
[JsonProperty("nullableDateTime")]
public DateTime? DateTwo { get; set; }
}
[AsArchetype("simpleModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SimpleModelWithMixedFieldsets
{
[AsFieldset]
[JsonProperty("text")]
public string Text { get; set; }
[JsonProperty("integer")]
public int Id { get; set; }
[AsFieldset]
[JsonProperty("nullableInteger")]
public int? NullableId { get; set; }
[JsonProperty("double")]
public double Amount { get; set; }
[AsFieldset]
[JsonProperty("nullableDouble")]
public double? NullableAmount { get; set; }
[AsFieldset]
[JsonProperty("dateTime")]
public DateTime DateOne { get; set; }
public DateTime? DateTwo { get; set; }
}
[AsArchetype("simpleModels")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SimpleModels : List<SimpleModel>
{
}
[AsArchetype("simpleModels")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SimpleModelsWithFieldsets : List<SimpleModelWithFieldsets>
{
}
[AsArchetype("simpleModels")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SimpleModelsWithMixedFieldsets : List<SimpleModelWithMixedFieldsets>
{
}
[AsArchetype("compoundModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModel
{
[JsonProperty("simpleModel")]
public SimpleModel SimpleModel { get; set; }
[JsonProperty("text")]
public String Text { get; set; }
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("compoundModelWithMixedFieldset")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModelWithMixedFieldsetVariant1
{
[AsFieldset]
[JsonProperty("simpleModel")]
public SimpleModel SimpleModel { get; set; }
[JsonProperty("text")]
public String Text { get; set; }
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("compoundModelWithMixedFieldset")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModelWithMixedFieldsetVariant2
{
[JsonProperty("simpleModel")]
public SimpleModel SimpleModel { get; set; }
[AsFieldset]
[JsonProperty("text")]
public String Text { get; set; }
[AsFieldset]
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("compoundModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModelWithFieldset
{
[AsFieldset]
[JsonProperty("simpleModel")]
public SimpleModel SimpleModel { get; set; }
[AsFieldset]
[JsonProperty("text")]
public String Text { get; set; }
[AsFieldset]
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("compoundModelWithList")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModelWithList
{
[JsonProperty("simpleModelList")]
public List<SimpleModel> SimpleModelList { get; set; }
[JsonProperty("text")]
public String Text { get; set; }
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("compoundModelWithList")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModelWithMixedFieldsetWithList
{
[JsonProperty("simpleModelList")]
public List<SimpleModel> SimpleModelList { get; set; }
[AsFieldset]
[JsonProperty("text")]
public String Text { get; set; }
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("compoundModelWithList")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModelWithFieldsetWithList
{
[AsFieldset]
[JsonProperty("simpleModelList")]
public List<SimpleModel> SimpleModelList { get; set; }
[AsFieldset]
[JsonProperty("text")]
public String Text { get; set; }
[AsFieldset]
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("nestedModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class NestedModel
{
[JsonProperty("compoundModel")]
public CompoundModel CompoundModel { get; set; }
[JsonProperty("simpleModel")]
public SimpleModel SimpleModel { get; set; }
[JsonProperty("text")]
public String Text { get; set; }
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("nestedModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class NestedModelWithMixedFieldset
{
[JsonProperty("compoundModel")]
public CompoundModel CompoundModel { get; set; }
[AsFieldset]
[JsonProperty("simpleModel")]
public SimpleModel SimpleModel { get; set; }
[JsonProperty("text")]
public String Text { get; set; }
[AsFieldset]
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("nestedModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class NestedModelWithFieldset
{
[AsFieldset]
[JsonProperty("compoundModel")]
public CompoundModel CompoundModel { get; set; }
[AsFieldset]
[JsonProperty("simpleModel")]
public SimpleModel SimpleModel { get; set; }
[AsFieldset]
[JsonProperty("text")]
public String Text { get; set; }
[AsFieldset]
[JsonProperty("integer")]
public int Id { get; set; }
}
[AsArchetype("complexModel")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class ComplexModel
{
[JsonProperty("compoundModels")]
public CompoundModelWrapper CompoundModelWrapper { get; set; }
[JsonProperty("text")]
public String Text { get; set; }
}
[AsArchetype("compoundModelWrapper")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class CompoundModelWrapper
{
[JsonProperty("compoundModels")]
public List<CompoundModel> CompoundModels { get; set; }
[JsonProperty("text")]
public String Text { get; set; }
}
}
@@ -0,0 +1,61 @@
namespace Archetype.Tests.Serialization.Regression
{
public class JsonTestStrings
{
public const string _SIMPLE_JSON = @"{
""fieldsets"": [
{
""alias"": ""simpleModel"",
""properties"": [
{
""alias"": ""text"",
""value"": ""Test \r\nText \""quote\"" \r\n""
},
{
""alias"": ""integer"",
""value"": ""123""
},
{
""alias"": ""nullableInteger"",
""value"": """"
},
{
""alias"": ""double"",
""value"": ""5.67""
},
{
""alias"": ""nullableDouble"",
""value"": """"
},
{
""alias"": ""dateTime"",
""value"": ""01/01/2000 00:00:00""
},
{
""alias"": ""nullableDateTime"",
""value"": """"
}
]
}
]
}";
public const string _ESCAPED_JSON =
@"{
""fieldsets"":[
{
""properties"":[
{
""alias"":""pages"",
""value"":""2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453""
},
{
""alias"":""captions"",
""value"":""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""captions\"",\""value\"":\""{\\\""fieldsets\\\"":[{\\\""properties\\\"":[{\\\""alias\\\"":\\\""textString\\\"",\\\""value\\\"":\\\""{\\\\\\\""fieldsets\\\\\\\"":[{\\\\\\\""properties\\\\\\\"":[{\\\\\\\""alias\\\\\\\"":\\\\\\\""textString\\\\\\\"",\\\\\\\""value\\\\\\\"":\\\\\\\""First Page\\\\\\\"",\\\\\\\""propertyEditorAlias\\\\\\\"":\\\\\\\""Umbraco.Textbox\\\\\\\"",\\\\\\\""dataTypeId\\\\\\\"":-88,\\\\\\\""dataTypeGuid\\\\\\\"":\\\\\\\""0cc0eba1-9960-42c9-bf9b-60e150b429ae\\\\\\\""}],\\\\\\\""alias\\\\\\\"":\\\\\\\""textItem\\\\\\\""}]}\\\"",\\\""propertyEditorAlias\\\"":\\\""Imulus.Archetype\\\"",\\\""dataTypeId\\\"":3764,\\\""dataTypeGuid\\\"":\\\""496cfe35-448f-4b59-9c75-050798afdce4\\\""}],\\\""alias\\\"":\\\""textList\\\""},{\\\""properties\\\"":[{\\\""alias\\\"":\\\""textString\\\"",\\\""value\\\"":\\\""{\\\\\\\""fieldsets\\\\\\\"":[{\\\\\\\""properties\\\\\\\"":[{\\\\\\\""alias\\\\\\\"":\\\\\\\""textString\\\\\\\"",\\\\\\\""value\\\\\\\"":\\\\\\\""Second Page\\\\\\\"",\\\\\\\""propertyEditorAlias\\\\\\\"":\\\\\\\""Umbraco.Textbox\\\\\\\"",\\\\\\\""dataTypeId\\\\\\\"":-88,\\\\\\\""dataTypeGuid\\\\\\\"":\\\\\\\""0cc0eba1-9960-42c9-bf9b-60e150b429ae\\\\\\\""}],\\\\\\\""alias\\\\\\\"":\\\\\\\""textItem\\\\\\\""}]}\\\"",\\\""propertyEditorAlias\\\"":\\\""Imulus.Archetype\\\"",\\\""dataTypeId\\\"":3764,\\\""dataTypeGuid\\\"":\\\""496cfe35-448f-4b59-9c75-050798afdce4\\\""}],\\\""alias\\\"":\\\""textList\\\""},{\\\""properties\\\"":[{\\\""alias\\\"":\\\""textString\\\"",\\\""value\\\"":\\\""{\\\\\\\""fieldsets\\\\\\\"":[{\\\\\\\""properties\\\\\\\"":[{\\\\\\\""alias\\\\\\\"":\\\\\\\""textString\\\\\\\"",\\\\\\\""value\\\\\\\"":\\\\\\\""Third Page\\\\\\\"",\\\\\\\""propertyEditorAlias\\\\\\\"":\\\\\\\""Umbraco.Textbox\\\\\\\"",\\\\\\\""dataTypeId\\\\\\\"":-88,\\\\\\\""dataTypeGuid\\\\\\\"":\\\\\\\""0cc0eba1-9960-42c9-bf9b-60e150b429ae\\\\\\\""}],\\\\\\\""alias\\\\\\\"":\\\\\\\""textItem\\\\\\\""}]}\\\"",\\\""propertyEditorAlias\\\"":\\\""Imulus.Archetype\\\"",\\\""dataTypeId\\\"":3764,\\\""dataTypeGuid\\\"":\\\""496cfe35-448f-4b59-9c75-050798afdce4\\\""}],\\\""alias\\\"":\\\""textList\\\""},{\\\""properties\\\"":[{\\\""alias\\\"":\\\""textString\\\"",\\\""value\\\"":\\\""{\\\\\\\""fieldsets\\\\\\\"":[{\\\\\\\""properties\\\\\\\"":[{\\\\\\\""alias\\\\\\\"":\\\\\\\""textString\\\\\\\"",\\\\\\\""value\\\\\\\"":\\\\\\\""Fourth Page\\\\\\\"",\\\\\\\""propertyEditorAlias\\\\\\\"":\\\\\\\""Umbraco.Textbox\\\\\\\"",\\\\\\\""dataTypeId\\\\\\\"":-88,\\\\\\\""dataTypeGuid\\\\\\\"":\\\\\\\""0cc0eba1-9960-42c9-bf9b-60e150b429ae\\\\\\\""}],\\\\\\\""alias\\\\\\\"":\\\\\\\""textItem\\\\\\\""}]}\\\"",\\\""propertyEditorAlias\\\"":\\\""Imulus.Archetype\\\"",\\\""dataTypeId\\\"":3764,\\\""dataTypeGuid\\\"":\\\""496cfe35-448f-4b59-9c75-050798afdce4\\\""}],\\\""alias\\\"":\\\""textList\\\""}]}\"",\""propertyEditorAlias\"":\""Imulus.Archetype\"",\""dataTypeId\"":3765,\""dataTypeGuid\"":\""4ed439b3-0ee7-447a-a64e-b2b486b86379\""}],\""alias\"":\""captions\""}]}""
}
],
""alias"":""pages""
}
]
}";
}
}
@@ -0,0 +1,220 @@
using System;
using System.Collections.Generic;
namespace Archetype.Tests.Serialization.Regression
{
public class SerializationTestHelper
{
public T GetModel<T>()
{
try
{
return (T)GetType().GetMethod("Get" + typeof(T).Name).Invoke(this, null);
}
catch
{
return default(T);
}
}
public SimpleModel GetSimpleModel()
{
return new SimpleModel
{
Amount = 5.67,
NullableAmount = null,
DateOne = new DateTime(2000, 1, 1),
DateTwo = null,
Id = 123,
NullableId = null,
Text = @"Test
Text ""quote""
"
};
}
public SimpleModelWithFieldsets GetSimpleModelWithFieldsets()
{
return new SimpleModelWithFieldsets
{
Amount = 5.67,
NullableAmount = null,
DateOne = new DateTime(2000, 1, 1),
DateTwo = null,
Id = 123,
NullableId = null,
Text = "Test Text"
};
}
public SimpleModelWithMixedFieldsets GetSimpleModelWithMixedFieldsets()
{
return new SimpleModelWithMixedFieldsets
{
Amount = 5.67,
NullableAmount = null,
DateOne = new DateTime(2000, 1, 1),
DateTwo = null,
Id = 123,
NullableId = null,
Text = "Test Text"
};
}
public SimpleModels GetSimpleModels()
{
return new SimpleModels
{
GetSimpleModel(),
GetSimpleModel(),
GetSimpleModel()
};
}
public SimpleModelsWithFieldsets GetSimpleModelsWithFieldsets()
{
return new SimpleModelsWithFieldsets
{
GetSimpleModelWithFieldsets(),
GetSimpleModelWithFieldsets(),
GetSimpleModelWithFieldsets()
};
}
public SimpleModelsWithMixedFieldsets GetSimpleModelsWithMixedFieldsets()
{
return new SimpleModelsWithMixedFieldsets
{
GetSimpleModelWithMixedFieldsets(),
GetSimpleModelWithMixedFieldsets(),
GetSimpleModelWithMixedFieldsets()
};
}
public CompoundModel GetCompoundModel()
{
return new CompoundModel
{
Id = -1,
SimpleModel = GetModel<SimpleModel>(),
Text = typeof(CompoundModel).Name
};
}
public CompoundModelWithMixedFieldsetVariant1 GetCompoundModelWithMixedFieldsetVariant1()
{
return new CompoundModelWithMixedFieldsetVariant1
{
Id = -1,
SimpleModel = GetModel<SimpleModel>(),
Text = typeof(CompoundModelWithMixedFieldsetVariant1).Name
};
}
public CompoundModelWithMixedFieldsetVariant2 GetCompoundModelWithMixedFieldsetVariant2()
{
return new CompoundModelWithMixedFieldsetVariant2
{
Id = -1,
SimpleModel = GetModel<SimpleModel>(),
Text = typeof(CompoundModelWithMixedFieldsetVariant2).Name
};
}
public CompoundModelWithFieldset GetCompoundModelWithFieldset()
{
return new CompoundModelWithFieldset
{
Id = -1,
SimpleModel = GetModel<SimpleModel>(),
Text = typeof(CompoundModelWithFieldset).Name
};
}
public CompoundModelWithList GetCompoundModelWithList()
{
return new CompoundModelWithList
{
Id = 10,
SimpleModelList = GetModel<SimpleModels>(),
Text = typeof(CompoundModelWithList).Name
};
}
public CompoundModelWithMixedFieldsetWithList GetCompoundModelWithMixedFieldsetWithList()
{
return new CompoundModelWithMixedFieldsetWithList
{
Id = 11,
SimpleModelList = GetModel<SimpleModels>(),
Text = typeof(CompoundModelWithMixedFieldsetWithList).Name
};
}
public CompoundModelWithFieldsetWithList GetCompoundModelWithFieldsetWithList()
{
return new CompoundModelWithFieldsetWithList
{
Id = 12,
SimpleModelList = GetModel<SimpleModels>(),
Text = typeof(CompoundModelWithFieldsetWithList).Name
};
}
public NestedModel GetNestedModel()
{
return new NestedModel
{
CompoundModel = GetModel<CompoundModel>(),
Id = 53,
SimpleModel = GetModel<SimpleModel>(),
Text = typeof(NestedModel).Name
};
}
public NestedModelWithMixedFieldset GetNestedModelWithMixedFieldset()
{
return new NestedModelWithMixedFieldset
{
CompoundModel = GetModel<CompoundModel>(),
Id = 54,
SimpleModel = GetModel<SimpleModel>(),
Text = typeof(NestedModelWithMixedFieldset).Name
};
}
public NestedModelWithFieldset GetNestedModelWithFieldset()
{
return new NestedModelWithFieldset
{
CompoundModel = GetModel<CompoundModel>(),
Id = 55,
SimpleModel = GetModel<SimpleModel>(),
Text = typeof(NestedModelWithFieldset).Name
};
}
public CompoundModelWrapper GetCompoundModelWrapper()
{
return new CompoundModelWrapper
{
CompoundModels = new List<CompoundModel>
{
GetModel<CompoundModel>(),
GetModel<CompoundModel>(),
GetModel<CompoundModel>()
},
Text = typeof(CompoundModelWrapper).Name
};
}
public ComplexModel GetComplexModel()
{
return new ComplexModel
{
CompoundModelWrapper = GetModel<CompoundModelWrapper>(),
Text = typeof(ComplexModel).Name
};
}
}
}
@@ -1,12 +1,13 @@
using System;
using Archetype.PropertyConverters;
using Archetype.Tests.Serialization.Base;
using Newtonsoft.Json;
using NUnit.Framework;
namespace Archetype.Tests.Serialization
namespace Archetype.Tests.Serialization.UseCases
{
[TestFixture]
public class ArchetypeJsonConverterTest
public class ArchetypeJsonConverterTest : ArchetypeJsonConverterTestBase
{
private ContactDetails _contactDetails;
private CompanyDetails _companyDetails;
@@ -60,32 +61,32 @@ namespace Archetype.Tests.Serialization
#region serialization tests
[Test]
public void MergerDetailsModel_Serializes_To_Archetype_Property()
public void Convert_MergerDetailsModel_To_ArchetypeJson()
{
var result = JsonConvert.SerializeObject(_mergerDetails, Formatting.Indented);
var result = ConvertModelToArchetypeJson(_mergerDetails, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._MERGER_DETAILS_JSON, result);
}
[Test]
public void ContactDetailsModel_Serializes_To_Archetype_Property()
public void Convert_ContactDetailsModel_To_ArchetypeJson()
{
var result = JsonConvert.SerializeObject(_contactDetails, Formatting.Indented);
var result = ConvertModelToArchetypeJson(_contactDetails, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._CONTACT_DETAILS_JSON, result);
}
[Test]
public void CompanyDetailsModel_Fieldset_Serializes_As_Expected()
public void Convert_CompanyDetailsModel_To_ArchetypeJson()
{
var result = JsonConvert.SerializeObject(_companyDetails, Formatting.Indented);
var result = ConvertModelToArchetypeJson(_companyDetails, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._COMPANY_DETAILS_JSON, result);
}
[Test]
public void AnnualStatementModel_Fieldset_Serializes_As_Expected()
public void Convert_AnnualStatementModel_To_ArchetypeJson()
{
var result = JsonConvert.SerializeObject(_annualStatement, Formatting.Indented);
var result = ConvertModelToArchetypeJson(_annualStatement, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._ANNUAL_STATEMENT_JSON, result);
@@ -94,14 +95,14 @@ namespace Archetype.Tests.Serialization
[Test]
public void NullValues_Serialize_To_Empty_String()
{
var result = JsonConvert.SerializeObject(new ContactDetails());
var result = ConvertModelToArchetypeJson(new ContactDetails());
Assert.AreEqual(JsonTestStrings._NULL_VALUES_JSON, result);
}
[Test]
public void ConvertModelToArchetype()
public void Convert_ContactDetailsModel_To_Archetype()
{
var model = new ContactDetails
{
@@ -109,25 +110,17 @@ namespace Archetype.Tests.Serialization
Email = "email"
};
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(model);
var archetype = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
Assert.NotNull(ConvertModelToArchetype(model));
}
[Test]
public void ConvertNumericAndDateModelToArchetype()
public void Convert_AnnualStatementModel_To_Archetype()
{
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(_annualStatement);
var archetype = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
Assert.NotNull(ConvertModelToArchetype(_annualStatement));
}
[Test]
public void ConvertCompoundModelToArchetype()
public void Convert_AllContactDetailsModel_To_Archetype()
{
var item1 = new ContactDetails
{
@@ -147,15 +140,11 @@ namespace Archetype.Tests.Serialization
AdminDetails = item2
};
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(model, Formatting.Indented);
var archetype = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
Assert.NotNull(ConvertModelToArchetype(model));
}
[Test]
public void ConvertEnumerableModelToArchetype()
public void Convert_ContactDetailsListModel_To_Archetype()
{
var item1 = new ContactDetails
{
@@ -175,15 +164,11 @@ namespace Archetype.Tests.Serialization
item2
};
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(model, Formatting.Indented);
var archetype = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
Assert.NotNull(ConvertModelToArchetype(model));
}
[Test]
public void ConvertNestedModelToArchetype()
public void Convert_CompanyDetailsModel_To_Archetype()
{
var model = new CompanyDetails
{
@@ -195,11 +180,7 @@ namespace Archetype.Tests.Serialization
}
};
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(model, Formatting.Indented);
var archetype = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
Assert.NotNull(ConvertModelToArchetype(model));
}
#endregion
@@ -207,9 +188,9 @@ namespace Archetype.Tests.Serialization
#region deserialization tests
[Test]
public void DeserializeModelFromArchetype()
public void Convert_ArchetypeJson_To_ContactDetailsModel()
{
var result = JsonConvert.DeserializeObject<ContactDetails>(JsonTestStrings._CONTACT_DETAILS_JSON);
var result = ConvertArchetypeJsonToModel<ContactDetails>(JsonTestStrings._CONTACT_DETAILS_JSON);
Assert.NotNull(result);
Assert.IsInstanceOf<ContactDetails>(result);
@@ -228,9 +209,9 @@ namespace Archetype.Tests.Serialization
}
[Test]
public void DeserializeNumericAndDateModelFromArchetype()
public void Convert_ArchetypeJson_To_AnnualStatementModel()
{
var result = JsonConvert.DeserializeObject<AnnualStatement>(JsonTestStrings._ANNUAL_STATEMENT_JSON);
var result = ConvertArchetypeJsonToModel<AnnualStatement>(JsonTestStrings._ANNUAL_STATEMENT_JSON);
Assert.NotNull(result);
Assert.IsInstanceOf<AnnualStatement>(result);
@@ -244,7 +225,7 @@ namespace Archetype.Tests.Serialization
}
[Test]
public void DeserializeNumericAndDateModel_NullableDate_HasValue_FromArchetype()
public void Convert_ArchetypeJson_To_AnnualStatementModel_NullableDate_HasValue()
{
var annualStatement = new AnnualStatement
{
@@ -256,8 +237,7 @@ namespace Archetype.Tests.Serialization
Profit = 1123456.78m
};
var json = JsonConvert.SerializeObject(annualStatement);
var result = JsonConvert.DeserializeObject<AnnualStatement>(json);
var result = ConvertModelToArchetypeAndBack(annualStatement);
Assert.NotNull(result);
Assert.IsInstanceOf<AnnualStatement>(result);
@@ -271,7 +251,7 @@ namespace Archetype.Tests.Serialization
}
[Test]
public void DeserializeCompoundModelFromArchetype()
public void Convert_ArchetypeJson_To_AllContactDetailsModel()
{
var item1 = new ContactDetails
{
@@ -291,8 +271,7 @@ namespace Archetype.Tests.Serialization
AdminDetails = item2
};
var json = JsonConvert.SerializeObject(model, Formatting.Indented);
var result = JsonConvert.DeserializeObject<AllContactDetails>(json);
var result = ConvertModelToArchetypeAndBack(model);
Assert.NotNull(result);
Assert.IsInstanceOf<AllContactDetails>(result);
@@ -304,7 +283,7 @@ namespace Archetype.Tests.Serialization
}
[Test]
public void DeserializeEnumerableModelFromArchetype()
public void Convert_ArchetypeJson_To_ContactDetailsListModel()
{
var item1 = new ContactDetails
{
@@ -324,8 +303,7 @@ namespace Archetype.Tests.Serialization
item2
};
var json = JsonConvert.SerializeObject(model, Formatting.Indented);
var result = JsonConvert.DeserializeObject<ContactDetailsList>(json);
var result = ConvertModelToArchetypeAndBack(model);
Assert.NotNull(result);
Assert.IsInstanceOf<ContactDetailsList>(result);
@@ -338,7 +316,7 @@ namespace Archetype.Tests.Serialization
}
[Test]
public void DeserializeNestedModelFromArchetype()
public void Convert_ArchetypeJson_To_CompanyDetailsModel()
{
var model = new CompanyDetails
{
@@ -350,8 +328,7 @@ namespace Archetype.Tests.Serialization
}
};
var json = JsonConvert.SerializeObject(model, Formatting.Indented);
var result = JsonConvert.DeserializeObject<CompanyDetails>(json);
var result = ConvertModelToArchetypeAndBack(model);
Assert.NotNull(result);
Assert.IsInstanceOf<CompanyDetails>(result);
@@ -1,12 +1,13 @@
using System.Linq;
using Archetype.PropertyConverters;
using Archetype.Tests.Serialization.Base;
using Newtonsoft.Json;
using NUnit.Framework;
namespace Archetype.Tests.Serialization
namespace Archetype.Tests.Serialization.UseCases.Complex
{
[TestFixture]
public class ArchetypeJsonConverterComplexModelTest
public class ArchetypeJsonConverterTest : ArchetypeJsonConverterTestBase
{
private TextList _textList;
private Captions _captions;
@@ -27,26 +28,22 @@ namespace Archetype.Tests.Serialization
#region complex nested model tests
[Test]
public void PageDetailsModel_Serializes_To_Archetype_Property()
public void Convert_PageDetailsModel_To_ArchetypeJson()
{
var result = JsonConvert.SerializeObject(_pageDetails, Formatting.Indented);
var result = ConvertModelToArchetypeJson(_pageDetails, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._PAGE_DETAILS_JSON, result);
}
[Test]
public void ConvertComplexModelToArchetype()
public void Convert_PageDetailsModel_To_Archetype()
{
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(_pageDetails, Formatting.Indented);
var archetype = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
Assert.NotNull(ConvertModelToArchetype(_pageDetails));
}
[Test]
public void DeserializeComplexModelFromArchetype()
public void Convert_ArchetypeJson_To_PageDetailsModel()
{
var result = JsonConvert.DeserializeObject<PageDetails>(JsonTestStrings._PAGE_DETAILS_JSON);
var result = ConvertArchetypeJsonToModel<PageDetails>(JsonTestStrings._PAGE_DETAILS_JSON);
Assert.NotNull(result);
Assert.IsInstanceOf<PageDetails>(result);
@@ -59,10 +56,9 @@ namespace Archetype.Tests.Serialization
}
[Test]
public void SerializeThenDeserializeComplexModelFromArchetype()
public void Convert_PageDetailsModel_To_Archetype_AndBack()
{
var json = JsonConvert.SerializeObject(_pageDetails);
var result = JsonConvert.DeserializeObject<PageDetails>(json);
var result = ConvertModelToArchetypeAndBack(_pageDetails);
Assert.NotNull(result);
Assert.IsInstanceOf<PageDetails>(result);
@@ -78,26 +74,22 @@ namespace Archetype.Tests.Serialization
#region complex nested tree model tests
[Test]
public void ConvertComplexNestedModelToArchetype()
public void Convert_PagesModel_To_Archetype()
{
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(_pages, Formatting.Indented);
var archetype = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
Assert.NotNull(ConvertModelToArchetype(_pages));
}
[Test]
public void PagesModel_Serializes_To_Archetype_Property()
public void Convert_PagesModel_To_ArchetypeJson()
{
var result = JsonConvert.SerializeObject(_pages, Formatting.Indented);
var result = ConvertModelToArchetypeJson(_pages, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._PAGES_JSON, result);
}
[Test]
public void DeserializeComplexTreeModelFromArchetype()
public void Convert_ArchetypeJson_To_PagesModel()
{
var result = JsonConvert.DeserializeObject<PageList>(JsonTestStrings._PAGES_JSON);
var result = ConvertArchetypeJsonToModel<PageList>(JsonTestStrings._PAGES_JSON);
Assert.NotNull(result);
Assert.IsInstanceOf<PageList>(result);
@@ -124,10 +116,9 @@ namespace Archetype.Tests.Serialization
}
[Test]
public void SerializeThenDeserializeComplexTreeModelFromArchetype()
public void Convert_PagesModel_To_Archetype_AndBack()
{
var json = JsonConvert.SerializeObject(_pages);
var result = JsonConvert.DeserializeObject<PageList>(json);
var result = ConvertModelToArchetypeAndBack(_pages);
Assert.NotNull(result);
Assert.IsInstanceOf<PageList>(result);
@@ -0,0 +1,92 @@
using System.Collections.Generic;
using Archetype.Serialization;
using Newtonsoft.Json;
namespace Archetype.Tests.Serialization.UseCases.Complex
{
#region complex nested model
[AsArchetype("pages")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class PageDetails
{
[JsonProperty("pages")]
public string Pages { get; set; }
[AsFieldset]
[JsonProperty("captions")]
public Captions Captions { get; set; }
}
[AsArchetype("captions")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Captions
{
[JsonProperty("captions")]
public TextList TextStringArray { get; set; }
}
[AsArchetype("textstringArray")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextList : List<TextItem>
{
}
[AsArchetype("textstringArray")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextItem
{
[JsonProperty("textstring")]
public string TextString { get; set; }
}
#endregion
#region complex nested tree model
public abstract class PageBase
{
public string PageTitle { get; set; }
public string BodyText { get; set; }
}
[AsArchetype("slideShow")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SlideShow
{
public string Slides { get; set; }
}
[AsArchetype("seo")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Seo
{
public string MetaTitle { get; set; }
public string MetaDescription { get; set; }
}
[AsArchetype("TextPage")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextPage : PageBase
{
[AsFieldset]
public SlideShow Media { get; set; }
[AsFieldset]
public Seo Seo { get; set; }
}
[AsArchetype("TextPageList")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextPageList : List<TextPage>
{
}
[AsArchetype("Pages")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class PageList
{
public TextPageList Pages { get; set; }
}
#endregion
}
@@ -1,435 +1,245 @@
namespace Archetype.Tests.Serialization
{
public class JsonTestStrings
{
public const string _MERGER_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""mergerDetails"",
""properties"": [
{
""alias"": ""MergerDate"",
""value"": ""07/06/2014 08:09:10""
}
]
}
]
}";
public const string _ANNUAL_STATEMENT_JSON =
@"{
""fieldsets"": [
{
""alias"": ""annualStatement"",
""properties"": [
{
""alias"": ""FiscalYearStart"",
""value"": ""01/09/2013 00:00:00""
},
{
""alias"": ""FiscalYearEnd"",
""value"": ""31/08/2014 00:00:00""
},
{
""alias"": ""DividendPaymentDate"",
""value"": """"
},
{
""alias"": ""TotalShares"",
""value"": ""345678""
},
{
""alias"": ""Sales"",
""value"": ""123456700.89""
},
{
""alias"": ""Profit"",
""value"": ""1123456.78""
}
]
}
]
}";
public const string _CONTACT_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""contactDetails"",
""properties"": [
{
""alias"": ""name"",
""value"": ""Test""
},
{
""alias"": ""address"",
""value"": ""Test Address""
},
{
""alias"": ""telephone"",
""value"": ""111""
},
{
""alias"": ""mobile"",
""value"": ""000""
},
{
""alias"": ""fax"",
""value"": ""000""
},
{
""alias"": ""email"",
""value"": ""test@test.com""
},
{
""alias"": ""webSite"",
""value"": {
""fieldsets"": [
{
""alias"": ""urlPicker"",
""properties"": [
{
""alias"": ""title"",
""value"": ""The Test Company""
},
{
""alias"": ""url"",
""value"": ""http://test.com""
},
{
""alias"": ""content"",
""value"": """"
},
{
""alias"": ""media"",
""value"": """"
},
{
""alias"": ""openInNewWindow"",
""value"": ""1""
}
]
}
]
}
}
]
}
]
}";
public const string _COMPANY_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""companyDetails"",
""properties"": [
{
""alias"": ""region"",
""value"": ""Test Region""
},
{
""alias"": ""contactDetails"",
""value"": {
""fieldsets"": [
{
""alias"": ""contactDetails"",
""properties"": [
{
""alias"": ""name"",
""value"": ""Test""
},
{
""alias"": ""address"",
""value"": ""Test Address""
},
{
""alias"": ""telephone"",
""value"": ""111""
},
{
""alias"": ""mobile"",
""value"": ""000""
},
{
""alias"": ""fax"",
""value"": ""000""
},
{
""alias"": ""email"",
""value"": ""test@test.com""
},
{
""alias"": ""webSite"",
""value"": {
""fieldsets"": [
{
""alias"": ""urlPicker"",
""properties"": [
{
""alias"": ""title"",
""value"": ""The Test Company""
},
{
""alias"": ""url"",
""value"": ""http://test.com""
},
{
""alias"": ""content"",
""value"": """"
},
{
""alias"": ""media"",
""value"": """"
},
{
""alias"": ""openInNewWindow"",
""value"": ""1""
}
]
}
]
}
}
]
}
]
}
}
]
}
]
}";
public const string _PAGE_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""pages"",
""properties"": [
{
""alias"": ""pages"",
""value"": ""2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453""
}
]
},
{
""alias"": ""captions"",
""properties"": [
{
""alias"": ""captions"",
""value"": {
""fieldsets"": [
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""First Page""
}
]
},
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Second Page""
}
]
},
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Third Page""
}
]
},
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Fourth Page""
}
]
}
]
}
}
]
}
]
}";
public const string _PAGES_JSON =
@"{
""fieldsets"": [
{
""alias"": ""Pages"",
""properties"": [
{
""alias"": ""Pages"",
""value"": {
""fieldsets"": [
{
""alias"": ""TextPage"",
""properties"": [
{
""alias"": ""Media"",
""value"": {
""fieldsets"": [
{
""alias"": ""slideShow"",
""properties"": [
{
""alias"": ""Slides"",
""value"": ""1,2,3,4,5,6,7,8""
}
]
}
]
}
},
{
""alias"": ""Seo"",
""value"": {
""fieldsets"": [
{
""alias"": ""seo"",
""properties"": [
{
""alias"": ""MetaTitle"",
""value"": ""Test Meta Title""
},
{
""alias"": ""MetaDescription"",
""value"": ""Test Meta Description""
}
]
}
]
}
},
{
""alias"": ""PageTitle"",
""value"": ""Home Page""
},
{
""alias"": ""BodyText"",
""value"": ""Home Page Body""
}
]
},
{
""alias"": ""TextPage"",
""properties"": [
{
""alias"": ""Media"",
""value"": {
""fieldsets"": [
{
""alias"": ""slideShow"",
""properties"": [
{
""alias"": ""Slides"",
""value"": ""1,2,3,4,5,6,7,8""
}
]
}
]
}
},
{
""alias"": ""Seo"",
""value"": {
""fieldsets"": [
{
""alias"": ""seo"",
""properties"": [
{
""alias"": ""MetaTitle"",
""value"": ""Test Meta Title""
},
{
""alias"": ""MetaDescription"",
""value"": ""Test Meta Description""
}
]
}
]
}
},
{
""alias"": ""PageTitle"",
""value"": ""About us Page""
},
{
""alias"": ""BodyText"",
""value"": ""About us Page Body""
}
]
},
{
""alias"": ""TextPage"",
""properties"": [
{
""alias"": ""Media"",
""value"": {
""fieldsets"": [
{
""alias"": ""slideShow"",
""properties"": [
{
""alias"": ""Slides"",
""value"": ""1,2,3,4,5,6,7,8""
}
]
}
]
}
},
{
""alias"": ""Seo"",
""value"": {
""fieldsets"": [
{
""alias"": ""seo"",
""properties"": [
{
""alias"": ""MetaTitle"",
""value"": ""Test Meta Title""
},
{
""alias"": ""MetaDescription"",
""value"": ""Test Meta Description""
}
]
}
]
}
},
{
""alias"": ""PageTitle"",
""value"": ""Contact us Page""
},
{
""alias"": ""BodyText"",
""value"": ""Contact us Page Body""
}
]
}
]
}
}
]
}
]
}";
public const string _NULL_VALUES_JSON = @"{""fieldsets"":[{""alias"":""contactDetails"",""properties"":[{""alias"":""name"",""value"":""""},{""alias"":""address"",""value"":""""},{""alias"":""telephone"",""value"":""""},{""alias"":""mobile"",""value"":""""},{""alias"":""fax"",""value"":""""},{""alias"":""email"",""value"":""""},{""alias"":""webSite"",""value"":""""}]}]}";
}
}
namespace Archetype.Tests.Serialization.UseCases.Complex
{
public class JsonTestStrings
{
public const string _PAGE_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""captions"",
""properties"": [
{
""alias"": ""captions"",
""value"": {
""fieldsets"": [
{
""alias"": ""captions"",
""properties"": [
{
""alias"": ""captions"",
""value"": {
""fieldsets"": [
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""First Page""
}
]
},
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Second Page""
}
]
},
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Third Page""
}
]
},
{
""alias"": ""textstringArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Fourth Page""
}
]
}
]
}
}
]
}
]
}
}
]
},
{
""alias"": ""pages"",
""properties"": [
{
""alias"": ""pages"",
""value"": ""2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453""
}
]
}
]
}";
public const string _PAGES_JSON =
@"{
""fieldsets"": [
{
""alias"": ""Pages"",
""properties"": [
{
""alias"": ""Pages"",
""value"": {
""fieldsets"": [
{
""alias"": ""TextPage"",
""properties"": [
{
""alias"": ""Media"",
""value"": {
""fieldsets"": [
{
""alias"": ""slideShow"",
""properties"": [
{
""alias"": ""Slides"",
""value"": ""1,2,3,4,5,6,7,8""
}
]
}
]
}
},
{
""alias"": ""Seo"",
""value"": {
""fieldsets"": [
{
""alias"": ""seo"",
""properties"": [
{
""alias"": ""MetaTitle"",
""value"": ""Test Meta Title""
},
{
""alias"": ""MetaDescription"",
""value"": ""Test Meta Description""
}
]
}
]
}
},
{
""alias"": ""PageTitle"",
""value"": ""Home Page""
},
{
""alias"": ""BodyText"",
""value"": ""Home Page Body""
}
]
},
{
""alias"": ""TextPage"",
""properties"": [
{
""alias"": ""Media"",
""value"": {
""fieldsets"": [
{
""alias"": ""slideShow"",
""properties"": [
{
""alias"": ""Slides"",
""value"": ""1,2,3,4,5,6,7,8""
}
]
}
]
}
},
{
""alias"": ""Seo"",
""value"": {
""fieldsets"": [
{
""alias"": ""seo"",
""properties"": [
{
""alias"": ""MetaTitle"",
""value"": ""Test Meta Title""
},
{
""alias"": ""MetaDescription"",
""value"": ""Test Meta Description""
}
]
}
]
}
},
{
""alias"": ""PageTitle"",
""value"": ""About us Page""
},
{
""alias"": ""BodyText"",
""value"": ""About us Page Body""
}
]
},
{
""alias"": ""TextPage"",
""properties"": [
{
""alias"": ""Media"",
""value"": {
""fieldsets"": [
{
""alias"": ""slideShow"",
""properties"": [
{
""alias"": ""Slides"",
""value"": ""1,2,3,4,5,6,7,8""
}
]
}
]
}
},
{
""alias"": ""Seo"",
""value"": {
""fieldsets"": [
{
""alias"": ""seo"",
""properties"": [
{
""alias"": ""MetaTitle"",
""value"": ""Test Meta Title""
},
{
""alias"": ""MetaDescription"",
""value"": ""Test Meta Description""
}
]
}
]
}
},
{
""alias"": ""PageTitle"",
""value"": ""Contact us Page""
},
{
""alias"": ""BodyText"",
""value"": ""Contact us Page Body""
}
]
}
]
}
}
]
}
]
}";
}
}
@@ -0,0 +1,143 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Archetype.Models;
using Archetype.PropertyConverters;
using Archetype.Tests.Serialization.Base;
using Newtonsoft.Json;
using NUnit.Framework;
namespace Archetype.Tests.Serialization.UseCases.Enumerable
{
[TestFixture]
public class ArchetypeJsonConverterTest : ArchetypeJsonConverterTestBase
{
private Feedbacks _feedbacks;
private Captions _captions;
[SetUp]
public void SetUp()
{
_feedbacks = new Feedbacks
{
new Feedback{Testimonial = "Testimonial 1"},
new Feedback{Testimonial = "Testimonial 2"},
new Feedback{Testimonial = "Testimonial 3"}
};
_captions = new Captions()
{
TextArray = new List<Text>
{
new Text{TextString = "Caption 1"},
new Text{TextString = "Caption 2"},
new Text{TextString = "Caption 3"}
}
};
}
#region Feedback - single fieldset with multiple items
[Test]
public void Convert_FeedbackModel_To_Archetype()
{
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(_feedbacks);
var archetype = (ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
}
[Test]
public void Convert_FeedbackModel_To_ArchetypeJson()
{
var json = ConvertModelToArchetypeJson(_feedbacks, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._FEEDBACK_JSON, json);
}
[Test]
public void Convert_ArchetypeJson_To_FeedbackModel()
{
var result = ConvertArchetypeJsonToModel<Feedbacks>(JsonTestStrings._FEEDBACK_JSON);
Assert.NotNull(result);
Assert.AreEqual(3, result.Count);
foreach (var feedback in result)
{
Assert.AreEqual(String.Format("Testimonial {0}", result.IndexOf(feedback) + 1),
feedback.Testimonial);
}
}
[Test]
public void Convert_FeedbackModel_To_Archetype_AndBack()
{
var result = ConvertModelToArchetypeAndBack(_feedbacks);
Assert.NotNull(result);
Assert.AreEqual(3, result.Count);
foreach (var feedback in result)
{
var index = result.IndexOf(feedback);
Assert.AreEqual(_feedbacks.ElementAt(index).Testimonial, feedback.Testimonial);
}
}
#endregion
#region Captions - a root fieldset which contains another fieldset list
[Test]
public void Convert_CaptionsModel_To_Archetype()
{
var converter = new ArchetypeValueConverter();
var json = JsonConvert.SerializeObject(_captions);
var archetype = (ArchetypeModel)converter.ConvertDataToSource(null, json, false);
Assert.NotNull(archetype);
}
[Test]
public void Convert_CaptionsModel_To_ArchetypeJson()
{
var json = ConvertModelToArchetypeJson(_captions, Formatting.Indented);
Assert.AreEqual(JsonTestStrings._CAPTIONS_JSON, json);
}
[Test]
public void Convert_ArchetypeJson_To_CaptionsModel()
{
var result = ConvertArchetypeJsonToModel<Captions>(JsonTestStrings._CAPTIONS_JSON);
Assert.NotNull(result);
Assert.NotNull(result.TextArray);
Assert.AreEqual(3, result.TextArray.Count);
foreach (var caption in result.TextArray)
{
Assert.AreEqual(String.Format("Caption {0}", result.TextArray.IndexOf(caption) + 1),
caption.TextString);
}
}
[Test]
public void Convert_CaptionsModel_To_Archetype_AndBack()
{
var result = ConvertModelToArchetypeAndBack(_captions);
Assert.NotNull(result);
Assert.NotNull(result.TextArray);
Assert.AreEqual(3, result.TextArray.Count);
foreach (var caption in result.TextArray)
{
var index = result.TextArray.IndexOf(caption);
Assert.AreEqual(_captions.TextArray.ElementAt(index).TextString, caption.TextString);
}
}
#endregion
}
}
@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using Archetype.Serialization;
using Newtonsoft.Json;
namespace Archetype.Tests.Serialization.UseCases.Enumerable
{
#region Feedback - single fieldset with multiple items
[AsArchetype("feedbacks")] /* Note: when inheriting from a list, archetype alias is not used */
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Feedbacks : List<Feedback>
{
}
[AsArchetype("feedback")] /* Must have same archetype alias as list class */
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Feedback
{
[JsonProperty("testimonial")]
public String Testimonial { get; set; }
}
#endregion
#region Captions - a root fieldset which contains another fieldset list
[AsArchetype("captions")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Captions
{
[JsonProperty("captions")]
public List<Text> TextArray { get; set; }
}
[AsArchetype("textArray")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Text
{
[JsonProperty("textstring")]
public String TextString { get; set; }
}
#endregion
[AsArchetype("aboutUs")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class AboutUs
{
[AsFieldset]
[JsonProperty("contacts")]
public IEnumerable<ContactDetails> Contacts { get; set; }
[AsFieldset]
[JsonProperty("testimonials")]
public IEnumerable<String> Testimonials { get; set; }
}
}
@@ -0,0 +1,86 @@
namespace Archetype.Tests.Serialization.UseCases.Enumerable
{
public class JsonTestStrings
{
public const string _ABOUT_US_JSON =
@"";
public const string _FEEDBACK_JSON =
@"{
""fieldsets"": [
{
""alias"": ""feedback"",
""properties"": [
{
""alias"": ""testimonial"",
""value"": ""Testimonial 1""
}
]
},
{
""alias"": ""feedback"",
""properties"": [
{
""alias"": ""testimonial"",
""value"": ""Testimonial 2""
}
]
},
{
""alias"": ""feedback"",
""properties"": [
{
""alias"": ""testimonial"",
""value"": ""Testimonial 3""
}
]
}
]
}";
public const string _CAPTIONS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""captions"",
""properties"": [
{
""alias"": ""captions"",
""value"": {
""fieldsets"": [
{
""alias"": ""textArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Caption 1""
}
]
},
{
""alias"": ""textArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Caption 2""
}
]
},
{
""alias"": ""textArray"",
""properties"": [
{
""alias"": ""textstring"",
""value"": ""Caption 3""
}
]
}
]
}
}
]
}
]
}";
}
}
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using Archetype.Serialization;
using Newtonsoft.Json;
namespace Archetype.Tests.Serialization
namespace Archetype.Tests.Serialization.UseCases
{
#region json test Models
@@ -89,91 +89,5 @@ namespace Archetype.Tests.Serialization
public decimal MergerValue { get; set; }
}
#endregion
#region complex nested model
[AsArchetype("pages")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class PageDetails
{
[JsonProperty("pages")]
public string Pages { get; set; }
[AsFieldset]
[JsonProperty("captions")]
public Captions Captions { get; set; }
}
[AsArchetype("captions")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Captions
{
[JsonProperty("captions")]
public TextList TextStringArray { get; set; }
}
[AsArchetype("textstringArray")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextList : List<TextItem>
{
}
[AsArchetype("textstringArray")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextItem
{
[JsonProperty("textstring")]
public string TextString { get; set; }
}
#endregion
#region complex nested tree model
public abstract class PageBase
{
public string PageTitle { get; set; }
public string BodyText { get; set; }
}
[AsArchetype("slideShow")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class SlideShow
{
public string Slides { get; set; }
}
[AsArchetype("seo")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class Seo
{
public string MetaTitle { get; set; }
public string MetaDescription { get; set; }
}
[AsArchetype("TextPage")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextPage : PageBase
{
[AsFieldset]
public SlideShow Media { get; set; }
[AsFieldset]
public Seo Seo { get; set; }
}
[AsArchetype("TextPageList")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class TextPageList : List<TextPage>
{
}
[AsArchetype("Pages")]
[JsonConverter(typeof(ArchetypeJsonConverter))]
public class PageList
{
public TextPageList Pages { get; set; }
}
#endregion
#endregion
}
@@ -0,0 +1,207 @@
namespace Archetype.Tests.Serialization.UseCases
{
public class JsonTestStrings
{
public const string _MERGER_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""mergerDetails"",
""properties"": [
{
""alias"": ""MergerDate"",
""value"": ""07/06/2014 08:09:10""
}
]
}
]
}";
public const string _ANNUAL_STATEMENT_JSON =
@"{
""fieldsets"": [
{
""alias"": ""annualStatement"",
""properties"": [
{
""alias"": ""FiscalYearStart"",
""value"": ""01/09/2013 00:00:00""
},
{
""alias"": ""FiscalYearEnd"",
""value"": ""31/08/2014 00:00:00""
},
{
""alias"": ""DividendPaymentDate"",
""value"": """"
},
{
""alias"": ""TotalShares"",
""value"": ""345678""
},
{
""alias"": ""Sales"",
""value"": ""123456700.89""
},
{
""alias"": ""Profit"",
""value"": ""1123456.78""
}
]
}
]
}";
public const string _CONTACT_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""contactDetails"",
""properties"": [
{
""alias"": ""name"",
""value"": ""Test""
},
{
""alias"": ""address"",
""value"": ""Test Address""
},
{
""alias"": ""telephone"",
""value"": ""111""
},
{
""alias"": ""mobile"",
""value"": ""000""
},
{
""alias"": ""fax"",
""value"": ""000""
},
{
""alias"": ""email"",
""value"": ""test@test.com""
},
{
""alias"": ""webSite"",
""value"": {
""fieldsets"": [
{
""alias"": ""urlPicker"",
""properties"": [
{
""alias"": ""title"",
""value"": ""The Test Company""
},
{
""alias"": ""url"",
""value"": ""http://test.com""
},
{
""alias"": ""content"",
""value"": """"
},
{
""alias"": ""media"",
""value"": """"
},
{
""alias"": ""openInNewWindow"",
""value"": ""1""
}
]
}
]
}
}
]
}
]
}";
public const string _COMPANY_DETAILS_JSON =
@"{
""fieldsets"": [
{
""alias"": ""companyDetails"",
""properties"": [
{
""alias"": ""region"",
""value"": ""Test Region""
},
{
""alias"": ""contactDetails"",
""value"": {
""fieldsets"": [
{
""alias"": ""contactDetails"",
""properties"": [
{
""alias"": ""name"",
""value"": ""Test""
},
{
""alias"": ""address"",
""value"": ""Test Address""
},
{
""alias"": ""telephone"",
""value"": ""111""
},
{
""alias"": ""mobile"",
""value"": ""000""
},
{
""alias"": ""fax"",
""value"": ""000""
},
{
""alias"": ""email"",
""value"": ""test@test.com""
},
{
""alias"": ""webSite"",
""value"": {
""fieldsets"": [
{
""alias"": ""urlPicker"",
""properties"": [
{
""alias"": ""title"",
""value"": ""The Test Company""
},
{
""alias"": ""url"",
""value"": ""http://test.com""
},
{
""alias"": ""content"",
""value"": """"
},
{
""alias"": ""media"",
""value"": """"
},
{
""alias"": ""openInNewWindow"",
""value"": ""1""
}
]
}
]
}
}
]
}
]
}
}
]
}
]
}";
public const string _NULL_VALUES_JSON = @"{""fieldsets"":[{""alias"":""contactDetails"",""properties"":[{""alias"":""name"",""value"":""""},{""alias"":""address"",""value"":""""},{""alias"":""telephone"",""value"":""""},{""alias"":""mobile"",""value"":""""},{""alias"":""fax"",""value"":""""},{""alias"":""email"",""value"":""""},{""alias"":""webSite"",""value"":""""}]}]}";
}
}
@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<!--
umbracoSettings.config configuration documentation can be found here:
http://our.umbraco.org/documentation/using-umbraco/config-files/umbracoSettings/
Many of the optional settings are not explicitly listed here
but can be found in the online documentation.
-->
<content>
<errors>
<error404>1</error404>
<!--
<error404>
<errorPage culture="default">1</errorPage>
<errorPage culture="en-US">200</errorPage>
</error404>
-->
</errors>
<notifications>
<!-- the email that should be used as from mail when umbraco sends a notification -->
<email>your@email.here</email>
</notifications>
<!-- Show property descriptions in editing view "icon|text|none" -->
<PropertyContextHelpOption>text</PropertyContextHelpOption>
<!-- The html injected into a (x)html page if Umbraco is running in preview mode -->
<PreviewBadge><![CDATA[<a id="umbracoPreviewBadge" style="position: absolute; top: 0; right: 0; border: 0; width: 149px; height: 149px; background: url('{1}/preview/previewModeBadge.png') no-repeat;" href="{0}/endPreview.aspx?redir={2}"><span style="display:none;">In Preview Mode - click to end</span></a>]]></PreviewBadge>
<!-- Cache cycle of Media and Member data fetched from the umbraco.library methods -->
<!-- In seconds. 0 will disable cache -->
<UmbracoLibraryCacheDuration>1800</UmbracoLibraryCacheDuration>
<!-- How Umbraco should handle errors during macro execution. Can be one of the following values:
- inline - show an inline error within the macro but allow the page to continue rendering. Historial Umbraco behaviour.
- silent - Silently suppress the error and do not render the offending macro.
- throw - Throw an exception which can be caught by the global error handler defined in Application_OnError. If no such
error handler is defined then you'll see the Yellow Screen Of Death (YSOD) error page.
Note the error can also be handled by the umbraco.macro.Error event, where you can log/alarm with your own code and change the behaviour per event. -->
<MacroErrors>inline</MacroErrors>
<!-- These file types will not be allowed to be uploaded via the upload control for media and content -->
<disallowedUploadFiles>ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd</disallowedUploadFiles>
<!-- Defines the default document type property used when adding properties in the back-office (if missing or empty, defaults to Textstring -->
<defaultDocumentTypeProperty>Textstring</defaultDocumentTypeProperty>
</content>
<security>
<!-- set to true to auto update login interval (and there by disabling the lock screen -->
<keepUserLoggedIn>false</keepUserLoggedIn>
<!-- change in 4.8: Disabled users are now showed dimmed and last in the tree. If you prefer not to display them set this to true -->
<hideDisabledUsersInBackoffice>false</hideDisabledUsersInBackoffice>
</security>
<requestHandler>
<!-- this will ensure that urls are unique when running with multiple root nodes -->
<useDomainPrefixes>false</useDomainPrefixes>
<!-- this will add a trailing slash (/) to urls when in directory url mode -->
<addTrailingSlash>true</addTrailingSlash>
</requestHandler>
<templates>
<!-- To switch the default rendering engine to MVC, change this value from WebForms to Mvc -->
<defaultRenderingEngine>Mvc</defaultRenderingEngine>
</templates>
<scheduledTasks>
<!-- add tasks that should be called with an interval (seconds) -->
<!-- <task log="true" alias="test60" interval="60" url="http://localhost/umbraco/test.aspx"/>-->
</scheduledTasks>
<!-- distributed calls make umbraco use webservices to handle cache refreshing -->
<distributedCall enable="false">
<!-- the id of the user who's making the calls -->
<!-- needed for security, umbraco will automatically look up correct login and passwords -->
<user>0</user>
<servers>
<!-- add ip number or hostname, make sure that it can be reached from all servers -->
<!-- you can also add optional attributes to force a protocol or port number (see #2) -->
<!-- <server>127.0.0.1</server>-->
<!-- <server forceProtocol="http|https" forcePortnumber="80|443">127.0.0.1</server>-->
</servers>
</distributedCall>
<!--
web.routing
@trySkipIisCustomErrors
Tries to skip IIS custom errors.
Starting with IIS 7.5, this must be set to true for Umbraco 404 pages to show. Else, IIS will take
over and render its build-in error page. See MS doc for HttpResponseBase.TrySkipIisCustomErrors.
The default value is false, for backward compatibility reasons, which means that IIS _will_ take
over, and _prevent_ Umbraco 404 pages to show.
@internalRedirectPreservesTemplate
By default as soon as we're not displaying the initial document, we reset the template set by the
finder or by the alt. template. Set this option to true to preserve the template set by the finder
or by the alt. template, in case of an internal redirect.
(false by default, and in fact should remain false unless you know what you're doing)
-->
<web.routing
trySkipIisCustomErrors="false"
internalRedirectPreservesTemplate="false">
</web.routing>
</settings>
+9 -1
View File
@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<configSections>
<sectionGroup name="umbracoConfiguration">
<section name="settings" type="Umbraco.Core.Configuration.UmbracoSettings.UmbracoSettingsSection, Umbraco.Core" requirePermission="false" />
</sectionGroup>
</configSections>
<umbracoConfiguration>
<settings configSource="config\umbracoSettings.config" />
</umbracoConfiguration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+39 -39
View File
@@ -1,39 +1,39 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Umbraco", "Umbraco.Archetype\Archetype.Umbraco.csproj", "{7D185D41-4228-4978-ACB8-83F9A48AD94F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D84AA4ED-85A6-484F-9E72-BE7AC9835821}"
ProjectSection(SolutionItems) = preProject
.nuget\NuGet.Config = .nuget\NuGet.Config
.nuget\NuGet.exe = .nuget\NuGet.exe
.nuget\NuGet.targets = .nuget\NuGet.targets
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Tests", "Archetype.Tests\Archetype.Tests.csproj", "{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DatabaseSizer", "DatabaseSizer\DatabaseSizer.csproj", "{0114C963-C514-49C1-B7AB-DCB1825F498C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Release|Any CPU.Build.0 = Release|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.Build.0 = Release|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Umbraco", "Umbraco.Archetype\Archetype.Umbraco.csproj", "{7D185D41-4228-4978-ACB8-83F9A48AD94F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D84AA4ED-85A6-484F-9E72-BE7AC9835821}"
ProjectSection(SolutionItems) = preProject
.nuget\NuGet.Config = .nuget\NuGet.Config
.nuget\NuGet.exe = .nuget\NuGet.exe
.nuget\NuGet.targets = .nuget\NuGet.targets
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Tests", "Archetype.Tests\Archetype.Tests.csproj", "{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DatabaseSizer", "DatabaseSizer\DatabaseSizer.csproj", "{0114C963-C514-49C1-B7AB-DCB1825F498C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D185D41-4228-4978-ACB8-83F9A48AD94F}.Release|Any CPU.Build.0 = Release|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.Build.0 = Release|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -1,265 +1,266 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7D185D41-4228-4978-ACB8-83F9A48AD94F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Archetype</RootNamespace>
<AssemblyName>Archetype</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AutoMapper.Net4">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="businesslogic">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ClientDependency.Core">
<HintPath>..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ClientDependency.Core.Mvc">
<HintPath>..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="cms">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="controls">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="CookComputing.XmlRpcV2">
<HintPath>..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Examine">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="HtmlAgilityPack">
<HintPath>..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImageProcessor">
<HintPath>..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImageProcessor.Web">
<HintPath>..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="interfaces">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Lucene.Net">
<HintPath>..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.Web.Helpers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Mvc.FixedDisplayModes">
<HintPath>..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="MiniProfiler">
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SQLCE4Umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll</HintPath>
</Reference>
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="TidyNet">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Umbraco.Core">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.DataLayer">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.editorControls">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.MacroEngines">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.providers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Umbraco.Web.UI">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.XmlSerializers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UmbracoExamine">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Api\ArchetypeDataTypeController.cs" />
<Compile Include="Constants.cs" />
<Compile Include="Events\ExpireCache.cs" />
<Compile Include="Extensions\ArchetypeHelper.cs" />
<Compile Include="Extensions\Extensions.cs" />
<Compile Include="Models\ArchetypeModel.cs" />
<Compile Include="Models\ArchetypePreValue.cs" />
<Compile Include="Models\ArchetypePreValueFieldset.cs" />
<Compile Include="Models\ArchetypePreValueProperty.cs" />
<Compile Include="Models\ArchetypeFieldsetModel.cs" />
<Compile Include="Models\ArchetypePropertyModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\VersionInfo.cs" />
<Compile Include="PropertyConverters\ArchetypeValueConverter.cs" />
<Compile Include="Serialization\AsArchetypeAttribute.cs" />
<Compile Include="Serialization\ArchetypeJsonConverter.cs" />
<Compile Include="Serialization\AsFieldsetAttribute.cs" />
<Compile Include="Serialization\SerializationExtensions.cs" />
<Compile Include="PropertyEditors\ArchetypePropertyEditor.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7D185D41-4228-4978-ACB8-83F9A48AD94F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Archetype</RootNamespace>
<AssemblyName>Archetype</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoMapper">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AutoMapper.Net4">
<HintPath>..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="businesslogic">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ClientDependency.Core">
<HintPath>..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ClientDependency.Core.Mvc">
<HintPath>..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="cms">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="controls">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="CookComputing.XmlRpcV2">
<HintPath>..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Examine">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="HtmlAgilityPack">
<HintPath>..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImageProcessor">
<HintPath>..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="ImageProcessor.Web">
<HintPath>..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="interfaces">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Lucene.Net">
<HintPath>..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.ApplicationBlocks.Data">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.Web.Helpers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.Mvc.FixedDisplayModes">
<HintPath>..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="MiniProfiler">
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SQLCE4Umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll</HintPath>
</Reference>
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll</HintPath>
</Reference>
<Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>False</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="TidyNet">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Umbraco.Core">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.DataLayer">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.editorControls">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.MacroEngines">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.providers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Umbraco.Web.UI">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="umbraco.XmlSerializers">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UmbracoExamine">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter">
<HintPath>..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Api\ArchetypeDataTypeController.cs" />
<Compile Include="Constants.cs" />
<Compile Include="Events\ExpireCache.cs" />
<Compile Include="Extensions\ArchetypeHelper.cs" />
<Compile Include="Extensions\Extensions.cs" />
<Compile Include="Models\ArchetypeModel.cs" />
<Compile Include="Models\ArchetypePreValue.cs" />
<Compile Include="Models\ArchetypePreValueFieldset.cs" />
<Compile Include="Models\ArchetypePreValueProperty.cs" />
<Compile Include="Models\ArchetypeFieldsetModel.cs" />
<Compile Include="Models\ArchetypePropertyModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\VersionInfo.cs" />
<Compile Include="PropertyConverters\ArchetypeValueConverter.cs" />
<Compile Include="Serialization\ArchetypeJsonDelinter.cs" />
<Compile Include="Serialization\AsArchetypeAttribute.cs" />
<Compile Include="PropertyEditors\ArchetypePropertyEditor.cs" />
<Compile Include="Serialization\ArchetypeJsonConverter.cs" />
<Compile Include="Serialization\AsFieldsetAttribute.cs" />
<Compile Include="Serialization\SerializationExtensions.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -1,84 +1,82 @@
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Web;
using Archetype.Models;
namespace Archetype.Extensions
{
public static class Extensions
{
//lifted from the core as it is marked 'internal'
public static bool DetectIsJson(this string input)
{
input = input.Trim();
return input.StartsWith("{") && input.EndsWith("}")
|| input.StartsWith("[") && input.EndsWith("]");
}
public static bool IsArchetype(this ArchetypePropertyModel prop)
{
return prop.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditorAlias);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel)
{
return RenderPartials(htmlHelper, archetypeModel, null, null);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath)
{
return RenderPartials(htmlHelper, archetypeModel, partialPath, null);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, ViewDataDictionary viewDataDictionary)
{
return RenderPartials(htmlHelper, archetypeModel, null, viewDataDictionary);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
return RenderPartials(htmlHelper, archetypeModel, partialPath, viewDataDictionary);
}
private static IHtmlString RenderPartials(HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
var context = HttpContext.Current;
if (archetypeModel == null || context == null)
{
return new HtmlString("");
}
var sb = new StringBuilder();
var pathToPartials = "~/Views/Partials/Archetype/";
if (!string.IsNullOrEmpty(partialPath))
{
pathToPartials = partialPath;
}
foreach (var fieldsetModel in archetypeModel)
{
var partial = pathToPartials + fieldsetModel.Alias + ".cshtml";
if (System.IO.File.Exists(context.Server.MapPath(partial)))
{
sb.AppendLine(htmlHelper.Partial(partial, fieldsetModel, viewDataDictionary).ToString());
}
else
{
LogHelper.Info<ArchetypeModel>(string.Format("The partial for {0} could not be found. Please create a partial with that name or rename your alias.", context.Server.MapPath(partial)));
}
}
return new HtmlString(sb.ToString());
}
}
}
using System;
using System.Linq;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Archetype.Models;
namespace Archetype.Extensions
{
public static class Extensions
{
//lifted from the core as it is marked 'internal'
public static bool DetectIsJson(this string input)
{
input = input.Trim();
return input.StartsWith("{") && input.EndsWith("}")
|| input.StartsWith("[") && input.EndsWith("]");
}
public static bool IsArchetype(this ArchetypePropertyModel prop)
{
return prop.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditorAlias);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel)
{
return RenderPartials(htmlHelper, archetypeModel, null, null);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath)
{
return RenderPartials(htmlHelper, archetypeModel, partialPath, null);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, ViewDataDictionary viewDataDictionary)
{
return RenderPartials(htmlHelper, archetypeModel, null, viewDataDictionary);
}
public static IHtmlString RenderArchetypePartials(this HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
return RenderPartials(htmlHelper, archetypeModel, partialPath, viewDataDictionary);
}
private static IHtmlString RenderPartials(HtmlHelper htmlHelper, ArchetypeModel archetypeModel, string partialPath, ViewDataDictionary viewDataDictionary)
{
var context = HttpContext.Current;
if (archetypeModel == null || context == null)
{
return new HtmlString("");
}
var sb = new StringBuilder();
var pathToPartials = "~/Views/Partials/Archetype/";
if (!string.IsNullOrEmpty(partialPath))
{
pathToPartials = partialPath;
}
foreach (var fieldsetModel in archetypeModel)
{
var partial = pathToPartials + fieldsetModel.Alias + ".cshtml";
if (System.IO.File.Exists(context.Server.MapPath(partial)))
{
sb.AppendLine(htmlHelper.Partial(partial, fieldsetModel, viewDataDictionary).ToString());
}
else
{
LogHelper.Info<ArchetypeModel>(string.Format("The partial for {0} could not be found. Please create a partial with that name or rename your alias.", context.Server.MapPath(partial)));
}
}
return new HtmlString(sb.ToString());
}
}
}
@@ -1,7 +1,8 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq;
using Archetype.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -38,7 +39,7 @@ namespace Archetype.Models
.ToList()
.ForEach(x => x.Remove());
return json.ToString(Formatting.None);
return json.ToString(Formatting.None).DelintArchetypeJson();
}
}
}
@@ -1,4 +1,4 @@
using System.Reflection;
[assembly: AssemblyVersion("1.2.1")]
[assembly: AssemblyFileVersion("1.2.1-beta")]
[assembly: AssemblyFileVersion("1.2.1-beta")]
@@ -19,7 +19,8 @@ namespace Archetype.PropertyConverters
public override bool IsConverter(PublishedPropertyType propertyType)
{
return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias);
return !String.IsNullOrEmpty(propertyType.PropertyEditorAlias)
&& propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias);
}
public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview)
@@ -123,8 +123,8 @@ namespace Archetype.PropertyEditors
{
var dtd = ApplicationContext.Current.Services.DataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid));
var preValues = ApplicationContext.Current.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dtd.Id);
var propData = new ContentPropertyData(propDef.Value, preValues, new Dictionary<string, object>());
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
var propData = new ContentPropertyData(propDef.Value, preValues, new Dictionary<string, object>());
var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
propDef.Value = propEditor.ValueEditor.ConvertEditorToDb(propData, propDef.Value);
}
catch (Exception ex)
@@ -135,7 +135,17 @@ namespace Archetype.PropertyEditors
}
return archetype.SerializeForPersistence();
}
}
internal virtual PropertyEditor GetPropertyEditor(IDataTypeDefinition dtd)
{
if (dtd.Id != 0)
return PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias);
return dtd.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias)
? new ArchetypePropertyEditor()
: (PropertyEditor)new TextboxPropertyEditor();
}
}
#endregion
@@ -6,6 +6,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using Archetype.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -13,6 +14,10 @@ namespace Archetype.Serialization
{
public class ArchetypeJsonConverter : JsonConverter
{
private const string _ROOT_FS_ALIAS = "rootFs";
#region public methods
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var models = GenerateModels(value);
@@ -23,13 +28,7 @@ namespace Archetype.Serialization
if (models.Count == 1 && models[0] == null)
return;
var jObj = new JObject
{
{
"fieldsets",
new JArray( new JRaw(SerializeModels(models)))
}
};
var jObj = SerializeModelToFieldset(models);
writer.WriteRaw(ApplyFormatting(jObj.ToString(), writer.Formatting));
}
@@ -41,25 +40,265 @@ namespace Archetype.Serialization
if (jToken == null)
return null;
var obj = Activator.CreateInstance(objectType);
if (null != obj as IEnumerable<object>
&& jToken["fieldsets"] != null && jToken["fieldsets"].Any())
{
return DeserializeEnumerableObject(obj, jToken);
}
return null == jToken as JArray
? DeserializeObject(obj, jToken)
: PopulateProperties(obj, jToken);
return DeserializeJson(objectType, GetDelintedJToken(jToken));
}
public override bool CanConvert(Type objectType)
{
return IsValueArchetypeDatatype(objectType);
return IsTypeArchetypeDatatype(objectType);
}
#region private methods
#endregion
#region private methods - deserialization
private JToken GetDelintedJToken(JToken jToken)
{
return JToken.Parse(jToken.ToString(Formatting.None).DelintArchetypeJson());
}
private object DeserializeJson(Type objectType, JToken jToken)
{
var obj = Activator.CreateInstance(objectType);
if (null != obj as IEnumerable<object>)
{
JToken enumerableToken;
if (TryParseJTokenAsEnumerable(jToken, out enumerableToken)
|| (jToken.SelectToken("value") != null && TryParseJTokenAsEnumerable(jToken["value"], out enumerableToken)))
return DeserializeEnumerableObject(obj, enumerableToken);
}
return null == jToken as JArray
? DeserializeObject(obj, jToken)
: PopulateProperties(obj, jToken);
}
private object DeserializeEnumerableObject(object obj, JToken jToken)
{
var model = obj as IEnumerable<object>;
var fsToken = jToken;
var itemType = model.GetType().GetGenericArguments().FirstOrDefault();
if (itemType == null)
{
itemType = model.GetType().BaseType.GetGenericArguments().First();
fsToken = fsToken["fieldsets"];
}
foreach (var fs in fsToken.Where(fs => fs["alias"].ToString().Equals(GetFieldsetName(itemType))))
{
var item = DeserializeJson(itemType, fs["properties"]);
obj.GetType().GetMethod("Add").Invoke(obj, new[] { item });
}
return obj;
}
private object DeserializeObject(object obj, JToken jToken)
{
if (jToken.SelectToken("value") != null
&& String.IsNullOrEmpty(jToken.SelectToken("value").ToString()))
return obj;
var properties = GetSerialiazableProperties(obj).ToList();
var asFieldset = properties.Where(HasAsFieldsetAttribute).ToList();
foreach (var propInfo in asFieldset)
{
var propAlias = GetJsonPropertyName(propInfo);
var fsJToken = propInfo.PropertyType.Namespace.Equals("System")
? GetFieldsetJTokenFromAlias(propAlias, jToken)
: GetFieldsetJTokenFromPropertyAlias(propInfo, jToken);
var propJToken = GetPropertyJToken(fsJToken, propAlias);
if (propJToken == null)
continue;
var propValue = GetPropertyValue(propInfo, propJToken);
propInfo.SetValue(obj, propValue);
}
if (properties.All(HasAsFieldsetAttribute))
return obj;
var objToken = GetFieldsetJTokenFromTypeAlias(obj.GetType(), jToken);
if (objToken == null)
return obj;
if (objToken.SelectToken("properties") != null)
return PopulateProperties(obj, objToken["properties"]);
if (!(objToken is JArray) || (objToken as JArray).Count <= 0)
return null;
var defaultFsProperties = properties.Where(pInfo => !HasAsFieldsetAttribute(pInfo)).ToList();
foreach (var property in defaultFsProperties)
{
var propJToken = ParseJTokenFromItems(objToken, GetJsonPropertyName(property));
PopulateProperty(obj, propJToken["properties"], property);
}
return PopulateProperties(obj, new JArray(objToken));
}
private JToken GetPropertyJToken(JToken fsJToken, string propAlias)
{
if (fsJToken == null)
return null;
//make recursive
if (fsJToken.SelectToken("properties") != null)
return GetPropertyAliasJToken(propAlias, fsJToken["properties"]);
var nestedPropJToken = fsJToken
.SingleOrDefault(p => p.SelectToken("alias").ToString().Equals(propAlias));
return nestedPropJToken != null ? GetPropertyAliasJToken(propAlias, nestedPropJToken["properties"]) : null;
}
private JToken GetFieldsetJTokenFromTypeAlias(Type objType, JToken jToken)
{
var objAlias = GetFieldsetName(objType);
return GetFieldsetJTokenFromAlias(objAlias, jToken);
}
private JToken GetFieldsetJTokenFromPropertyAlias(PropertyInfo propInfo, JToken jToken)
{
var objAlias = GetJsonPropertyName(propInfo);
return GetFieldsetJTokenFromAlias(objAlias, jToken);
}
private JToken GetFieldsetJTokenFromAlias(string objAlias, JToken jToken)
{
JToken propJToken;
if (TryParseJTokenFromNamedFieldset(jToken, objAlias, out propJToken))
return propJToken;
if (TryParseJTokenFromNestedFieldset(jToken, objAlias, out propJToken))
return propJToken;
if (TryParseJTokenFromDefaultFieldset(jToken, out propJToken))
return propJToken;
return propJToken
?? ParseJTokenFromItem(jToken, objAlias);
}
private object PopulateProperties(object obj, JToken jToken)
{
var properties = GetSerialiazableProperties(obj);
foreach (var propertyInfo in properties)
{
PopulateProperty(obj, jToken, propertyInfo);
}
return obj;
}
private void PopulateProperty(object obj, JToken jToken, PropertyInfo propertyInfo)
{
var propAlias = GetJsonPropertyName(propertyInfo);
var propJToken = GetPropertyAliasJToken(propAlias, jToken);
if (propJToken == null)
return;
var propValue = GetPropertyValue(propertyInfo, propJToken);
propertyInfo.SetValue(obj, propValue);
}
private JToken GetPropertyAliasJToken(string propAlias, JToken jToken)
{
return jToken.SingleOrDefault(p => p.SelectToken("alias").ToString().Equals(propAlias));
}
private object GetPropertyValue(PropertyInfo propertyInfo, JToken propJToken)
{
return IsTypeArchetypeDatatype(propertyInfo.PropertyType)
? DeserializeJson(propertyInfo.PropertyType, propJToken)
: IsTypeIEnumerableArchetypeDatatype(propertyInfo.PropertyType)
? DeserializeJson(propertyInfo.PropertyType, propJToken["value"].SelectToken("fieldsets"))
: GetDeserializedPropertyValue(propJToken, propertyInfo.PropertyType);
}
private JToken ParseJTokenFromItem(JToken jToken, string itemAlias)
{
return (jToken.SelectToken("alias") != null && jToken["alias"].ToString().Equals(itemAlias))
? jToken
: null;
}
private JToken ParseJTokenFromItems(JToken jToken, string itemAlias)
{
return jToken.SingleOrDefault(jT => ParseJTokenFromItem(jT, itemAlias) != null);
}
private bool TryParseJTokenFromNamedFieldset(JToken jToken, string objAlias, out JToken resultToken)
{
resultToken = null;
if (jToken.SelectToken("fieldsets") == null)
return false;
resultToken = jToken["fieldsets"].SingleOrDefault(p => p.SelectToken("alias").ToString().Equals(objAlias));
return resultToken != null;
}
private bool TryParseJTokenFromNestedFieldset(JToken jToken, string objAlias, out JToken resultToken)
{
resultToken = null;
if (jToken.SelectToken("value") == null || !jToken["value"].HasValues
|| jToken["value"]["fieldsets"] == null)
return false;
resultToken = jToken["value"]["fieldsets"].SingleOrDefault(p => p.SelectToken("alias").ToString().Equals(objAlias));
return resultToken != null;
}
private bool TryParseJTokenFromDefaultFieldset(JToken jToken, out JToken resultToken)
{
resultToken = jToken.SelectToken("fieldsets");
return resultToken != null;
}
private bool TryParseJTokenAsEnumerable(JToken jToken, out JToken resultToken)
{
resultToken = null;
//To Do: Strange newtonsoft behaviour
var fsToken = jToken.Parent != null
? jToken.Parent.Children().First() is JArray
? jToken.Parent.Children().First()
: jToken.Parent.Children().First()["fieldsets"]
: jToken.SelectToken("fieldsets");
var jTokenEnumerable = jToken != null
&& fsToken != null && fsToken is JArray;
if (jTokenEnumerable)
resultToken = jToken;
return jTokenEnumerable;
}
#endregion
#region private methods - serialization
private string ApplyFormatting(string json, Formatting formatting)
{
@@ -78,113 +317,52 @@ namespace Archetype.Serialization
if (!PropertyLayoutHasFieldsets(properties))
return new List<object>() { value };
var dynamicModel = new ExpandoObject() as IDictionary<string, object>;
models = new List<object>();
var fieldsetModels = properties.Where(HasAsFieldsetAttribute)
.Select(pInfo =>
{
var fsModel = GetDynamicModel(GetJsonPropertyName(pInfo));
fsModel.Add(GetJsonPropertyName(pInfo), pInfo.GetValue(value));
return fsModel;
});
models = ((IEnumerable<object>)models).Concat(fieldsetModels).ToList();
var remainingProps = properties.Where(pInfo => !HasAsFieldsetAttribute(pInfo)).ToList();
if (!remainingProps.Any())
return models;
var dynamicModel = GetDynamicModel(GetFieldsetName(value.GetType()));
foreach (var pInfo in properties.Where(pInfo => !HasAsFieldsetAttribute(pInfo)))
{
dynamicModel.Add(GetJsonPropertyName(pInfo), pInfo.GetValue(value));
}
var fieldsetModels = properties.Where(HasAsFieldsetAttribute)
.Select(pInfo => pInfo.GetValue(value));
models = new List<object>
{
dynamicModel,
};
models = ((IEnumerable<object>)models).Concat(fieldsetModels).ToList();
models.Add(dynamicModel);
return models;
}
private object DeserializeEnumerableObject(object obj, JToken jToken)
private IDictionary<string, object> GetDynamicModel(string rootFsAlias)
{
var model = obj as IEnumerable<object>;
var dynamicModel = new ExpandoObject() as IDictionary<string, object>;
dynamicModel.Add(_ROOT_FS_ALIAS, rootFsAlias);
return dynamicModel;
}
var itemType = model.GetType().BaseType.GetGenericArguments().First();
foreach (var fs in jToken["fieldsets"].Where(fs => fs["alias"].ToString().Equals(GetFieldsetName(itemType))))
private JObject SerializeModelToFieldset(IEnumerable models)
{
var jObj = new JObject
{
var item = JsonConvert.DeserializeObject(
fs["properties"].ToString(), itemType, GetArchetypeDatatypeConverter());
obj.GetType().GetMethod("Add").Invoke(obj, new[] { item });
}
return obj;
}
private object DeserializeObject(object obj, JToken jToken)
{
var properties = GetSerialiazableProperties(obj).ToList();
var asFieldset = properties.Where(HasAsFieldsetAttribute).ToList();
foreach (var propInfo in asFieldset)
{
var propAlias = GetJsonPropertyName(propInfo);
var fsJToken = GetFieldsetProperties(propInfo.PropertyType, jToken);
var propJToken =
fsJToken.Single(p => p.SelectToken("alias").ToString().Equals(propAlias));
if (propJToken == null)
continue;
var propValue = IsValueArchetypeDatatype(propInfo.PropertyType)
? JsonConvert.DeserializeObject(fsJToken.ToString(), propInfo.PropertyType,
GetArchetypeDatatypeConverter())
: GetDeserializedPropertyValue(fsJToken, propInfo.PropertyType); ;
propInfo.SetValue(obj, propValue);
}
return PopulateProperties(obj, GetFieldsetProperties(obj.GetType(), jToken));
}
private JToken GetFieldsetProperties(Type objType, JToken jToken)
{
var objAlias = GetFieldsetName(objType);
return
jToken["fieldsets"].Single(p => p.SelectToken("alias").ToString().Equals(objAlias)).SelectToken("properties");
}
private object PopulateProperties(object obj, JToken jToken)
{
var properties = GetSerialiazableProperties(obj);
foreach (var propertyInfo in properties)
{
var propAlias = GetJsonPropertyName(propertyInfo);
var propJToken = jToken.SingleOrDefault(p => p.SelectToken("alias").ToString().Equals(propAlias));
if (propJToken == null)
continue;
var propValue = GetPropertyValue(propertyInfo, propJToken);
propertyInfo.SetValue(obj, propValue);
}
return obj;
}
private object GetPropertyValue(PropertyInfo propertyInfo, JToken propJToken)
{
return IsValueArchetypeDatatype(propertyInfo.PropertyType)
? JsonConvert.DeserializeObject(propJToken["value"].ToString(), propertyInfo.PropertyType,
GetArchetypeDatatypeConverter())
: GetDeserializedPropertyValue(propJToken["value"], propertyInfo.PropertyType);
}
private bool PropertyLayoutHasFieldsets(IEnumerable<PropertyInfo> properties)
{
return properties.Any(HasAsFieldsetAttribute);
}
private static bool HasAsFieldsetAttribute(PropertyInfo pInfo)
{
return pInfo
.GetCustomAttributes(typeof(AsFieldsetAttribute), true).Length > 0;
{
"fieldsets",
new JArray(new JRaw(SerializeModels(models)))
}
};
return jObj;
}
private IEnumerable SerializeModels(IEnumerable models)
@@ -200,7 +378,7 @@ namespace Archetype.Serialization
return null;
var jObj = IsExpandoObject(value)
? GetJObjectFromExpandoObject(value as IDictionary<string, object>)
? GetJObjectFromExpandoObject(value as IDictionary<string, object>)
: GetJObject(value);
var fieldsetJson = new StringBuilder();
@@ -214,31 +392,48 @@ namespace Archetype.Serialization
return fieldsetJson.ToString();
}
private bool PropertyLayoutHasFieldsets(IEnumerable<PropertyInfo> properties)
{
return properties.Any(HasAsFieldsetAttribute);
}
private static bool HasAsFieldsetAttribute(PropertyInfo pInfo)
{
return pInfo
.GetCustomAttributes(typeof(AsFieldsetAttribute), true).Length > 0;
}
private bool IsExpandoObject(object value)
{
return value.GetType().Name.Equals(typeof (ExpandoObject).Name);
}
private JObject GetJObjectFromExpandoObject(IEnumerable<KeyValuePair<string, object>> obj)
private JObject GetJObjectFromExpandoObject(IDictionary<string, object> expandoObj)
{
var property = obj.ElementAt(0);
var alias = property.Key;
var value = property.Value;
var jObj = new JObject
{
{
"alias",
new JValue(alias)
}
};
var fsProperties = new List<JObject>
{
new JObject {new JProperty("alias", alias), new JProperty("value", value)}
{
"alias",
new JValue(expandoObj[_ROOT_FS_ALIAS])
}
};
jObj.Add("properties", new JRaw(JsonConvert.SerializeObject(fsProperties)));
var fsProperties = new List<JObject>();
foreach (var item in expandoObj.SkipWhile(i => i.Key.Equals(_ROOT_FS_ALIAS)))
{
var property = item;
var alias = property.Key;
var value = property.Value;
fsProperties.Add(new JObject
{
new JProperty("alias", alias),
new JProperty("value", value != null ? JToken.FromObject(value) : value)
});
}
jObj.Add("properties", new JRaw(JsonConvert.SerializeObject(fsProperties)));
return jObj;
}
@@ -252,7 +447,7 @@ namespace Archetype.Serialization
}
};
var properties = GetSerialiazableProperties(obj);
var properties = GetProperties(obj);
var fsProperties = new List<JObject>();
@@ -262,14 +457,12 @@ namespace Archetype.Serialization
var jProperty = new JProperty("alias", GetJsonPropertyName(propertyInfo));
fsProperty.Add(jProperty);
var propValue = propertyInfo.GetValue(obj, null);
var propValue = propertyInfo.GetIndexParameters().Length == 0
? propertyInfo.GetValue(obj, null)
: obj as string;
fsProperty.Add(
new JProperty("value",
IsValueArchetypeDatatype(propValue)
? new JRaw(JsonConvert.SerializeObject(propValue,
GetArchetypeDatatypeConverter()))
: new JValue(GetSerializedPropertyValue(propValue))));
new JProperty("value", GetJPropertyValue(propValue)));
fsProperties.Add(fsProperty);
}
@@ -279,11 +472,29 @@ namespace Archetype.Serialization
return jObj;
}
private object GetJPropertyValue(object value)
{
return IsValueArchetypeDatatype(value)
? new JRaw(JsonConvert.SerializeObject(value))
: IsValueIEnumerableArchetypeDatatype(value)
? new JRaw(SerializeModelToFieldset(value as IEnumerable))
: new JValue(GetSerializedPropertyValue(value));
}
private IEnumerable<PropertyInfo> GetProperties(object obj)
{
if (obj.GetType() != typeof(string))
return GetSerialiazableProperties(obj);
var indexer = ((DefaultMemberAttribute)obj.GetType()
.GetCustomAttributes(typeof(DefaultMemberAttribute), true)[0]).MemberName;
return new List<PropertyInfo> { obj.GetType().GetProperty(indexer) };
}
private IEnumerable<PropertyInfo> GetSerialiazableProperties(object obj)
{
return obj.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(prop => !Attribute.IsDefined(prop, typeof(JsonIgnoreAttribute)));
return obj.GetSerialiazableProperties();
}
private string GetJsonPropertyName(PropertyInfo property)
@@ -302,22 +513,6 @@ namespace Archetype.Serialization
return archetypeDatatypeAttribute != null ? archetypeDatatypeAttribute.FieldsetName : type.Name;
}
private bool IsValueArchetypeDatatype(object value)
{
return value != null &&
IsValueArchetypeDatatype(value.GetType());
}
private bool IsValueArchetypeDatatype(Type type)
{
return type.GetCustomAttributes(typeof(AsArchetypeAttribute), true).Length > 0;
}
private JsonConverter GetArchetypeDatatypeConverter()
{
return (JsonConverter)Activator.CreateInstance(GetType());
}
private string GetSerializedPropertyValue(object propValue)
{
if (propValue == null)
@@ -330,18 +525,20 @@ namespace Archetype.Serialization
}
private object GetDeserializedPropertyValue(JToken jToken, Type type)
{
if (String.IsNullOrEmpty(jToken.ToString()))
return GetDefault(type);
{
return String.IsNullOrEmpty(jToken.ToString())
? GetDefault(type)
: GetTypedValue(jToken, type);
}
var localType = Nullable.GetUnderlyingType(type) ?? type;
private object GetTypedValue(JToken jToken, Type type)
{
var property = JsonConvert.DeserializeObject<ArchetypePropertyModel>(jToken.ToString());
if (localType == typeof(bool))
return jToken.ToString() == "1";
var method = typeof(ArchetypePropertyModel).GetMethod("GetValue");
var getValue = method.MakeGenericMethod(type);
return localType == typeof(DateTime)
? Convert.ToDateTime(jToken.ToString())
: jToken.ToObject(localType);
return getValue.Invoke(property, null);
}
private object GetDefault(Type type)
@@ -350,5 +547,36 @@ namespace Archetype.Serialization
}
#endregion
#region private methods - common
private bool IsValueIEnumerableArchetypeDatatype(object value)
{
if (value as IEnumerable != null && value.GetType().IsGenericType)
return IsTypeArchetypeDatatype(value.GetType().GetGenericArguments()[0]);
return false;
}
private bool IsTypeIEnumerableArchetypeDatatype(Type type)
{
if (typeof(IEnumerable).IsAssignableFrom(type) && type.IsGenericType)
return IsTypeArchetypeDatatype(type.GetGenericArguments()[0]);
return false;
}
private bool IsValueArchetypeDatatype(object value)
{
return value != null &&
IsTypeArchetypeDatatype(value.GetType());
}
private bool IsTypeArchetypeDatatype(Type type)
{
return type.GetCustomAttributes(typeof(AsArchetypeAttribute), true).Length > 0;
}
#endregion
}
}
@@ -0,0 +1,105 @@
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Archetype.Serialization
{
public enum DelinterStep
{
RemoveNewLine = 0,
RemoveWhiteSpace,
UnescapeLabels,
UnescapeAlias,
UnescapeValues,
FixNestedFieldsets
}
public enum DelinterAction
{
Remove = 0,
RemoveWhiteSpace,
UnescapeLabels,
UnescapeValues,
FixNestedFieldsets
}
public class ArchetypeJsonDelinter
{
public IDictionary<DelinterStep, DelinterAction> Pipeline { get; private set; }
public IDictionary<DelinterStep, Regex> Tokens { get; private set; }
public IDictionary<DelinterAction, Func<string, Regex, string>> Actions { get; private set; }
public ArchetypeJsonDelinter()
{
Init();
}
public string Execute(string input)
{
var buffer = input;
foreach (var step in Pipeline.Keys)
{
var action = Pipeline[step];
buffer = Actions[action](buffer, Tokens[step]);
}
return buffer;
}
private void Init()
{
Tokens = new Dictionary<DelinterStep, Regex>
{
{DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\*?""(alias|value|properties|fieldsets)\\*?"":\{*?(\\*|""|\[))|(\r|\n)+|(\\+r\\+n)(?=\s*?(\{|\}|\]))|(\\+r\\n+)(?=\s+\\*?""(alias|value|properties|fieldsets))")},
{DelinterStep.RemoveWhiteSpace, new Regex(@"(""\S+?"":)(\s+?)("")|([\{\[\}\],]|(?<!\\)"")(\s+)([\{\[\}\],]|(?<!\\)"")")},
{DelinterStep.UnescapeLabels, new Regex(@"\\+""(fieldsets|properties|alias|value)\\+"":(\s*)")},
{DelinterStep.UnescapeAlias, new Regex(@"""(alias)"":\\+""(.*?)\\+""")},
{DelinterStep.UnescapeValues, new Regex(@"""(value)"":\\+""(.*?)\\+""(?=\s*?\})")},
{DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""\{\s*?(""fieldsets""[\S\s]+?)}""")}
};
Actions = new Dictionary<DelinterAction, Func<string, Regex, string>>
{
{DelinterAction.Remove, (input, pattern) =>
RecursiveReplace(input, pattern, match => String.Empty)
},
{DelinterAction.RemoveWhiteSpace, (input, pattern) =>
RecursiveReplace(input.Trim(), pattern, match =>
String.Format("{0}{1}{2}{3}", match.Groups[1].Value,
match.Groups[3].Value, match.Groups[4].Value, match.Groups[6].Value))
},
{DelinterAction.UnescapeLabels, (input, pattern) =>
RecursiveReplace(input, pattern, match => String.Format(@"""{0}"":", match.Groups[1].Value))
},
{DelinterAction.UnescapeValues, (input, pattern) =>
RecursiveReplace(input, pattern, match => String.Format(@"""{0}"":""{1}""", match.Groups[1].Value, match.Groups[2].Value))
},
{DelinterAction.FixNestedFieldsets, (input, pattern) =>
RecursiveReplace(input, pattern, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1].Value, match.Groups[2].Value))
}
};
Pipeline = new Dictionary<DelinterStep, DelinterAction>
{
{DelinterStep.RemoveNewLine, DelinterAction.Remove},
{DelinterStep.UnescapeLabels, DelinterAction.UnescapeLabels},
{DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues},
{DelinterStep.UnescapeValues, DelinterAction.UnescapeValues},
{DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets},
{DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace},
};
}
private string RecursiveReplace(string input, Regex pattern, Func<Match, string> matchFunc)
{
var buffer = input;
while (pattern.IsMatch(buffer))
{
buffer = pattern.Replace(buffer, match => matchFunc(match));
}
return buffer;
}
}
}
@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using Archetype.Extensions;
using Newtonsoft.Json;
using Umbraco.Core.Models;
using Umbraco.Web;
@@ -20,6 +20,16 @@ namespace Archetype.Serialization
return (string)contentPage.Properties.Single(p => p.PropertyTypeAlias == propertyAlias).DataValue;
}
public static IEnumerable<PropertyInfo> GetSerialiazableProperties(this object obj)
{
if (obj == null)
return new List<PropertyInfo>();
return obj.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(prop => !Attribute.IsDefined(prop, typeof(JsonIgnoreAttribute)));
}
public static T GetModelFromArchetype<T>(this IPublishedContent content,
string cmsFieldAlias, bool returnInstanceIfNull = false)
where T : class, new()
@@ -28,5 +38,14 @@ namespace Archetype.Serialization
return JsonConvert.DeserializeObject<T>(archetypeJson) ??
(returnInstanceIfNull ? Activator.CreateInstance<T>() : default(T));
}
public static string DelintArchetypeJson(this string input)
{
if (!input.DetectIsJson())
return String.Empty;
var delinter = new ArchetypeJsonDelinter();
return delinter.Execute(input);
}
}
}