public Property CreateProperty(IRepository repository) { var property = _factory.CreateProperty( _jValue.GetDomPath(_factory), _jValue.Value != null && (!(_jValue.Value is string) || (string)_jValue.Value != "")); if (_jValue.Type == JTokenType.Null) { property.InitializeDefaultPropertyDefinitionSet(_ => {}); } else { property.InitializeDefaultPropertyDefinitionSet( propertyDefinitions => propertyDefinitions.Append( _factory.GetAllBclClasses() .Select(bclClass => _factory.CreatePropertyDefinition(bclClass, _name, bclClass.IsLegalObjectValue(_jValue.Value), true, AttributeProxy.DataMember(_name))))); } return(property); }
public Property CreateProperty(IRepository repository) { var property = _factory.CreateProperty(_jObject.GetDomPath(_factory), _jObject.Properties().Any()); property.InitializeDefaultPropertyDefinitionSet( propertyDefinitions => { var userDefinedClassPropertyDefinition = _factory.CreatePropertyDefinition(repository.GetOrAdd(_jObject.GetDomPath(_factory)), _name, true, true, AttributeProxy.DataMember(_name)); propertyDefinitions.Append(userDefinedClassPropertyDefinition); }); return(property); }
public Property CreateProperty(IRepository repository) { var property = _factory.CreateProperty(_jArray.GetDomPath(_factory), _jArray.Count > 0); var bestFitType = GetBestFitType(); // If JTokenType.None, then there weren't any elements. // If JTokenType.Null, then no JTokenType is able to contain the values of all the other elements. // Else, we have a JTokenType that can contain all the values of the other elements. // The 'else' condition is the happy path. We'll want to create a property custom tailored for // bestFitType. When (or if) it gets merged, the merge mechanism will ensure that we end up with // the best type for the property. This should be relatively easy to implement. // As for the sad paths, which won't be as easy to implement... // There's a strong possibility that we'll need to be able to determine whether a property should // even be added to its parent class. If there were no elements in the json array, should we // do anything with that array? I don't think so. And what about if no single type exists that // could hold all the elements? Should we do anything with *that* array? Or throw an exception? // Questions to ponder... switch (bestFitType) { case JTokenType.Null: case JTokenType.None: { throw new NotImplementedException(); } case JTokenType.Object: { property.InitializeDefaultPropertyDefinitionSet( propertyDefinitions => propertyDefinitions.Append( _factory.CreatePropertyDefinition( ListClass.FromClass(repository.GetOrAdd(_jArray.GetDomPath(_factory))), _name, true, true, AttributeProxy.DataMember(_name)))); break; } case JTokenType.Array: { throw new NotImplementedException(); } case JTokenType.Integer: case JTokenType.Float: case JTokenType.String: case JTokenType.Boolean: case JTokenType.Date: case JTokenType.Guid: case JTokenType.Uri: case JTokenType.TimeSpan: { property.InitializeDefaultPropertyDefinitionSet(propertyDefinitions => {}); foreach (var item in _jArray.OfType <JValue>()) { var mergeProperty = _factory.CreateProperty(_jArray.GetDomPath(_factory), _jArray.Count > 0); mergeProperty.InitializeDefaultPropertyDefinitionSet( propertyDefinitions => propertyDefinitions.Append( _factory.GetAllBclClasses() .Select( bclClass => _factory.CreatePropertyDefinition( ListClass.FromClass(bclClass), _name, bclClass.IsLegalObjectValue(item.Value), true, AttributeProxy.DataMember(_name))))); property.MergeWith(mergeProperty); } break; } default: { throw new InvalidOperationException("Unsupported item in json array: " + bestFitType); } } return(property); }