From 475fe7c81ff2f1a7306245de957bb88620bf4ffe Mon Sep 17 00:00:00 2001 From: cankoluman Date: Mon, 12 May 2014 17:15:20 +0100 Subject: [PATCH] Issue #AR-1_serialization: fix error in IsConverter when PropertyEditorAlias is null, - relax property token navigation so that if a nested token is not found, we return null. --- .../ArchetypeValueConverter.cs | 7 +-- .../Serialization/ArchetypeJsonConverter.cs | 52 ++++++++----------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs index 2f096d3..ee453fb 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs @@ -22,9 +22,10 @@ namespace Archetype.Umbraco.PropertyConverters get { return ApplicationContext.Current.Services; } } - public override bool IsConverter(PublishedPropertyType propertyType) - { - return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias); + public override bool IsConverter(PublishedPropertyType propertyType) + { + return !String.IsNullOrEmpty(propertyType.PropertyEditorAlias) + && propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias); } public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs index fead97a..053eac9 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonConverter.cs @@ -93,11 +93,7 @@ namespace Archetype.Umbraco.Serialization ? GetFieldsetJTokenByAlias(propAlias, jToken) : GetFieldsetJTokenByTypeAlias(propInfo.PropertyType, jToken); - //make recursive - var propJToken = fsJToken.SelectToken("properties") != null - ? GetPropertyJToken(propAlias, fsJToken["properties"]) - : GetPropertyJToken(propAlias, - fsJToken.Single(p => p.SelectToken("alias").ToString().Equals(propAlias))["properties"]); + var propJToken = GetPropertyJToken(fsJToken, propAlias); if (propJToken == null) continue; @@ -112,10 +108,6 @@ namespace Archetype.Umbraco.Serialization var objToken = GetFieldsetJTokenByTypeAlias(obj.GetType(), jToken); - //return objToken == null - // ? obj - // : PopulateProperties(obj, objToken["properties"] ?? new JArray(objToken)); - if (objToken == null) return obj; @@ -133,22 +125,21 @@ namespace Archetype.Umbraco.Serialization } } - //if (objToken.SelectToken("properties") != null) - // return PopulateProperties(obj, objToken["properties"]); - - //PopulateProperties(obj, new JArray(objToken)); - - //var defaultFsProperties = properties.Where(pInfo => !HasAsFieldsetAttribute(pInfo)).ToList(); - - //foreach (var property in defaultFsProperties) - //{ - // var propJToken = ParseJTokenFromItems(objToken, GetJsonPropertyName(property)); - // PopulateProperty(obj, propJToken["properties"], property); - //} - return PopulateProperties(obj, new JArray(objToken)); - } - + } + + private JToken GetPropertyJToken(JToken fsJToken, string propAlias) + { + //make recursive + if (fsJToken.SelectToken("properties") != null) + return GetPropertyAliasJToken(propAlias, fsJToken["properties"]); + + var nestedPropJToken = fsJToken + .SingleOrDefault(p => p.SelectToken("alias").ToString().Equals(propAlias)); + + return nestedPropJToken != null ? GetPropertyAliasJToken(propAlias, nestedPropJToken["properties"]) : null; + } + private JToken GetFieldsetJTokenByTypeAlias(Type objType, JToken jToken) { var objAlias = GetFieldsetName(objType); @@ -187,7 +178,7 @@ namespace Archetype.Umbraco.Serialization private void PopulateProperty(object obj, JToken jToken, PropertyInfo propertyInfo) { var propAlias = GetJsonPropertyName(propertyInfo); - var propJToken = GetPropertyJToken(propAlias, jToken); + var propJToken = GetPropertyAliasJToken(propAlias, jToken); if (propJToken == null) return; @@ -196,7 +187,7 @@ namespace Archetype.Umbraco.Serialization propertyInfo.SetValue(obj, propValue); } - private JToken GetPropertyJToken(string propAlias, JToken jToken) + private JToken GetPropertyAliasJToken(string propAlias, JToken jToken) { return jToken.SingleOrDefault(p => p.SelectToken("alias").ToString().Equals(propAlias)); } @@ -260,7 +251,10 @@ namespace Archetype.Umbraco.Serialization private bool TryParseJTokenAsEnumerable(JToken jToken, out JToken resultToken) { resultToken = null; - var jTokenEnumerable = jToken != null && jToken["fieldsets"] != null && jToken["fieldsets"].Any(); + + //To Do: Strange newtonsoft behaviour + var fsToken = jToken.Parent == null ? jToken["fieldsets"] : jToken.Parent.Children().First(); + var jTokenEnumerable = jToken != null && fsToken != null && fsToken.Any(); if (jTokenEnumerable) resultToken = jToken; @@ -506,11 +500,11 @@ namespace Archetype.Umbraco.Serialization 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); + return getValue.Invoke(property, null); } private object GetDefault(Type type)