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.
This commit is contained in:
cankoluman
2014-05-12 17:15:20 +01:00
parent 9b1b3d1793
commit 475fe7c81f
2 changed files with 27 additions and 32 deletions
@@ -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)
@@ -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<Property>(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)