From 87da7e1243fb054d10179ce48f1880363988d2c1 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 1 May 2014 14:24:26 +0100 Subject: [PATCH 01/44] Issue #AR-1_serialization: fix tests that were failing due to changes in line-end encodings. --- .../Serialization/JsonTestStrings.cs | 832 +++++++++--------- 1 file changed, 416 insertions(+), 416 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/JsonTestStrings.cs b/app/Umbraco/Archetype.Tests/Serialization/JsonTestStrings.cs index 5061e8c..8fd8aae 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/JsonTestStrings.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/JsonTestStrings.cs @@ -2,432 +2,432 @@ { 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 _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 _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 _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 _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 _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 _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"":""""}]}]}"; From 34e65ba57ec25367da297f652a6d5f0e58c04499 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 1 May 2014 16:13:19 +0100 Subject: [PATCH 02/44] Issue #AR-1_property_value_converters: switched to using Archetype's native GetValue when getting property values, - added umbracoSettings.config to the test project: conversion of decimal numbers, e.g. '12345.34' triggers 'NormalizeNumberDecimalSeparator' which in turn requires via 'DefaultShortStringHelper' that the umbracoSettings.config file is loaded. We added this to make sure tests deserializing decimal numbers pass. --- .../Archetype.Tests/Archetype.Tests.csproj | 492 +++++++++--------- .../ArchetypeJsonConverterTest.cs | 8 +- .../config/umbracoSettings.config | 109 ++++ app/Umbraco/Archetype.Tests/app.config | 10 +- app/Umbraco/Umbraco.Archetype.sln | 66 +-- .../Serialization/ArchetypeJsonConverter.cs | 33 +- 6 files changed, 423 insertions(+), 295 deletions(-) create mode 100644 app/Umbraco/Archetype.Tests/SupportingFiles/config/umbracoSettings.config diff --git a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj index 261c3f9..6cf6061 100644 --- a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj +++ b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj @@ -1,249 +1,257 @@ - - - - - Debug - AnyCPU - {21F3E6CF-B76F-4059-9474-1AF1CE63CD6B} - Library - Properties - Archetype.Tests - Archetype.Tests - v4.5 - 512 - ..\ - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll - - - ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\businesslogic.dll - - - ..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll - - - ..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\cms.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\controls.dll - - - ..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\Examine.dll - - - ..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll - - - ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll - - - ..\packages\ImageProcessor.1.8.7.0\lib\ImageProcessor.dll - - - ..\packages\ImageProcessor.Web.3.2.1.0\lib\net45\ImageProcessor.Web.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\interfaces.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\log4net.dll - - - ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\Microsoft.ApplicationBlocks.Data.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\Microsoft.Web.Helpers.dll - - - True - ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - - - ..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll - - - ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll - - - ..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll - - - ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll - - - False - ..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\packages\NUnit.2.6.3\lib\nunit.framework.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\SQLCE4Umbraco.dll - - - - - True - ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.dll - - - True - ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.Entity.dll - - - - ..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll - - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll - - - ..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll - - - ..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll - - - True - ..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll - - - False - ..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll - True - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll - - - - - - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\TidyNet.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Core.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.DataLayer.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.editorControls.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.MacroEngines.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.providers.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Web.UI.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.XmlSerializers.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\UmbracoExamine.dll - - - False - ..\packages\UmbracoCms.Core.7.1.1\lib\UrlRewritingNet.UrlRewriter.dll - - - - - - - - - - - - - - - - - - - {7D185D41-4228-4978-ACB8-83F9A48AD94F} - Archetype.Umbraco - - - - - + + + + + Debug + AnyCPU + {21F3E6CF-B76F-4059-9474-1AF1CE63CD6B} + Library + Properties + Archetype.Tests + Archetype.Tests + v4.5 + 512 + ..\ + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll + + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\businesslogic.dll + + + ..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll + + + ..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\cms.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\controls.dll + + + ..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Examine.dll + + + ..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll + + + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + + ..\packages\ImageProcessor.1.8.7.0\lib\ImageProcessor.dll + + + ..\packages\ImageProcessor.Web.3.2.1.0\lib\net45\ImageProcessor.Web.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\interfaces.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\log4net.dll + + + ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Microsoft.ApplicationBlocks.Data.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Microsoft.Web.Helpers.dll + + + True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + ..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.1\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll + + + ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll + + + ..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + False + ..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\SQLCE4Umbraco.dll + + + + + True + ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.dll + + + True + ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.Entity.dll + + + + ..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll + + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.Helpers.dll + + + ..\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll + + + True + ..\packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll + + + False + ..\packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll + True + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll + + + + + + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\TidyNet.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Core.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.DataLayer.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.editorControls.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.MacroEngines.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.providers.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Web.UI.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.XmlSerializers.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\UmbracoExamine.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\UrlRewritingNet.UrlRewriter.dll + + + + + + + + + + + + + + + + + + + + {7D185D41-4228-4978-ACB8-83F9A48AD94F} + Archetype.Umbraco + + + + + + + + + + + xcopy $(ProjectDir)SupportingFiles\config\* $(TargetDir)config /I /O /X /E /K /D + + --> \ No newline at end of file diff --git a/app/Umbraco/Archetype.Tests/Serialization/ArchetypeJsonConverterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/ArchetypeJsonConverterTest.cs index f5ad6bb..27de22a 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/ArchetypeJsonConverterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/ArchetypeJsonConverterTest.cs @@ -1,8 +1,8 @@ -using System; +using System; using Archetype.Umbraco.PropertyConverters; using Newtonsoft.Json; -using NUnit.Framework; - +using NUnit.Framework; + namespace Archetype.Tests.Serialization { [TestFixture] @@ -228,7 +228,7 @@ namespace Archetype.Tests.Serialization } [Test] - public void DeserializeNumericAndDateModelFromArchetype() + public void DeserializeNumericAndDateModelFromArchetype() { var result = JsonConvert.DeserializeObject(JsonTestStrings._ANNUAL_STATEMENT_JSON); diff --git a/app/Umbraco/Archetype.Tests/SupportingFiles/config/umbracoSettings.config b/app/Umbraco/Archetype.Tests/SupportingFiles/config/umbracoSettings.config new file mode 100644 index 0000000..2ccc8a5 --- /dev/null +++ b/app/Umbraco/Archetype.Tests/SupportingFiles/config/umbracoSettings.config @@ -0,0 +1,109 @@ + + + + + + + + + 1 + + + + + + your@email.here + + + + text + + + In Preview Mode - click to end]]> + + + + 1800 + + + inline + + + ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd + + + Textstring + + + + + false + + false + + + + + false + + true + + + + + Mvc + + + + + + + + + + + + 0 + + + + + + + + + + + + + diff --git a/app/Umbraco/Archetype.Tests/app.config b/app/Umbraco/Archetype.Tests/app.config index 72cac16..786460d 100644 --- a/app/Umbraco/Archetype.Tests/app.config +++ b/app/Umbraco/Archetype.Tests/app.config @@ -1,6 +1,14 @@  - + + +
+ + + + + + diff --git a/app/Umbraco/Umbraco.Archetype.sln b/app/Umbraco/Umbraco.Archetype.sln index 88272ac..68ebc7d 100644 --- a/app/Umbraco/Umbraco.Archetype.sln +++ b/app/Umbraco/Umbraco.Archetype.sln @@ -1,33 +1,33 @@ - -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 -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 - 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 +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 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index 618b9aa..21c1b42 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -5,7 +5,8 @@ using System.Dynamic; using System.IO; using System.Linq; using System.Reflection; -using System.Text; +using System.Text; +using Archetype.Umbraco.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -173,7 +174,7 @@ namespace Archetype.Umbraco.Serialization return IsValueArchetypeDatatype(propertyInfo.PropertyType) ? JsonConvert.DeserializeObject(propJToken["value"].ToString(), propertyInfo.PropertyType, GetArchetypeDatatypeConverter()) - : GetDeserializedPropertyValue(propJToken["value"], propertyInfo.PropertyType); + : GetDeserializedPropertyValue(propJToken, propertyInfo.PropertyType); } private bool PropertyLayoutHasFieldsets(IEnumerable properties) @@ -329,19 +330,21 @@ namespace Archetype.Umbraco.Serialization return String.Format("{0}", propValue); } - private object GetDeserializedPropertyValue(JToken jToken, Type type) - { - if (String.IsNullOrEmpty(jToken.ToString())) - return GetDefault(type); - - var localType = Nullable.GetUnderlyingType(type) ?? type; - - if (localType == typeof(bool)) - return jToken.ToString() == "1"; - - return localType == typeof(DateTime) - ? Convert.ToDateTime(jToken.ToString()) - : jToken.ToObject(localType); + private object GetDeserializedPropertyValue(JToken jToken, Type type) + { + return String.IsNullOrEmpty(jToken.ToString()) + ? GetDefault(type) + : GetTypedValue(jToken, type); + } + + private object GetTypedValue(JToken jToken, Type type) + { + var property = JsonConvert.DeserializeObject(jToken.ToString()); + + var method = typeof(Property).GetMethod("GetValue"); + var getValue = method.MakeGenericMethod(type); + + return getValue.Invoke(property, null); } private object GetDefault(Type type) From bc6580995a4d7ae75f25f8367e883ee459514890 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 6 May 2014 11:39:10 +0100 Subject: [PATCH 03/44] Issue #AR-3_IEnumerable_support: re-factor tests, add Enumerable tests - all failing as baseline. --- .../Archetype.Tests/Archetype.Tests.csproj | 6 +- .../ArchetypeJsonConverterComplexModelTest.cs | 52 ++-- .../ArchetypeJsonConverterTest.cs | 92 +++---- .../Base/ArchetypeJsonConverterTestBase.cs | 38 +++ .../Enumerable/ArchetypeJsonConverterTest.cs | 60 +++++ .../Enumerable/JsonTestModels.cs | 31 +++ .../Enumerable/JsonTestStrings.cs | 249 ++++++++++++++++++ 7 files changed, 438 insertions(+), 90 deletions(-) create mode 100644 app/Umbraco/Archetype.Tests/Serialization/Base/ArchetypeJsonConverterTestBase.cs create mode 100644 app/Umbraco/Archetype.Tests/Serialization/Enumerable/ArchetypeJsonConverterTest.cs create mode 100644 app/Umbraco/Archetype.Tests/Serialization/Enumerable/JsonTestModels.cs create mode 100644 app/Umbraco/Archetype.Tests/Serialization/Enumerable/JsonTestStrings.cs diff --git a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj index 6cf6061..9a53b3a 100644 --- a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj +++ b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj @@ -222,6 +222,10 @@ + + + + @@ -245,7 +249,7 @@ - xcopy $(ProjectDir)SupportingFiles\config\* $(TargetDir)config /I /O /X /E /K /D + xcopy $(ProjectDir)SupportingFiles\config\* $(TargetDir)config /I /O /X /E /K /D /Y + --> \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs index 342d108..1cade8f 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs @@ -1,11 +1,9 @@ using System; using System.Linq; -using System.Web; -using System.Text; using System.Text.RegularExpressions; -using System.Collections.Generic; -using Umbraco.Core; -using Umbraco.Web; +using System.Collections.Generic; +using Archetype.Umbraco.Serialization; +using Umbraco.Core; using Archetype.Umbraco.Models; namespace Archetype.Umbraco.Extensions @@ -25,38 +23,13 @@ namespace Archetype.Umbraco.Extensions return prop.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditorAlias); } - public static string UnescapeJson(this string input) + public static string DelintArchetypeJson(this string input) { if (!input.DetectIsJson()) return String.Empty; - var tokens = new Dictionary - { - {"fieldsets", new Regex(@"""\{\\""(fieldsets)\\""\s*:\s*(.+?)\}""")}, - {"properties", new Regex(@"\{\\""(properties)\\""\s*:\s*(.+?)\}")}, - {"alias", new Regex(@"\\""(alias)\\""\s*:\s*\\""(.+?)\\""")}, - {"value", new Regex(@"\\""(value)\\""\s*:\s*\\""(.+?)\\""")}, - }; - - input = tokens["fieldsets"].Replace(input, delegate(Match match) - { - return String.Format(@"{{""{0}"":{1}}}", match.Groups[1], match.Groups[2]); - }); - - input = tokens["properties"].Replace(input, delegate(Match match) - { - return String.Format(@"{{""{0}"":{1}}}", match.Groups[1], match.Groups[2]); - }); - - foreach (var token in tokens.Keys.Skip(2)) - { - input = tokens[token].Replace(input, delegate(Match match) - { - return String.Format(@"""{0}"":""{1}""", match.Groups[1], match.Groups[2]); - }); - } - - return input; + var delinter = new ArchetypeJsonDelinter(); + return delinter.Execute(input); } } } diff --git a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs b/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs index adb77b3..f2c9ce6 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs @@ -39,7 +39,7 @@ namespace Archetype.Umbraco.Models .ToList() .ForEach(x => x.Remove()); - //return json.ToString(Formatting.None).UnescapeJson(); + //return json.ToString(Formatting.None).DelintArchetypeJson(); return json.ToString(Formatting.None); } } diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs new file mode 100644 index 0000000..f452741 --- /dev/null +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Archetype.Umbraco.Serialization +{ + public enum DelinterStep + { + RemoveNewLine = 0, + LabelFieldsets, + LabelProperties, + LabelAlias, + LabelValue, + UnescapeValues, + FixNestedFieldsets, + RemoveWhiteSpace + } + + public enum DelinterAction + { + Remove = 0, + UnescapeLabels, + UnescapeValues, + FixNestedFieldsets + } + + public class ArchetypeJsonDelinter + { + public IDictionary Pipeline { get; set; } + public IDictionary Tokens { get; set; } + public IDictionary> Actions { get; set; } + + public ArchetypeJsonDelinter() + { + Init(); + } + + public string Execute(string input) + { + var buffer = input; + + foreach (var step in Pipeline.Keys) + { + var action = Pipeline[step]; + while (Tokens[step].IsMatch(buffer)) + { + buffer = Tokens[step] + .Replace(buffer, match => Actions[action](match)); + } + } + + return buffer; + } + + private void Init() + { + Tokens = new Dictionary + { + {DelinterStep.RemoveNewLine, new Regex(@"\\r|\\n|[\r\n]", RegexOptions.Multiline)}, + {DelinterStep.LabelFieldsets, new Regex(@"\s*\\+""(fieldsets)\\+"":\s*")}, + {DelinterStep.LabelProperties, new Regex(@"\s*\\+""(properties)\\+"":\s*")}, + {DelinterStep.LabelAlias, new Regex(@"\s*\\+""(alias)\\+"":\s*")}, + {DelinterStep.LabelValue, new Regex(@"\s*\\+""(value)\\+"":\s*")}, + {DelinterStep.UnescapeValues, new Regex(@"""(alias|value)"":\\+""(.*?)\\+""")}, + {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":""({""fieldsets"".+?})""")}, + {DelinterStep.RemoveWhiteSpace, new Regex(@"\s+(?=([^""]*""[^""]*"")*[^""]*$)")} + }; + + Actions = new Dictionary> + { + {DelinterAction.Remove, match => String.Empty}, + {DelinterAction.UnescapeLabels, match => String.Format(@"""{0}"":", match.Groups[1])}, + {DelinterAction.UnescapeValues, match => String.Format(@"""{0}"":""{1}""", match.Groups[1], match.Groups[2])}, + {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{1}", match.Groups[1], match.Groups[2])} + }; + + Pipeline = new Dictionary + { + {DelinterStep.RemoveNewLine, DelinterAction.Remove}, + {DelinterStep.LabelFieldsets, DelinterAction.UnescapeLabels}, + {DelinterStep.LabelProperties, DelinterAction.UnescapeLabels}, + {DelinterStep.LabelAlias, DelinterAction.UnescapeLabels}, + {DelinterStep.LabelValue, DelinterAction.UnescapeLabels}, + {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, + {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets}, + {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove} + }; + } + } +} From a6a961d52a47e14892fc03bae699ab6cc9b0f1b6 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 15 May 2014 12:38:11 +0100 Subject: [PATCH 26/44] Issue #AR-1_serialization: added additional unescape model tests --- .../Serialization/Base/RegressionTestBase.cs | 18 +++-- .../Regression/ArchetypeJsonConverterTest.cs | 65 ++++++++++++++++++- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs index 1de8603..733081c 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs @@ -93,13 +93,7 @@ namespace Archetype.Tests.Serialization.Base AssertAreEqual(model, resultfromArchetypeJson); } - protected void NestedModel_Regression_Battery(T model) - { - CompoundModel_Regression_Battery(model); - } - - - protected void NestedModel_WithEscapedJson_Regression_Battery(T model) + protected void CompoundModel_WithEscapedJson_Regression_Battery(T model) { var propGuid = new Guid(); var dtd = new DataTypeDefinition(-1, String.Empty) {Id = 0}; @@ -142,6 +136,16 @@ namespace Archetype.Tests.Serialization.Base AssertAreEqual(model, resultfromConvertedJson); } + protected void NestedModel_Regression_Battery(T model) + { + CompoundModel_Regression_Battery(model); + } + + protected void NestedModel_WithEscapedJson_Regression_Battery(T model) + { + CompoundModel_WithEscapedJson_Regression_Battery(model); + } + protected void ComplexModel_Regression_Battery(T model) { CompoundModel_Regression_Battery(model); diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs index 4ddc60d..4246963 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs @@ -67,6 +67,13 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } + [Test] + public void CompoundModel_WithEscapedJson_Regression_Battery() + { + var compoundModel = _testHelper.GetModel(); + CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); + } + [Test] public void CompoundModelWithMixedFieldsetVariant1_Regression_Battery() { @@ -74,6 +81,13 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } + [Test] + public void CompoundModelWithMixedFieldsetVariant1_WithEscapedJson_Regression_Battery() + { + var compoundModel = _testHelper.GetModel(); + CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); + } + [Test] public void CompoundModelWithMixedFieldsetVariant2_Regression_Battery() { @@ -81,6 +95,13 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } + [Test] + public void CompoundModelWithMixedFieldsetVariant2_WithEscapedJson_Regression_Battery() + { + var compoundModel = _testHelper.GetModel(); + CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); + } + [Test] public void CompoundModelWithFieldset_Regression_Battery() { @@ -88,6 +109,13 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } + [Test] + public void CompoundModelWithFieldset_WithEscapedJson_Regression_Battery() + { + var compoundModel = _testHelper.GetModel(); + CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); + } + [Test] public void CompoundModelWithList_Regression_Battery() { @@ -95,6 +123,13 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModelWithList); } + [Test] + public void CompoundModelWithList_WithEscapedJson_Regression_Battery() + { + var compoundModel = _testHelper.GetModel(); + CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); + } + [Test] public void CompoundModelWithMixedFieldsetWithList_Regression_Battery() { @@ -102,6 +137,13 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModelWithList); } + [Test] + public void CompoundModelWithMixedFieldsetWithList_WithEscapedJson_Regression_Battery() + { + var compoundModel = _testHelper.GetModel(); + CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); + } + [Test] public void CompoundModelWithFieldsetWithList_Regression_Battery() { @@ -109,6 +151,13 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModelWithList); } + [Test] + public void CompoundModelWithFieldsetWithList_WithEscapedJson_Regression_Battery() + { + var compoundModel = _testHelper.GetModel(); + CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); + } + [Test] public void NestedModel_Regression_Battery() { @@ -116,6 +165,13 @@ namespace Archetype.Tests.Serialization.Regression NestedModel_Regression_Battery(nestedModel); } + [Test] + public void NestedModel_WithEscapedJson_Regression_Battery() + { + var nestedModel = _testHelper.GetModel(); + NestedModel_WithEscapedJson_Regression_Battery(nestedModel); + } + [Test] public void NestedModelWithMixedFieldset_Regression_Battery() { @@ -123,6 +179,13 @@ namespace Archetype.Tests.Serialization.Regression NestedModel_Regression_Battery(nestedModel); } + [Test] + public void NestedModelWithMixedFieldset_WithEscapedJson_Regression_Battery() + { + var nestedModel = _testHelper.GetModel(); + NestedModel_WithEscapedJson_Regression_Battery(nestedModel); + } + [Test] public void NestedModelWithFieldset_Regression_Battery() { @@ -131,7 +194,7 @@ namespace Archetype.Tests.Serialization.Regression } [Test] - public void NestedModel_WithEscapedJson_Regression_Battery() + public void NestedModelWithFieldset_WithEscapedJson_Regression_Battery() { var nestedModel = _testHelper.GetModel(); NestedModel_WithEscapedJson_Regression_Battery(nestedModel); From 8fc209abc1e994437fb874b817125ae7d8b7f0af Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 15 May 2014 12:42:15 +0100 Subject: [PATCH 27/44] Issue #AR-1_serialization: move delinter tests into serialization tests --- app/Umbraco/Archetype.Tests/Archetype.Tests.csproj | 2 +- .../Delinter/ArchetypeJsonDelinterTest.cs} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename app/Umbraco/Archetype.Tests/{UnescapeJsonTest.cs => Serialization/Delinter/ArchetypeJsonDelinterTest.cs} (95%) diff --git a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj index ca92967..7e0f861 100644 --- a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj +++ b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj @@ -222,6 +222,7 @@ + @@ -235,7 +236,6 @@ - diff --git a/app/Umbraco/Archetype.Tests/UnescapeJsonTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs similarity index 95% rename from app/Umbraco/Archetype.Tests/UnescapeJsonTest.cs rename to app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index 57390b8..b3c022a 100644 --- a/app/Umbraco/Archetype.Tests/UnescapeJsonTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -6,10 +6,10 @@ using Archetype.Umbraco.Serialization; using Newtonsoft.Json; using NUnit.Framework; -namespace Archetype.Tests +namespace Archetype.Tests.Serialization.Delinter { [TestFixture] - public class UnescapeJsonTest : RegressionTestBase + 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""}]}"; From bff8bcc5623fd11212aac7fa2887aca6dd310f20 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 15 May 2014 14:55:12 +0100 Subject: [PATCH 28/44] Issue #AR-1_serialization: fix overflow issue affecting deserialization in recursively nested models --- .../Delinter/ArchetypeJsonDelinterTest.cs | 83 ++++++++++++++++++- .../Serialization/ArchetypeJsonConverter.cs | 11 ++- 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index b3c022a..db4c8ef 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -1,10 +1,18 @@ using System; using System.Collections.Generic; +using System.Linq; using Archetype.Tests.Serialization.Base; using Archetype.Umbraco.Extensions; +using Archetype.Umbraco.PropertyEditors; using Archetype.Umbraco.Serialization; +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 { @@ -16,6 +24,8 @@ namespace Archetype.Tests.Serialization.Delinter 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 SlideShow _referenceModel; + private NestedClass _nestedClass; + [SetUp] public void SetUp() { @@ -29,6 +39,13 @@ namespace Archetype.Tests.Serialization.Delinter new TextString(){Text = "test3b test3b"} } }; + + _nestedClass = GetNestedClass(); + _nestedClass.SlideShow = _referenceModel; + _nestedClass.Nested = GetNestedClass(); + _nestedClass.Nested.SlideShow = _referenceModel; + _nestedClass.Nested.Nested = GetNestedClass(); + } [Test] @@ -69,11 +86,61 @@ namespace Archetype.Tests.Serialization.Delinter [Test] public void DeepNestedJson_Escapes_Correctly() { - var actual = _ESCAPED_JSON_DEEP_NESTED.DelintArchetypeJson(); + var propGuid = new Guid(); + var dtd = new DataTypeDefinition(-1, String.Empty) { Id = 0 }; + + var dataTypeService = new Mock(); + dataTypeService.Setup(dts => dts.GetDataTypeDefinitionById(Guid.Parse(propGuid.ToString()))).Returns(dtd); + dataTypeService.Setup(dts => dts.GetPreValuesCollectionByDataTypeId(dtd.Id)).Returns(new PreValueCollection(new Dictionary())); + + var propValueEditor = new Mock(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 = Umbraco.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()), new Dictionary()), + archetypeJson); + + Assert.IsNotNull(convertedJson); + + var delintedJson = convertedJson.ToString().DelintArchetypeJson(); + Assert.IsNotNullOrEmpty(delintedJson); + + var resultfromArchetypeJson = ConvertArchetypeJsonToModel(archetypeJson); + var resultfromConvertedJson = ConvertArchetypeJsonToModel(delintedJson); + + Assert.IsInstanceOf(resultfromArchetypeJson); + Assert.IsInstanceOf(resultfromConvertedJson); + + AssertAreEqual(resultfromArchetypeJson, resultfromConvertedJson); - Assert.IsNotNullOrEmpty(actual); } + #region private methods + + private NestedClass GetNestedClass() + { + return new NestedClass(); + } + + #endregion + + #region classes + [AsArchetype("slides")] [JsonConverter(typeof(ArchetypeJsonConverter))] public class SlideShow @@ -98,5 +165,17 @@ namespace Archetype.Tests.Serialization.Delinter [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 } } diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index 053eac9..0c37ce5 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -81,8 +81,12 @@ namespace Archetype.Umbraco.Serialization return obj; } - private object DeserializeObject(object obj, JToken jToken) - { + 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(); @@ -130,6 +134,9 @@ namespace Archetype.Umbraco.Serialization private JToken GetPropertyJToken(JToken fsJToken, string propAlias) { + if (fsJToken == null) + return null; + //make recursive if (fsJToken.SelectToken("properties") != null) return GetPropertyAliasJToken(propAlias, fsJToken["properties"]); From ac84c35f674307340250a2e517bd8b76fb08e960 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 15 May 2014 15:06:41 +0100 Subject: [PATCH 29/44] Issue #AR-1_serialization: fix issue where property alias was incorrectly set from type alias --- .../Delinter/ArchetypeJsonDelinterTest.cs | 16 +++++++++++----- .../Serialization/ArchetypeJsonConverter.cs | 18 ++++++++++++------ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index db4c8ef..888f3d9 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -120,13 +120,19 @@ namespace Archetype.Tests.Serialization.Delinter var delintedJson = convertedJson.ToString().DelintArchetypeJson(); Assert.IsNotNullOrEmpty(delintedJson); - var resultfromArchetypeJson = ConvertArchetypeJsonToModel(archetypeJson); - var resultfromConvertedJson = ConvertArchetypeJsonToModel(delintedJson); + var modelfromArchetypeJson = ConvertArchetypeJsonToModel(archetypeJson); + var modelfromConvertedJson = ConvertArchetypeJsonToModel(delintedJson); - Assert.IsInstanceOf(resultfromArchetypeJson); - Assert.IsInstanceOf(resultfromConvertedJson); + Assert.IsInstanceOf(modelfromArchetypeJson); + Assert.IsInstanceOf(modelfromConvertedJson); - AssertAreEqual(resultfromArchetypeJson, resultfromConvertedJson); + 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); } diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index 0c37ce5..81d620f 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -94,8 +94,8 @@ namespace Archetype.Umbraco.Serialization { var propAlias = GetJsonPropertyName(propInfo); var fsJToken = propInfo.PropertyType.Namespace.Equals("System") - ? GetFieldsetJTokenByAlias(propAlias, jToken) - : GetFieldsetJTokenByTypeAlias(propInfo.PropertyType, jToken); + ? GetFieldsetJTokenFromAlias(propAlias, jToken) + : GetFieldsetJTokenFromPropertyAlias(propInfo, jToken); var propJToken = GetPropertyJToken(fsJToken, propAlias); @@ -110,7 +110,7 @@ namespace Archetype.Umbraco.Serialization if (properties.All(HasAsFieldsetAttribute)) return obj; - var objToken = GetFieldsetJTokenByTypeAlias(obj.GetType(), jToken); + var objToken = GetFieldsetJTokenFromTypeAlias(obj.GetType(), jToken); if (objToken == null) return obj; @@ -147,13 +147,19 @@ namespace Archetype.Umbraco.Serialization return nestedPropJToken != null ? GetPropertyAliasJToken(propAlias, nestedPropJToken["properties"]) : null; } - private JToken GetFieldsetJTokenByTypeAlias(Type objType, JToken jToken) + private JToken GetFieldsetJTokenFromTypeAlias(Type objType, JToken jToken) { var objAlias = GetFieldsetName(objType); - return GetFieldsetJTokenByAlias(objAlias, jToken); + return GetFieldsetJTokenFromAlias(objAlias, jToken); } - private JToken GetFieldsetJTokenByAlias(string objAlias, JToken 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; From 08c09a88200ece6f44a383ddd0bed13615ca93ae Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 15 May 2014 16:13:29 +0100 Subject: [PATCH 30/44] Issue #AR-1_serialization: moved Delinter so serialization namespace, - fix small issue with space detection in fieldset delinter --- .../Delinter/ArchetypeJsonDelinterTest.cs | 30 ++++++++++++++++++- .../Extensions/Extensions.cs | 9 ------ .../Serialization/ArchetypeJsonConverter.cs | 5 ++-- .../Serialization/ArchetypeJsonDelinter.cs | 2 +- .../Serialization/SerializationExtensions.cs | 12 +++++++- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index 888f3d9..45712f9 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -22,6 +22,10 @@ namespace Archetype.Tests.Serialization.Delinter 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; @@ -83,6 +87,30 @@ namespace Archetype.Tests.Serialization.Delinter 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(delintedJson); + + Assert.IsInstanceOf(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() { @@ -164,7 +192,7 @@ namespace Archetype.Tests.Serialization.Delinter { } - [AsArchetype("textstringArray")] /* Must have same archetype alias as list class */ + [AsArchetype("textstringArray")] /* due to hard coded string calues above, must have same archetype alias as list class */ [JsonConverter(typeof(ArchetypeJsonConverter))] public class TextString { diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs index 1cade8f..652f345 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs @@ -22,14 +22,5 @@ namespace Archetype.Umbraco.Extensions { return prop.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditorAlias); } - - public static string DelintArchetypeJson(this string input) - { - if (!input.DetectIsJson()) - return String.Empty; - - var delinter = new ArchetypeJsonDelinter(); - return delinter.Execute(input); - } } } diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index 81d620f..803b7e6 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Reflection; using System.Text; +using Archetype.Umbraco.Extensions; using Archetype.Umbraco.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -73,7 +74,7 @@ namespace Archetype.Umbraco.Serialization foreach (var fs in jToken["fieldsets"].Where(fs => fs["alias"].ToString().Equals(GetFieldsetName(itemType)))) { var item = JsonConvert.DeserializeObject( - fs["properties"].ToString(), itemType, this); + fs["properties"].ToString().DelintArchetypeJson(), itemType, this); obj.GetType().GetMethod("Add").Invoke(obj, new[] { item }); } @@ -208,7 +209,7 @@ namespace Archetype.Umbraco.Serialization private object GetPropertyValue(PropertyInfo propertyInfo, JToken propJToken) { return IsTypeArchetypeDatatype(propertyInfo.PropertyType) - ? JsonConvert.DeserializeObject(propJToken.ToString(), propertyInfo.PropertyType, + ? JsonConvert.DeserializeObject(propJToken.ToString().DelintArchetypeJson(), propertyInfo.PropertyType, this) : IsTypeIEnumerableArchetypeDatatype(propertyInfo.PropertyType) ? JsonConvert.DeserializeObject(propJToken["value"].SelectToken("fieldsets").ToString(), propertyInfo.PropertyType, diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index f452741..26607c6 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -62,7 +62,7 @@ namespace Archetype.Umbraco.Serialization {DelinterStep.LabelAlias, new Regex(@"\s*\\+""(alias)\\+"":\s*")}, {DelinterStep.LabelValue, new Regex(@"\s*\\+""(value)\\+"":\s*")}, {DelinterStep.UnescapeValues, new Regex(@"""(alias|value)"":\\+""(.*?)\\+""")}, - {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":""({""fieldsets"".+?})""")}, + {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""({""fieldsets"".+?})""")}, {DelinterStep.RemoveWhiteSpace, new Regex(@"\s+(?=([^""]*""[^""]*"")*[^""]*$)")} }; diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs b/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs index df1cb4d..8d72842 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using Archetype.Umbraco.Extensions; using Newtonsoft.Json; using Umbraco.Core.Models; using Umbraco.Web; @@ -36,6 +37,15 @@ namespace Archetype.Umbraco.Serialization var archetypeJson = content.GetPropertyDataValue(cmsFieldAlias); return JsonConvert.DeserializeObject(archetypeJson) ?? (returnInstanceIfNull ? Activator.CreateInstance() : default(T)); - } + } + + public static string DelintArchetypeJson(this string input) + { + if (!input.DetectIsJson()) + return String.Empty; + + var delinter = new ArchetypeJsonDelinter(); + return delinter.Execute(input); + } } } From bdb7f247c3d023e08a03e9460da336519776d5cb Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 15 May 2014 16:23:48 +0100 Subject: [PATCH 31/44] Issue #AR-1_serialization: add delinter to SerializeForPersistence() --- .../Serialization/Delinter/ArchetypeJsonDelinterTest.cs | 1 - app/Umbraco/Umbraco.Archetype/Models/Archetype.cs | 5 ++--- .../Serialization/ArchetypeJsonConverter.cs | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index 45712f9..4f4a5dd 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Archetype.Tests.Serialization.Base; -using Archetype.Umbraco.Extensions; using Archetype.Umbraco.PropertyEditors; using Archetype.Umbraco.Serialization; using Moq; diff --git a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs b/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs index f2c9ce6..080d126 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs @@ -2,7 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Archetype.Umbraco.Extensions; +using Archetype.Umbraco.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -39,8 +39,7 @@ namespace Archetype.Umbraco.Models .ToList() .ForEach(x => x.Remove()); - //return json.ToString(Formatting.None).DelintArchetypeJson(); - return json.ToString(Formatting.None); + return json.ToString(Formatting.None).DelintArchetypeJson(); } } } diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index 803b7e6..310b6a1 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -6,7 +6,6 @@ using System.IO; using System.Linq; using System.Reflection; using System.Text; -using Archetype.Umbraco.Extensions; using Archetype.Umbraco.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; From 512ecbdb05c09473c0e5e61346e461cf50c13cec Mon Sep 17 00:00:00 2001 From: cankoluman Date: Thu, 15 May 2014 17:02:06 +0100 Subject: [PATCH 32/44] Issue #AR-1_serialization: fixes after merge of upstream master --- .../Base/ArchetypeJsonConverterTestBase.cs | 8 +++--- .../Serialization/Base/RegressionTestBase.cs | 14 ++++++---- .../Delinter/ArchetypeJsonDelinterTest.cs | 6 ++-- .../Regression/JsonTestModels.cs | 2 +- .../UseCases/Complex/JsonTestModels.cs | 2 +- .../Enumerable/ArchetypeJsonConverterTest.cs | 7 +++-- .../UseCases/Enumerable/JsonTestModels.cs | 2 +- .../Serialization/UseCases/JsonTestModels.cs | 2 +- .../Extensions/Extensions.cs | 1 - .../Models/ArchetypeModel.cs | 2 +- .../Serialization/ArchetypeJsonConverter.cs | 28 +++++++++---------- .../Serialization/ArchetypeJsonDelinter.cs | 2 +- .../Serialization/AsArchetypeAttribute.cs | 6 ++-- .../Serialization/AsFieldsetAttribute.cs | 6 ++-- .../Serialization/SerializationExtensions.cs | 12 ++++---- 15 files changed, 52 insertions(+), 48 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/ArchetypeJsonConverterTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/ArchetypeJsonConverterTestBase.cs index 0616e86..d8b0d08 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/ArchetypeJsonConverterTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/ArchetypeJsonConverterTestBase.cs @@ -1,16 +1,16 @@ -using Archetype.Umbraco.PropertyConverters; -using at = Archetype.Umbraco.Models; +using Archetype.PropertyConverters; +using at = Archetype.Models; using Newtonsoft.Json; namespace Archetype.Tests.Serialization.Base { public abstract class ArchetypeJsonConverterTestBase { - public at.Archetype ConvertModelToArchetype(T model) + public at.ArchetypeModel ConvertModelToArchetype(T model) { var converter = new ArchetypeValueConverter(); var json = JsonConvert.SerializeObject(model); - var archetype = (Umbraco.Models.Archetype)converter.ConvertDataToSource(null, json, false); + var archetype = (at.ArchetypeModel)converter.ConvertDataToSource(null, json, false); return archetype; } diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs index 733081c..d06383d 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs @@ -3,9 +3,8 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; -using Archetype.Umbraco.Extensions; -using Archetype.Umbraco.PropertyEditors; -using Archetype.Umbraco.Serialization; +using Archetype.PropertyEditors; +using Archetype.Serialization; using Moq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -13,6 +12,7 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Editors; +using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; @@ -111,7 +111,7 @@ namespace Archetype.Tests.Serialization.Base { prop.DataTypeGuid = propGuid.ToString(); if (prop.Value.ToString().Contains("fieldsets")) - prop.PropertyEditorAlias = Umbraco.Constants.PropertyEditorAlias; + prop.PropertyEditorAlias = Constants.PropertyEditorAlias; } var archetypeJson = JsonConvert.SerializeObject(archetype); @@ -193,9 +193,13 @@ namespace Archetype.Tests.Serialization.Base Mock.Of(), Mock.Of(), Mock.Of(), + Mock.Of(), + Mock.Of(), + Mock.Of(), Mock.Of(), Mock.Of(), - Mock.Of() + Mock.Of(), + Mock.Of() ); ApplicationContext.EnsureContext( diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index 4f4a5dd..7c92ba2 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; +using Archetype.PropertyEditors; +using Archetype.Serialization; using Archetype.Tests.Serialization.Base; -using Archetype.Umbraco.PropertyEditors; -using Archetype.Umbraco.Serialization; using Moq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -129,7 +129,7 @@ namespace Archetype.Tests.Serialization.Delinter { prop.DataTypeGuid = propGuid.ToString(); if (prop.Value.ToString().Contains("fieldsets")) - prop.PropertyEditorAlias = Umbraco.Constants.PropertyEditorAlias; + prop.PropertyEditorAlias = Constants.PropertyEditorAlias; } var archetypeJson = JsonConvert.SerializeObject(archetype); diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestModels.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestModels.cs index ce2763e..8ff3be5 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestModels.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestModels.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Archetype.Umbraco.Serialization; +using Archetype.Serialization; using Newtonsoft.Json; namespace Archetype.Tests.Serialization.Regression diff --git a/app/Umbraco/Archetype.Tests/Serialization/UseCases/Complex/JsonTestModels.cs b/app/Umbraco/Archetype.Tests/Serialization/UseCases/Complex/JsonTestModels.cs index c8aeda8..14f999a 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/UseCases/Complex/JsonTestModels.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/UseCases/Complex/JsonTestModels.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Archetype.Umbraco.Serialization; +using Archetype.Serialization; using Newtonsoft.Json; namespace Archetype.Tests.Serialization.UseCases.Complex diff --git a/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/ArchetypeJsonConverterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/ArchetypeJsonConverterTest.cs index 21f325e..51b4ae5 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/ArchetypeJsonConverterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/ArchetypeJsonConverterTest.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; +using Archetype.Models; +using Archetype.PropertyConverters; using Archetype.Tests.Serialization.Base; -using Archetype.Umbraco.PropertyConverters; using Newtonsoft.Json; using NUnit.Framework; @@ -43,7 +44,7 @@ namespace Archetype.Tests.Serialization.UseCases.Enumerable { var converter = new ArchetypeValueConverter(); var json = JsonConvert.SerializeObject(_feedbacks); - var archetype = (Umbraco.Models.Archetype)converter.ConvertDataToSource(null, json, false); + var archetype = (ArchetypeModel)converter.ConvertDataToSource(null, json, false); Assert.NotNull(archetype); } @@ -93,7 +94,7 @@ namespace Archetype.Tests.Serialization.UseCases.Enumerable { var converter = new ArchetypeValueConverter(); var json = JsonConvert.SerializeObject(_captions); - var archetype = (Umbraco.Models.Archetype)converter.ConvertDataToSource(null, json, false); + var archetype = (ArchetypeModel)converter.ConvertDataToSource(null, json, false); Assert.NotNull(archetype); } diff --git a/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/JsonTestModels.cs b/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/JsonTestModels.cs index 127687f..7e7fdf4 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/JsonTestModels.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/UseCases/Enumerable/JsonTestModels.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Archetype.Umbraco.Serialization; +using Archetype.Serialization; using Newtonsoft.Json; namespace Archetype.Tests.Serialization.UseCases.Enumerable diff --git a/app/Umbraco/Archetype.Tests/Serialization/UseCases/JsonTestModels.cs b/app/Umbraco/Archetype.Tests/Serialization/UseCases/JsonTestModels.cs index 1b244dd..ddc2357 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/UseCases/JsonTestModels.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/UseCases/JsonTestModels.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Archetype.Umbraco.Serialization; +using Archetype.Serialization; using Newtonsoft.Json; namespace Archetype.Tests.Serialization.UseCases diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs index dbd02a2..703a012 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs @@ -2,7 +2,6 @@ using System; using System.Linq; using System.Text.RegularExpressions; using System.Collections.Generic; -using Archetype.Umbraco.Serialization; using Umbraco.Core; using Archetype.Models; diff --git a/app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs index ef4ff45..f1f701c 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs @@ -2,7 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Archetype.Umbraco.Serialization; +using Archetype.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Linq; diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index 310b6a1..ffb6be5 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -1,16 +1,16 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Dynamic; -using System.IO; -using System.Linq; -using System.Reflection; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Dynamic; +using System.IO; +using System.Linq; +using System.Reflection; using System.Text; -using Archetype.Umbraco.Models; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Archetype.Umbraco.Serialization +using Archetype.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Archetype.Serialization { public class ArchetypeJsonConverter : JsonConverter { @@ -512,9 +512,9 @@ namespace Archetype.Umbraco.Serialization private object GetTypedValue(JToken jToken, Type type) { - var property = JsonConvert.DeserializeObject(jToken.ToString()); + var property = JsonConvert.DeserializeObject(jToken.ToString()); - var method = typeof(Property).GetMethod("GetValue"); + var method = typeof(ArchetypePropertyModel).GetMethod("GetValue"); var getValue = method.MakeGenericMethod(type); return getValue.Invoke(property, null); diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index 26607c6..ef7b758 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text.RegularExpressions; -namespace Archetype.Umbraco.Serialization +namespace Archetype.Serialization { public enum DelinterStep { diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/AsArchetypeAttribute.cs b/app/Umbraco/Umbraco.Archetype/Serialization/AsArchetypeAttribute.cs index 800bb36..a3d9088 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/AsArchetypeAttribute.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/AsArchetypeAttribute.cs @@ -1,6 +1,6 @@ -using System; - -namespace Archetype.Umbraco.Serialization +using System; + +namespace Archetype.Serialization { public class AsArchetypeAttribute : Attribute { diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/AsFieldsetAttribute.cs b/app/Umbraco/Umbraco.Archetype/Serialization/AsFieldsetAttribute.cs index bcee649..eca3689 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/AsFieldsetAttribute.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/AsFieldsetAttribute.cs @@ -1,6 +1,6 @@ -using System; - -namespace Archetype.Umbraco.Serialization +using System; + +namespace Archetype.Serialization { public class AsFieldsetAttribute : Attribute { diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs b/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs index 8d72842..e0ace69 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/SerializationExtensions.cs @@ -2,12 +2,12 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using Archetype.Umbraco.Extensions; -using Newtonsoft.Json; -using Umbraco.Core.Models; -using Umbraco.Web; - -namespace Archetype.Umbraco.Serialization +using Archetype.Extensions; +using Newtonsoft.Json; +using Umbraco.Core.Models; +using Umbraco.Web; + +namespace Archetype.Serialization { public static class SerializationExtensions { From 31074ec9db67ee055aa7898ae2cd77122f526ef1 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Fri, 16 May 2014 17:19:05 +0100 Subject: [PATCH 33/44] Issue #AR-4-delinter_fixes: trying to sort out issue with \r\n being replaced inside values --- .../Serialization/Base/RegressionTestBase.cs | 1 - .../Delinter/ArchetypeJsonDelinterTest.cs | 31 ++++++++++++++++++- .../Serialization/ArchetypeJsonDelinter.cs | 20 ++++++------ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs index d06383d..85021fc 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs @@ -12,7 +12,6 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Editors; -using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index 7c92ba2..a60b582 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -49,7 +49,36 @@ namespace Archetype.Tests.Serialization.Delinter _nestedClass.Nested.SlideShow = _referenceModel; _nestedClass.Nested.Nested = GetNestedClass(); - } + } + + [Test] + public void Delinter_ByPasses_Values() + { + const string _JSON_WITH_RESERVED_CHARS = @"{ + ""alias"": ""captions"", + ""value"": ""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test1 \\r \\n test1\r\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test2\r\n test2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b \r\r\rtest3\""}],\""alias\"":\""textstringArray\""}]}"" +}"; + + var referenceModel = new Captions() + { + new TextString() {Text = @"test1 \\r \\n test1\r"}, + new TextString() {Text = @"test2\r\n test2"}, + new TextString() {Text = @"test3b \r\r\rtest3"} + }; + + var actualModel = ConvertArchetypeJsonToModel(_JSON_WITH_RESERVED_CHARS.DelintArchetypeJson()); + + Assert.IsInstanceOf(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() diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index ef7b758..ee7f8e2 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -56,13 +56,13 @@ namespace Archetype.Serialization { Tokens = new Dictionary { - {DelinterStep.RemoveNewLine, new Regex(@"\\r|\\n|[\r\n]", RegexOptions.Multiline)}, - {DelinterStep.LabelFieldsets, new Regex(@"\s*\\+""(fieldsets)\\+"":\s*")}, - {DelinterStep.LabelProperties, new Regex(@"\s*\\+""(properties)\\+"":\s*")}, - {DelinterStep.LabelAlias, new Regex(@"\s*\\+""(alias)\\+"":\s*")}, - {DelinterStep.LabelValue, new Regex(@"\s*\\+""(value)\\+"":\s*")}, - {DelinterStep.UnescapeValues, new Regex(@"""(alias|value)"":\\+""(.*?)\\+""")}, - {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""({""fieldsets"".+?})""")}, + {DelinterStep.RemoveNewLine, new Regex(@"(? String.Empty}, {DelinterAction.UnescapeLabels, match => String.Format(@"""{0}"":", match.Groups[1])}, {DelinterAction.UnescapeValues, match => String.Format(@"""{0}"":""{1}""", match.Groups[1], match.Groups[2])}, - {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{1}", match.Groups[1], match.Groups[2])} + {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1], match.Groups[2])} }; Pipeline = new Dictionary { - {DelinterStep.RemoveNewLine, DelinterAction.Remove}, {DelinterStep.LabelFieldsets, DelinterAction.UnescapeLabels}, {DelinterStep.LabelProperties, DelinterAction.UnescapeLabels}, {DelinterStep.LabelAlias, DelinterAction.UnescapeLabels}, {DelinterStep.LabelValue, DelinterAction.UnescapeLabels}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets}, - {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove} + {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove}, + {DelinterStep.RemoveNewLine, DelinterAction.Remove} }; } } From 6f2eaa9859f2871949e0f8810e9376d02e343c13 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Mon, 19 May 2014 16:08:00 +0100 Subject: [PATCH 34/44] Issue #AR-4-delinter_fixes: trying to fix delinter regex --- .../Delinter/ArchetypeJsonDelinterTest.cs | 2 +- .../Regression/SerializationTestHelper.cs | 2 +- .../Serialization/ArchetypeJsonDelinter.cs | 42 ++++++++----------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index a60b582..5a75dd2 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -52,7 +52,7 @@ namespace Archetype.Tests.Serialization.Delinter } [Test] - public void Delinter_ByPasses_Values() + public void Delinter_RemoveNewLine_ByPasses_Values() { const string _JSON_WITH_RESERVED_CHARS = @"{ ""alias"": ""captions"", diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs index fc4f8b9..843580e 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs @@ -27,7 +27,7 @@ namespace Archetype.Tests.Serialization.Regression DateTwo = null, Id = 123, NullableId = null, - Text = "Test Text" + Text = @"Test \r\n Text ""quote"" \r\n" }; } diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index ee7f8e2..017f9bd 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -6,14 +6,12 @@ namespace Archetype.Serialization { public enum DelinterStep { - RemoveNewLine = 0, - LabelFieldsets, - LabelProperties, - LabelAlias, - LabelValue, + RemoveWhiteSpace = 0, + RemoveNewLine, + UnescapeLabels, + UnescapeAlias, UnescapeValues, FixNestedFieldsets, - RemoveWhiteSpace } public enum DelinterAction @@ -56,34 +54,30 @@ namespace Archetype.Serialization { Tokens = new Dictionary { - {DelinterStep.RemoveNewLine, new Regex(@"(?> { {DelinterAction.Remove, match => String.Empty}, - {DelinterAction.UnescapeLabels, match => String.Format(@"""{0}"":", match.Groups[1])}, - {DelinterAction.UnescapeValues, match => String.Format(@"""{0}"":""{1}""", match.Groups[1], match.Groups[2])}, - {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1], match.Groups[2])} + {DelinterAction.UnescapeLabels, match => String.Format(@"""{0}"":", match.Groups[1].Value)}, + {DelinterAction.UnescapeValues, match => String.Format(@"""{0}"":""{1}""", match.Groups[1].Value, match.Groups[2].Value)}, + {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1].Value, match.Groups[3].Value)} }; Pipeline = new Dictionary { - {DelinterStep.LabelFieldsets, DelinterAction.UnescapeLabels}, - {DelinterStep.LabelProperties, DelinterAction.UnescapeLabels}, - {DelinterStep.LabelAlias, DelinterAction.UnescapeLabels}, - {DelinterStep.LabelValue, DelinterAction.UnescapeLabels}, + {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove}, + {DelinterStep.RemoveNewLine, DelinterAction.Remove}, + {DelinterStep.UnescapeLabels, DelinterAction.UnescapeLabels}, + {DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, - {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets}, - {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove}, - {DelinterStep.RemoveNewLine, DelinterAction.Remove} + {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets} }; } } From 1913f8bf14f902b7ca6f009bf8ba358018a650ba Mon Sep 17 00:00:00 2001 From: cankoluman Date: Mon, 19 May 2014 16:25:20 +0100 Subject: [PATCH 35/44] Issue #AR-4-delinter_fixes: create single entry point for deserialization - 15 tests failing now --- .../Serialization/ArchetypeJsonConverter.cs | 77 +++++++++++-------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index ffb6be5..d7c8475 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -38,22 +38,9 @@ namespace Archetype.Serialization var jToken = JToken.ReadFrom(reader); if (jToken == null) - return null; - - var obj = Activator.CreateInstance(objectType); + return null; - if (null != obj as IEnumerable) - { - JToken enumerableToken; - - if (TryParseJTokenAsEnumerable(jToken, out enumerableToken) - || TryParseJTokenAsEnumerable(jToken["value"], out enumerableToken)) - return DeserializeEnumerableObject(obj, enumerableToken); - } - - return null == jToken as JArray - ? DeserializeObject(obj, jToken) - : PopulateProperties(obj, jToken); + return DeserializeJson(objectType, GetDelintedJToken(jToken)); } public override bool CanConvert(Type objectType) @@ -63,17 +50,48 @@ namespace Archetype.Serialization #endregion - #region private methods - deserialization + #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) + { + 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; - - var itemType = model.GetType().BaseType.GetGenericArguments().First(); - foreach (var fs in jToken["fieldsets"].Where(fs => fs["alias"].ToString().Equals(GetFieldsetName(itemType)))) - { - var item = JsonConvert.DeserializeObject( - fs["properties"].ToString().DelintArchetypeJson(), itemType, this); + var model = obj as IEnumerable; + 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 }); } @@ -208,15 +226,12 @@ namespace Archetype.Serialization private object GetPropertyValue(PropertyInfo propertyInfo, JToken propJToken) { return IsTypeArchetypeDatatype(propertyInfo.PropertyType) - ? JsonConvert.DeserializeObject(propJToken.ToString().DelintArchetypeJson(), propertyInfo.PropertyType, - this) + ? DeserializeJson(propertyInfo.PropertyType, propJToken) : IsTypeIEnumerableArchetypeDatatype(propertyInfo.PropertyType) - ? JsonConvert.DeserializeObject(propJToken["value"].SelectToken("fieldsets").ToString(), propertyInfo.PropertyType, - this) + ? 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)) @@ -266,8 +281,10 @@ namespace Archetype.Serialization resultToken = null; //To Do: Strange newtonsoft behaviour - var fsToken = jToken.Parent == null ? jToken["fieldsets"] : jToken.Parent.Children().First(); - var jTokenEnumerable = jToken != null && fsToken != null && fsToken.Any(); + //var fsToken = jToken.Parent == null ? jToken["fieldsets"] : jToken.Parent.Children().First()["fieldsets"]; + var fsToken = jToken.SelectToken("fieldsets") != null ? jToken["fieldsets"] : jToken.Parent.Children().First(); + var jTokenEnumerable = jToken != null + && fsToken != null && fsToken is JArray; if (jTokenEnumerable) resultToken = jToken; From d5329935aa609169116768cb80ab5fd29668db56 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 20 May 2014 09:32:01 +0100 Subject: [PATCH 36/44] Issue #AR-4-delinter_fixes: fixed all test failures due to jToken navigation errors. To Do: fix erros due to incorrect space removal --- .../Serialization/Regression/JsonTestStrings.cs | 2 +- .../Serialization/ArchetypeJsonConverter.cs | 8 ++++++-- .../Serialization/ArchetypeJsonDelinter.cs | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs index 72a503a..3e31c01 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs @@ -9,7 +9,7 @@ ""properties"": [ { ""alias"": ""text"", - ""value"": ""Test Text"" + ""value"": ""Test \r\n Text \""quote\"" \r\n"" }, { ""alias"": ""integer"", diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index d7c8475..ed50204 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -281,8 +281,12 @@ namespace Archetype.Serialization resultToken = null; //To Do: Strange newtonsoft behaviour - //var fsToken = jToken.Parent == null ? jToken["fieldsets"] : jToken.Parent.Children().First()["fieldsets"]; - var fsToken = jToken.SelectToken("fieldsets") != null ? jToken["fieldsets"] : jToken.Parent.Children().First(); + 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; diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index 017f9bd..98f1d56 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -54,7 +54,7 @@ namespace Archetype.Serialization { Tokens = new Dictionary { - {DelinterStep.RemoveWhiteSpace, new Regex(@"\s+(?=([^""]*""[^""]*"")*[^""]*$)", RegexOptions.Multiline)}, + {DelinterStep.RemoveWhiteSpace, new Regex(@"\s+(?!([^""]*""[^""]*"")*[^""]*$)", RegexOptions.Multiline)}, {DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\+?""(alias|value|properties|fieldsets)\\+?"":\{*?(\\*|""|\[))|(\\+r\\+n)(?=(\{|\}|\]))")}, {DelinterStep.UnescapeLabels, new Regex(@"\\+""(fieldsets|properties|alias|value)\\+"":")}, {DelinterStep.UnescapeAlias, new Regex(@"""(alias)"":\\+""(.*?)\\+""", RegexOptions.Multiline)}, From cda17ac7542649b02a8535bdab428cf3c598414b Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 20 May 2014 10:39:09 +0100 Subject: [PATCH 37/44] Issue #AR-4-delinter_fixes: update remove new line --- .../Serialization/ArchetypeJsonDelinter.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index 98f1d56..b98f7bb 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -54,12 +54,12 @@ namespace Archetype.Serialization { Tokens = new Dictionary { - {DelinterStep.RemoveWhiteSpace, new Regex(@"\s+(?!([^""]*""[^""]*"")*[^""]*$)", RegexOptions.Multiline)}, - {DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\+?""(alias|value|properties|fieldsets)\\+?"":\{*?(\\*|""|\[))|(\\+r\\+n)(?=(\{|\}|\]))")}, + {DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\*?""(alias|value|properties|fieldsets)\\*?"":\{*?(\\*|""|\[))|(\\+r\\+n)(?=\s*?(\{|\}|\]))|(\r|\n)+|(\\+r\\n+)(?=\s+)")}, + {DelinterStep.RemoveWhiteSpace, new Regex(@"\s+")}, {DelinterStep.UnescapeLabels, new Regex(@"\\+""(fieldsets|properties|alias|value)\\+"":")}, - {DelinterStep.UnescapeAlias, new Regex(@"""(alias)"":\\+""(.*?)\\+""", RegexOptions.Multiline)}, - {DelinterStep.UnescapeValues, new Regex(@"""(value)"":\\+""(.*?)\\+""(?=\})", RegexOptions.Multiline)}, - {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""\{(\\+r\\+n)*?(""fieldsets""[\S\s]+?)}""", RegexOptions.Multiline)} + {DelinterStep.UnescapeAlias, new Regex(@"""(alias)"":\\+""(.*?)\\+""")}, + {DelinterStep.UnescapeValues, new Regex(@"""(value)"":\\+""(.*?)\\+""(?=\})")}, + {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""\{(\\+r\\+n)*?(""fieldsets""[\S\s]+?)}""")} }; Actions = new Dictionary> @@ -72,8 +72,8 @@ namespace Archetype.Serialization Pipeline = new Dictionary { - {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove}, - {DelinterStep.RemoveNewLine, DelinterAction.Remove}, + {DelinterStep.RemoveNewLine, DelinterAction.Remove}, + {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove}, {DelinterStep.UnescapeLabels, DelinterAction.UnescapeLabels}, {DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, From d9a25d1bb3b0473782061111c35068b852a2094d Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 20 May 2014 12:18:48 +0100 Subject: [PATCH 38/44] Issue #AR-4-delinter_fixes: fix all regexes except white space --- .../Serialization/ArchetypeJsonDelinter.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index b98f7bb..628ad43 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -17,6 +17,7 @@ namespace Archetype.Serialization public enum DelinterAction { Remove = 0, + RemoveWhiteSpace, UnescapeLabels, UnescapeValues, FixNestedFieldsets @@ -54,26 +55,27 @@ namespace Archetype.Serialization { Tokens = new Dictionary { - {DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\*?""(alias|value|properties|fieldsets)\\*?"":\{*?(\\*|""|\[))|(\\+r\\+n)(?=\s*?(\{|\}|\]))|(\r|\n)+|(\\+r\\n+)(?=\s+)")}, - {DelinterStep.RemoveWhiteSpace, new Regex(@"\s+")}, - {DelinterStep.UnescapeLabels, new Regex(@"\\+""(fieldsets|properties|alias|value)\\+"":")}, + {DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\*?""""(alias|value|properties|fieldsets)\\*?"""":\{*?(\\*|""""|\[))|(\\+r\\+n)(?=\s*?(\{|\}|\]))|(\r|\n)+|(\\+r\\n+)(?!\s+.*?\\+""})")}, + {DelinterStep.RemoveWhiteSpace, new Regex(@"(\s*?)\\+""(fieldsets|properties|alias|value)\\+"":(\s+)|""(\s*?)\},(\s+)\{|\[(\s+)\{|[\]\}](\s+)[\]\}]")}, + {DelinterStep.UnescapeLabels, new Regex(@"\\+""(fieldsets|properties|alias|value)\\+"":(\s*)")}, {DelinterStep.UnescapeAlias, new Regex(@"""(alias)"":\\+""(.*?)\\+""")}, - {DelinterStep.UnescapeValues, new Regex(@"""(value)"":\\+""(.*?)\\+""(?=\})")}, - {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""\{(\\+r\\+n)*?(""fieldsets""[\S\s]+?)}""")} + {DelinterStep.UnescapeValues, new Regex(@"""(value)"":\\+""(.*?)\\+""(?=\s*?\})")}, + {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""\{\s*?(""fieldsets""[\S\s]+?)}""")} }; Actions = new Dictionary> { {DelinterAction.Remove, match => String.Empty}, + {DelinterAction.RemoveWhiteSpace, match => match.Groups[2].Success ? match.Groups[0].Value : String.Empty}, {DelinterAction.UnescapeLabels, match => String.Format(@"""{0}"":", match.Groups[1].Value)}, {DelinterAction.UnescapeValues, match => String.Format(@"""{0}"":""{1}""", match.Groups[1].Value, match.Groups[2].Value)}, - {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1].Value, match.Groups[3].Value)} + {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1].Value, match.Groups[2].Value)} }; Pipeline = new Dictionary { {DelinterStep.RemoveNewLine, DelinterAction.Remove}, - {DelinterStep.RemoveWhiteSpace, DelinterAction.Remove}, + //{DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, {DelinterStep.UnescapeLabels, DelinterAction.UnescapeLabels}, {DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, From d124622089ba507b8c39ea0c28fd2ad1cb6e4649 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 20 May 2014 13:07:18 +0100 Subject: [PATCH 39/44] Issue #AR-4-delinter_fixes: refactor delinter --- .../Delinter/ArchetypeJsonDelinterTest.cs | 2 +- .../Serialization/ArchetypeJsonDelinter.cs | 60 +++++++++++++------ 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index 5a75dd2..e254e4d 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -56,7 +56,7 @@ namespace Archetype.Tests.Serialization.Delinter { const string _JSON_WITH_RESERVED_CHARS = @"{ ""alias"": ""captions"", - ""value"": ""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test1 \\r \\n test1\r\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test2\r\n test2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b \r\r\rtest3\""}],\""alias\"":\""textstringArray\""}]}"" + ""value"": ""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test1 \r \n test1\r\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test2\r\n test2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b \r\r\rtest3\""}],\""alias\"":\""textstringArray\""}]}"" }"; var referenceModel = new Captions() diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index 628ad43..0398952 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -12,6 +12,7 @@ namespace Archetype.Serialization UnescapeAlias, UnescapeValues, FixNestedFieldsets, + FixValueContent } public enum DelinterAction @@ -20,14 +21,15 @@ namespace Archetype.Serialization RemoveWhiteSpace, UnescapeLabels, UnescapeValues, - FixNestedFieldsets + FixNestedFieldsets, + FixValueContent } public class ArchetypeJsonDelinter { public IDictionary Pipeline { get; set; } public IDictionary Tokens { get; set; } - public IDictionary> Actions { get; set; } + public IDictionary> Actions { get; set; } public ArchetypeJsonDelinter() { @@ -41,11 +43,7 @@ namespace Archetype.Serialization foreach (var step in Pipeline.Keys) { var action = Pipeline[step]; - while (Tokens[step].IsMatch(buffer)) - { - buffer = Tokens[step] - .Replace(buffer, match => Actions[action](match)); - } + buffer = Actions[action](buffer, Tokens[step]); } return buffer; @@ -60,27 +58,53 @@ namespace Archetype.Serialization {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]+?)}""")} + {DelinterStep.FixNestedFieldsets, new Regex(@"""(value)"":\s*?""\{\s*?(""fieldsets""[\S\s]+?)}""")}, + {DelinterStep.FixValueContent, new Regex(@"""(value)"":""(.*?)(?> + + Actions = new Dictionary> { - {DelinterAction.Remove, match => String.Empty}, - {DelinterAction.RemoveWhiteSpace, match => match.Groups[2].Success ? match.Groups[0].Value : String.Empty}, - {DelinterAction.UnescapeLabels, match => String.Format(@"""{0}"":", match.Groups[1].Value)}, - {DelinterAction.UnescapeValues, match => String.Format(@"""{0}"":""{1}""", match.Groups[1].Value, match.Groups[2].Value)}, - {DelinterAction.FixNestedFieldsets, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1].Value, match.Groups[2].Value)} + {DelinterAction.Remove, (input, pattern) => + RecursiveReplace(input, pattern, match => String.Empty) + }, + {DelinterAction.RemoveWhiteSpace, (input, pattern) => + RecursiveReplace(input, pattern, match => match.Groups[2].Success ? match.Groups[0].Value : String.Empty) + }, + {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)) + }, + {DelinterAction.FixValueContent, (input, pattern) => + pattern.Replace(input, match => String.Format(@"""{0}"":""{1}""", match.Groups[1].Value, + (new Regex(@"\\+")).Replace(match.Groups[2].Value, @"\"))) + }, }; Pipeline = new Dictionary { - {DelinterStep.RemoveNewLine, DelinterAction.Remove}, - //{DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, + {DelinterStep.RemoveNewLine, DelinterAction.Remove}, {DelinterStep.UnescapeLabels, DelinterAction.UnescapeLabels}, {DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, - {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets} + {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets}, + {DelinterStep.FixValueContent, DelinterAction.FixValueContent} + //{DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, }; } + + private string RecursiveReplace(string input, Regex pattern, Func matchFunc) + { + var buffer = input; + while (pattern.IsMatch(buffer)) + { + buffer = pattern.Replace(input, match => matchFunc(match)); + } + return buffer; + } } } From a306424162b4ea0ab0434c61beaf8c562dd4f457 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 20 May 2014 15:05:44 +0100 Subject: [PATCH 40/44] Issue #AR-4-delinter_fixes: fix issue where escaped new lines were being removed inside value quotes --- .../Serialization/Regression/JsonTestStrings.cs | 2 +- .../Serialization/Regression/SerializationTestHelper.cs | 4 +++- .../Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs index 3e31c01..df58e5d 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/JsonTestStrings.cs @@ -9,7 +9,7 @@ ""properties"": [ { ""alias"": ""text"", - ""value"": ""Test \r\n Text \""quote\"" \r\n"" + ""value"": ""Test \r\nText \""quote\"" \r\n"" }, { ""alias"": ""integer"", diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs index 843580e..d8e8a54 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/SerializationTestHelper.cs @@ -27,7 +27,9 @@ namespace Archetype.Tests.Serialization.Regression DateTwo = null, Id = 123, NullableId = null, - Text = @"Test \r\n Text ""quote"" \r\n" + Text = @"Test +Text ""quote"" +" }; } diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index 0398952..a06cf9f 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -53,7 +53,7 @@ namespace Archetype.Serialization { Tokens = new Dictionary { - {DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\*?""""(alias|value|properties|fieldsets)\\*?"""":\{*?(\\*|""""|\[))|(\\+r\\+n)(?=\s*?(\{|\}|\]))|(\r|\n)+|(\\+r\\n+)(?!\s+.*?\\+""})")}, + {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*?)\\+""(fieldsets|properties|alias|value)\\+"":(\s+)|""(\s*?)\},(\s+)\{|\[(\s+)\{|[\]\}](\s+)[\]\}]")}, {DelinterStep.UnescapeLabels, new Regex(@"\\+""(fieldsets|properties|alias|value)\\+"":(\s*)")}, {DelinterStep.UnescapeAlias, new Regex(@"""(alias)"":\\+""(.*?)\\+""")}, @@ -81,7 +81,7 @@ namespace Archetype.Serialization }, {DelinterAction.FixValueContent, (input, pattern) => pattern.Replace(input, match => String.Format(@"""{0}"":""{1}""", match.Groups[1].Value, - (new Regex(@"\\+")).Replace(match.Groups[2].Value, @"\"))) + (new Regex(@"\\{2,}")).Replace(match.Groups[2].Value, @"\"))) }, }; From 14777a98dc6aa675fc39efc4d0adacedc9f23181 Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 20 May 2014 16:22:47 +0100 Subject: [PATCH 41/44] Issue #AR-4-delinter_fixes: removed buggy escaped json tests --- .../Serialization/Base/RegressionTestBase.cs | 49 +------------ .../Delinter/ArchetypeJsonDelinterTest.cs | 9 ++- .../Regression/ArchetypeJsonConverterTest.cs | 70 ------------------- .../ArcheTypePropertyEditor.cs | 4 +- .../Serialization/ArchetypeJsonDelinter.cs | 16 ++--- 5 files changed, 13 insertions(+), 135 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs index 85021fc..6ff02c5 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs @@ -15,6 +15,7 @@ using Umbraco.Core.Models.Editors; using Umbraco.Core.Persistence; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; +using Umbraco.Web.PropertyEditors; namespace Archetype.Tests.Serialization.Base { @@ -92,59 +93,11 @@ namespace Archetype.Tests.Serialization.Base AssertAreEqual(model, resultfromArchetypeJson); } - protected void CompoundModel_WithEscapedJson_Regression_Battery(T model) - { - var propGuid = new Guid(); - var dtd = new DataTypeDefinition(-1, String.Empty) {Id = 0}; - - var dataTypeService = new Mock(); - dataTypeService.Setup(dts => dts.GetDataTypeDefinitionById(Guid.Parse(propGuid.ToString()))).Returns(dtd); - dataTypeService.Setup(dts => dts.GetPreValuesCollectionByDataTypeId(dtd.Id)).Returns(new PreValueCollection(new Dictionary())); - - var propValueEditor = new Mock(new PropertyValueEditor()); - propValueEditor.Setup(pe => pe.GetPropertyEditor(dtd)).Returns(new ArchetypePropertyEditor()); - - var archetype = ConvertModelToArchetype(model); - - 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()), new Dictionary()), - archetypeJson); - - Assert.IsNotNull(convertedJson); - - var resultfromArchetypeJson = ConvertArchetypeJsonToModel(archetypeJson); - var resultfromConvertedJson = ConvertArchetypeJsonToModel(convertedJson.ToString().DelintArchetypeJson()); - - Assert.IsInstanceOf(resultfromArchetypeJson); - AssertAreEqual(model, resultfromArchetypeJson); - - Assert.IsInstanceOf(resultfromConvertedJson); - AssertAreEqual(model, resultfromConvertedJson); - } - protected void NestedModel_Regression_Battery(T model) { CompoundModel_Regression_Battery(model); } - protected void NestedModel_WithEscapedJson_Regression_Battery(T model) - { - CompoundModel_WithEscapedJson_Regression_Battery(model); - } - protected void ComplexModel_Regression_Battery(T model) { CompoundModel_Regression_Battery(model); diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index e254e4d..aa06ce0 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -56,13 +56,16 @@ namespace Archetype.Tests.Serialization.Delinter { const string _JSON_WITH_RESERVED_CHARS = @"{ ""alias"": ""captions"", - ""value"": ""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test1 \r \n test1\r\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test2\r\n test2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b \r\r\rtest3\""}],\""alias\"":\""textstringArray\""}]}"" + ""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 \\r\\r\\rtest3\""}],\""alias\"":\""textstringArray\""}]}"" }"; var referenceModel = new Captions() { - new TextString() {Text = @"test1 \\r \\n test1\r"}, - new TextString() {Text = @"test2\r\n test2"}, + new TextString() {Text = @"test1 + test1 +"}, + new TextString() {Text = @"test2 +test2"}, new TextString() {Text = @"test3b \r\r\rtest3"} }; diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs index 4246963..83f4384 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs @@ -67,13 +67,6 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } - [Test] - public void CompoundModel_WithEscapedJson_Regression_Battery() - { - var compoundModel = _testHelper.GetModel(); - CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); - } - [Test] public void CompoundModelWithMixedFieldsetVariant1_Regression_Battery() { @@ -81,13 +74,6 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } - [Test] - public void CompoundModelWithMixedFieldsetVariant1_WithEscapedJson_Regression_Battery() - { - var compoundModel = _testHelper.GetModel(); - CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); - } - [Test] public void CompoundModelWithMixedFieldsetVariant2_Regression_Battery() { @@ -95,13 +81,6 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } - [Test] - public void CompoundModelWithMixedFieldsetVariant2_WithEscapedJson_Regression_Battery() - { - var compoundModel = _testHelper.GetModel(); - CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); - } - [Test] public void CompoundModelWithFieldset_Regression_Battery() { @@ -109,13 +88,6 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModel); } - [Test] - public void CompoundModelWithFieldset_WithEscapedJson_Regression_Battery() - { - var compoundModel = _testHelper.GetModel(); - CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); - } - [Test] public void CompoundModelWithList_Regression_Battery() { @@ -123,13 +95,6 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModelWithList); } - [Test] - public void CompoundModelWithList_WithEscapedJson_Regression_Battery() - { - var compoundModel = _testHelper.GetModel(); - CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); - } - [Test] public void CompoundModelWithMixedFieldsetWithList_Regression_Battery() { @@ -137,13 +102,6 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModelWithList); } - [Test] - public void CompoundModelWithMixedFieldsetWithList_WithEscapedJson_Regression_Battery() - { - var compoundModel = _testHelper.GetModel(); - CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); - } - [Test] public void CompoundModelWithFieldsetWithList_Regression_Battery() { @@ -151,13 +109,6 @@ namespace Archetype.Tests.Serialization.Regression CompoundModel_Regression_Battery(compoundModelWithList); } - [Test] - public void CompoundModelWithFieldsetWithList_WithEscapedJson_Regression_Battery() - { - var compoundModel = _testHelper.GetModel(); - CompoundModel_WithEscapedJson_Regression_Battery(compoundModel); - } - [Test] public void NestedModel_Regression_Battery() { @@ -165,13 +116,6 @@ namespace Archetype.Tests.Serialization.Regression NestedModel_Regression_Battery(nestedModel); } - [Test] - public void NestedModel_WithEscapedJson_Regression_Battery() - { - var nestedModel = _testHelper.GetModel(); - NestedModel_WithEscapedJson_Regression_Battery(nestedModel); - } - [Test] public void NestedModelWithMixedFieldset_Regression_Battery() { @@ -179,13 +123,6 @@ namespace Archetype.Tests.Serialization.Regression NestedModel_Regression_Battery(nestedModel); } - [Test] - public void NestedModelWithMixedFieldset_WithEscapedJson_Regression_Battery() - { - var nestedModel = _testHelper.GetModel(); - NestedModel_WithEscapedJson_Regression_Battery(nestedModel); - } - [Test] public void NestedModelWithFieldset_Regression_Battery() { @@ -193,13 +130,6 @@ namespace Archetype.Tests.Serialization.Regression NestedModel_Regression_Battery(nestedModel); } - [Test] - public void NestedModelWithFieldset_WithEscapedJson_Regression_Battery() - { - var nestedModel = _testHelper.GetModel(); - NestedModel_WithEscapedJson_Regression_Battery(nestedModel); - } - [Test] public void ComplexModel_Regression_Battery() { diff --git a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs index b5b21ba..a4d3e98 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs @@ -126,8 +126,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()); - var propEditor = GetPropertyEditor(dtd); + var propData = new ContentPropertyData(propDef.Value, preValues, new Dictionary()); + var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias); propDef.Value = propEditor.ValueEditor.ConvertEditorToDb(propData, propDef.Value); } catch (Exception ex) diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index a06cf9f..b1b2b63 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -11,8 +11,7 @@ namespace Archetype.Serialization UnescapeLabels, UnescapeAlias, UnescapeValues, - FixNestedFieldsets, - FixValueContent + FixNestedFieldsets } public enum DelinterAction @@ -21,8 +20,7 @@ namespace Archetype.Serialization RemoveWhiteSpace, UnescapeLabels, UnescapeValues, - FixNestedFieldsets, - FixValueContent + FixNestedFieldsets } public class ArchetypeJsonDelinter @@ -58,8 +56,7 @@ namespace Archetype.Serialization {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]+?)}""")}, - {DelinterStep.FixValueContent, new Regex(@"""(value)"":""(.*?)(?> @@ -78,11 +75,7 @@ namespace Archetype.Serialization }, {DelinterAction.FixNestedFieldsets, (input, pattern) => RecursiveReplace(input, pattern, match => String.Format(@"""{0}"":{{{1}}}", match.Groups[1].Value, match.Groups[2].Value)) - }, - {DelinterAction.FixValueContent, (input, pattern) => - pattern.Replace(input, match => String.Format(@"""{0}"":""{1}""", match.Groups[1].Value, - (new Regex(@"\\{2,}")).Replace(match.Groups[2].Value, @"\"))) - }, + } }; Pipeline = new Dictionary @@ -92,7 +85,6 @@ namespace Archetype.Serialization {DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets}, - {DelinterStep.FixValueContent, DelinterAction.FixValueContent} //{DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, }; } From 0cfcaa336404d5be90035bafd1215907271b153b Mon Sep 17 00:00:00 2001 From: cankoluman Date: Wed, 21 May 2014 14:15:54 +0100 Subject: [PATCH 42/44] Issue #AR-4-delinter_fixes: change heuristic for space removal --- .../Serialization/Base/RegressionTestBase.cs | 10 +------ .../Delinter/ArchetypeJsonDelinterTest.cs | 13 ++++++--- .../Serialization/ArchetypeJsonDelinter.cs | 27 ++++++++++++------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs index 6ff02c5..db9b84b 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs @@ -1,21 +1,13 @@ -using System; -using System.Collections; -using System.Collections.Generic; +using System.Collections; using System.Linq; using System.Reflection; -using Archetype.PropertyEditors; using Archetype.Serialization; using Moq; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Editors; using Umbraco.Core.Persistence; -using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; -using Umbraco.Web.PropertyEditors; namespace Archetype.Tests.Serialization.Base { diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index aa06ce0..dcb02a4 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -56,7 +56,11 @@ namespace Archetype.Tests.Serialization.Delinter { 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 \\r\\r\\rtest3\""}],\""alias\"":\""textstringArray\""}]}"" + ""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() @@ -66,10 +70,13 @@ namespace Archetype.Tests.Serialization.Delinter "}, new TextString() {Text = @"test2 test2"}, - new TextString() {Text = @"test3b \r\r\rtest3"} + new TextString() {Text = @"test3b ""quote"" \r\r\rtest3"} }; - var actualModel = ConvertArchetypeJsonToModel(_JSON_WITH_RESERVED_CHARS.DelintArchetypeJson()); + var delintedJson = _JSON_WITH_RESERVED_CHARS.DelintArchetypeJson(); + var actualModel = ConvertArchetypeJsonToModel(delintedJson); + + var t = JToken.Parse(delintedJson).ToString(Formatting.None); Assert.IsInstanceOf(actualModel); Assert.IsNotNull(actualModel); diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index b1b2b63..894a442 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -1,13 +1,14 @@ using System; +using System.Linq; using System.Collections.Generic; using System.Text.RegularExpressions; namespace Archetype.Serialization { public enum DelinterStep - { - RemoveWhiteSpace = 0, - RemoveNewLine, + { + RemoveNewLine = 0, + RemoveWhiteSpace, UnescapeLabels, UnescapeAlias, UnescapeValues, @@ -25,9 +26,9 @@ namespace Archetype.Serialization public class ArchetypeJsonDelinter { - public IDictionary Pipeline { get; set; } - public IDictionary Tokens { get; set; } - public IDictionary> Actions { get; set; } + public IDictionary Pipeline { get; private set; } + public IDictionary Tokens { get; private set; } + public IDictionary> Actions { get; private set; } public ArchetypeJsonDelinter() { @@ -52,7 +53,7 @@ namespace Archetype.Serialization Tokens = new Dictionary { {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*?)\\+""(fieldsets|properties|alias|value)\\+"":(\s+)|""(\s*?)\},(\s+)\{|\[(\s+)\{|[\]\}](\s+)[\]\}]")}, + {DelinterStep.RemoveWhiteSpace, new Regex(@"(""\S+?"":)(\s+?)("")|([\{\[\}\],]|(? String.Empty) }, {DelinterAction.RemoveWhiteSpace, (input, pattern) => - RecursiveReplace(input, pattern, match => match.Groups[2].Success ? match.Groups[0].Value : String.Empty) + RecursiveReplace(input.Trim(), pattern, match => + String.Join(String.Empty, + match.Groups + .OfType() + .Select((g, i) => String.IsNullOrWhiteSpace(g.Value) ? String.Empty : g.Value) + .Skip(1) + .ToArray())) }, {DelinterAction.UnescapeLabels, (input, pattern) => RecursiveReplace(input, pattern, match => String.Format(@"""{0}"":", match.Groups[1].Value)) @@ -85,7 +92,7 @@ namespace Archetype.Serialization {DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets}, - //{DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, + {DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, }; } @@ -94,7 +101,7 @@ namespace Archetype.Serialization var buffer = input; while (pattern.IsMatch(buffer)) { - buffer = pattern.Replace(input, match => matchFunc(match)); + buffer = pattern.Replace(buffer, match => matchFunc(match)); } return buffer; } From 11791470417151296e04127d459699685f54121d Mon Sep 17 00:00:00 2001 From: cankoluman Date: Wed, 21 May 2014 14:22:11 +0100 Subject: [PATCH 43/44] Issue #AR-4-delinter_fixes: simplify replace --- .../Serialization/ArchetypeJsonDelinter.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index 894a442..ea2c55c 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -67,12 +67,8 @@ namespace Archetype.Serialization }, {DelinterAction.RemoveWhiteSpace, (input, pattern) => RecursiveReplace(input.Trim(), pattern, match => - String.Join(String.Empty, - match.Groups - .OfType() - .Select((g, i) => String.IsNullOrWhiteSpace(g.Value) ? String.Empty : g.Value) - .Skip(1) - .ToArray())) + 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)) From a520d86ec43bad50c368e55b7387be2ad0c05b5b Mon Sep 17 00:00:00 2001 From: cankoluman Date: Tue, 17 Jun 2014 11:13:25 +0100 Subject: [PATCH 44/44] Issue #AR-5_empty_json: Handle the case where the archetype json is empty: {""fieldsets"": []} Currently this throws an exception. Handle by setting returned model to null. --- .../Regression/ArchetypeJsonConverterTest.cs | 9 +++++++++ .../Serialization/ArchetypeJsonConverter.cs | 16 ++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs index 83f4384..daf5241 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs @@ -14,6 +14,15 @@ namespace Archetype.Tests.Serialization.Regression { _testHelper = new SerializationTestHelper(); } + + [Test] + public void EmptyArray_Returns_Null() + { + var archetypeJson = @"{""fieldsets"": []}"; + var result = ConvertArchetypeJsonToModel(archetypeJson); + + Assert.IsNull(result); + } [Test] public void SimpleModel_Regression_Battery() diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index ed50204..3151862 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -136,15 +136,15 @@ namespace Archetype.Serialization if (objToken.SelectToken("properties") != null) return PopulateProperties(obj, objToken["properties"]); - if (objToken is JArray) - { - var defaultFsProperties = properties.Where(pInfo => !HasAsFieldsetAttribute(pInfo)).ToList(); + if (!(objToken is JArray) || (objToken as JArray).Count <= 0) + return null; - foreach (var property in defaultFsProperties) - { - var propJToken = ParseJTokenFromItems(objToken, GetJsonPropertyName(property)); - PopulateProperty(obj, propJToken["properties"], property); - } + 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));