internal static void ApplyProperty(ODataProperty property, IEdmStructuredTypeReference resourceType, object resource, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { IEdmProperty edmProperty = resourceType.FindProperty(property.Name); bool isDynamicProperty = false; string propertyName = property.Name; if (edmProperty != null) { propertyName = EdmLibHelpers.GetClrPropertyName(edmProperty, readContext.Model); } else { IEdmStructuredType structuredType = resourceType.StructuredDefinition(); isDynamicProperty = structuredType != null && structuredType.IsOpen; } // dynamic properties have null values IEdmTypeReference propertyType = edmProperty != null ? edmProperty.Type : null; EdmTypeKind propertyKind; object value = ConvertValue(property.Value, ref propertyType, deserializerProvider, readContext, out propertyKind); if (isDynamicProperty) { SetDynamicProperty(resource, resourceType, propertyKind, propertyName, value, propertyType, readContext); } else { SetDeclaredProperty(resource, propertyKind, propertyName, value, edmProperty, readContext); } }
/// <summary> /// Initializes a new instance of the <see cref="ODataEdmTypeDeserializer"/> class. /// </summary> /// <param name="payloadKind">The kind of OData payload this deserializer handles.</param> /// <param name="deserializerProvider">The <see cref="ODataDeserializerProvider"/>.</param> protected ODataEdmTypeDeserializer(ODataPayloadKind payloadKind, ODataDeserializerProvider deserializerProvider) : this(payloadKind) { if (deserializerProvider == null) { throw Error.ArgumentNull("deserializerProvider"); } DeserializerProvider = deserializerProvider; }
internal static void ApplyInstanceAnnotations(object resource, IEdmStructuredTypeReference structuredType, ODataResource oDataResource, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { PropertyInfo propertyInfo = EdmLibHelpers.GetInstanceAnnotationsContainer(structuredType.StructuredDefinition(), readContext.Model); if (propertyInfo == null) { return; } IODataInstanceAnnotationContainer instanceAnnotationContainer = GetAnnotationContainer(propertyInfo, resource); SetInstanceAnnotations(oDataResource, instanceAnnotationContainer, deserializerProvider, readContext); }
internal static void ApplyProperty(ODataProperty property, IEdmStructuredTypeReference resourceType, object resource, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { IEdmProperty edmProperty = resourceType.FindProperty(property.Name); bool isDynamicProperty = false; string propertyName = property.Name; if (edmProperty != null) { propertyName = EdmLibHelpers.GetClrPropertyName(edmProperty, readContext.Model); } else { IEdmStructuredType structuredType = resourceType.StructuredDefinition(); isDynamicProperty = structuredType != null && structuredType.IsOpen; } if (!isDynamicProperty && edmProperty == null) { throw new ODataException( Error.Format(SRResources.CannotDeserializeUnknownProperty, property.Name, resourceType.Definition)); } // dynamic properties have null values IEdmTypeReference propertyType = edmProperty != null ? edmProperty.Type : null; EdmTypeKind propertyKind; object value = ConvertValue(property.Value, ref propertyType, deserializerProvider, readContext, out propertyKind); if (isDynamicProperty) { SetDynamicProperty(resource, resourceType, propertyKind, propertyName, value, propertyType, readContext.Model); } else { SetDeclaredProperty(resource, propertyKind, propertyName, value, edmProperty, readContext); } }
internal static void SetInstanceAnnotations(ODataResource oDataResource, IODataInstanceAnnotationContainer instanceAnnotationContainer, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { if (oDataResource.InstanceAnnotations != null) { foreach (ODataInstanceAnnotation annotation in oDataResource.InstanceAnnotations) { AddInstanceAnnotationToContainer(instanceAnnotationContainer, deserializerProvider, readContext, annotation, string.Empty); } } foreach (ODataProperty property in oDataResource.Properties) { if (property.InstanceAnnotations != null) { foreach (ODataInstanceAnnotation annotation in property.InstanceAnnotations) { AddInstanceAnnotationToContainer(instanceAnnotationContainer, deserializerProvider, readContext, annotation, property.Name); } } } }
private static object ConvertCollectionValue(ODataCollectionValue collection, ref IEdmTypeReference propertyType, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { IEdmCollectionTypeReference collectionType; if (propertyType == null) { // dynamic collection property Contract.Assert(!String.IsNullOrEmpty(collection.TypeName), "ODataLib should have verified that dynamic collection value has a type name " + "since we provided metadata."); string elementTypeName = GetCollectionElementTypeName(collection.TypeName, isNested: false); IEdmModel model = readContext.Model; IEdmSchemaType elementType = model.FindType(elementTypeName); Contract.Assert(elementType != null); collectionType = new EdmCollectionTypeReference( new EdmCollectionType(elementType.ToEdmTypeReference(isNullable: false))); propertyType = collectionType; } else { collectionType = propertyType as IEdmCollectionTypeReference; Contract.Assert(collectionType != null, "The type for collection must be a IEdmCollectionType."); } ODataEdmTypeDeserializer deserializer = deserializerProvider.GetEdmTypeDeserializer(collectionType); return(deserializer.ReadInline(collection, collectionType, readContext)); }
internal static object ConvertValue(object oDataValue, ref IEdmTypeReference propertyType, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext, out EdmTypeKind typeKind) { if (oDataValue == null) { typeKind = EdmTypeKind.None; return(null); } ODataComplexValue complexValue = oDataValue as ODataComplexValue; if (complexValue != null) { typeKind = EdmTypeKind.Complex; return(ConvertComplexValue(complexValue, ref propertyType, deserializerProvider, readContext)); } ODataEnumValue enumValue = oDataValue as ODataEnumValue; if (enumValue != null) { typeKind = EdmTypeKind.Enum; return(ConvertEnumValue(enumValue, ref propertyType, deserializerProvider, readContext)); } ODataCollectionValue collection = oDataValue as ODataCollectionValue; if (collection != null) { typeKind = EdmTypeKind.Collection; return(ConvertCollectionValue(collection, ref propertyType, deserializerProvider, readContext)); } typeKind = EdmTypeKind.Primitive; return(oDataValue); }
private static void ProcessResourceSet(object feed, IEdmCollectionTypeReference resourceSetType, ODataDeserializerContext readContext, ODataDeserializerProvider deserializerProvider, Dictionary <string, object> payload, string parameterName) { ODataResourceSetDeserializer resourceSetDeserializer = (ODataResourceSetDeserializer)deserializerProvider.GetEdmTypeDeserializer(resourceSetType); object result = resourceSetDeserializer.ReadInline(feed, resourceSetType, readContext); IEdmTypeReference elementTypeReference = resourceSetType.ElementType(); Contract.Assert(elementTypeReference.IsStructured()); IEnumerable enumerable = result as IEnumerable; if (enumerable != null) { if (readContext.IsUntyped) { payload[parameterName] = enumerable.ConvertToEdmObject(resourceSetType); } else { Type elementClrType = EdmLibHelpers.GetClrType(elementTypeReference, readContext.Model); IEnumerable castedResult = _castMethodInfo.MakeGenericMethod(elementClrType) .Invoke(null, new[] { result }) as IEnumerable; payload[parameterName] = castedResult; } } }
private static async Task ReadResourceSetAsync(IEdmAction action, ODataParameterReader reader, ODataDeserializerContext readContext, ODataDeserializerProvider deserializerProvider, Dictionary <string, object> payload) { string parameterName; IEdmCollectionTypeReference resourceSetType = GetCollectionParameterType(action, reader, out parameterName); object feed = await reader.CreateResourceSetReader().ReadResourceOrResourceSetAsync(); ProcessResourceSet(feed, resourceSetType, readContext, deserializerProvider, payload, parameterName); }
private static object ConvertCollectionValue(ODataCollectionValue collection, ref IEdmTypeReference propertyType, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { IEdmCollectionTypeReference collectionType; if (propertyType == null) { // dynamic collection property Contract.Assert(!String.IsNullOrEmpty(collection.TypeName), "ODataLib should have verified that dynamic collection value has a type name " + "since we provided metadata."); string elementTypeName = GetCollectionElementTypeName(collection.TypeName, isNested: false); IEdmModel model = readContext.Model; IEdmSchemaType elementType = model.FindType(elementTypeName); Contract.Assert(elementType != null); collectionType = new EdmCollectionTypeReference( new EdmCollectionType(elementType.ToEdmTypeReference(isNullable: false))); propertyType = collectionType; } else { collectionType = propertyType as IEdmCollectionTypeReference; Contract.Assert(collectionType != null, "The type for collection must be a IEdmCollectionType."); } ODataEdmTypeDeserializer deserializer = deserializerProvider.GetEdmTypeDeserializer(collectionType); return deserializer.ReadInline(collection, collectionType, readContext); }
internal static object ConvertAnnotationValue(object oDataValue, ref IEdmTypeReference propertyType, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { if (oDataValue == null) { return(null); } ODataEnumValue enumValue = oDataValue as ODataEnumValue; if (enumValue != null) { return(ConvertEnumValue(enumValue, ref propertyType, deserializerProvider, readContext)); } ODataCollectionValue collection = oDataValue as ODataCollectionValue; if (collection != null) { return(ConvertCollectionValue(collection, ref propertyType, deserializerProvider, readContext)); } ODataUntypedValue untypedValue = oDataValue as ODataUntypedValue; if (untypedValue != null) { Contract.Assert(!String.IsNullOrEmpty(untypedValue.RawValue)); if (untypedValue.RawValue.StartsWith("[", StringComparison.Ordinal) || untypedValue.RawValue.StartsWith("{", StringComparison.Ordinal)) { throw new ODataException(Error.Format(SRResources.InvalidODataUntypedValue, untypedValue.RawValue)); } oDataValue = ConvertPrimitiveValue(untypedValue.RawValue); } ODataResourceValue annotationVal = oDataValue as ODataResourceValue; if (annotationVal != null) { var annotationType = readContext.Model.FindDeclaredType(annotationVal.TypeName).ToEdmTypeReference(true) as IEdmStructuredTypeReference; ODataResourceDeserializer deserializer = new ODataResourceDeserializer(deserializerProvider); object resource = deserializer.CreateResourceInstance(annotationType, readContext); if (resource != null) { foreach (var prop in annotationVal.Properties) { deserializer.ApplyStructuralProperty(resource, prop, annotationType, readContext); } } return(resource); } ODataPrimitiveValue primitiveValue = oDataValue as ODataPrimitiveValue; if (primitiveValue != null) { return(EdmPrimitiveHelpers.ConvertPrimitiveValue(primitiveValue.Value, primitiveValue.Value.GetType())); } return(oDataValue); }
internal static object ConvertValue(object oDataValue, ref IEdmTypeReference propertyType, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext, out EdmTypeKind typeKind) { if (oDataValue == null) { typeKind = EdmTypeKind.None; return(null); } ODataEnumValue enumValue = oDataValue as ODataEnumValue; if (enumValue != null) { typeKind = EdmTypeKind.Enum; return(ConvertEnumValue(enumValue, ref propertyType, deserializerProvider, readContext)); } ODataCollectionValue collection = oDataValue as ODataCollectionValue; if (collection != null) { typeKind = EdmTypeKind.Collection; return(ConvertCollectionValue(collection, ref propertyType, deserializerProvider, readContext)); } ODataUntypedValue untypedValue = oDataValue as ODataUntypedValue; if (untypedValue != null) { Contract.Assert(!String.IsNullOrEmpty(untypedValue.RawValue)); if (untypedValue.RawValue.StartsWith("[", StringComparison.Ordinal) || untypedValue.RawValue.StartsWith("{", StringComparison.Ordinal)) { throw new ODataException(Error.Format(SRResources.InvalidODataUntypedValue, untypedValue.RawValue)); } oDataValue = ConvertPrimitiveValue(untypedValue.RawValue); } typeKind = EdmTypeKind.Primitive; return(oDataValue); }
private static void AddInstanceAnnotationToContainer(IODataInstanceAnnotationContainer instanceAnnotationContainer, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext, ODataInstanceAnnotation annotation, string propertyName) { IEdmTypeReference propertyType = null; object annotationValue = ConvertAnnotationValue(annotation.Value, ref propertyType, deserializerProvider, readContext); if (string.IsNullOrEmpty(propertyName)) { instanceAnnotationContainer.AddResourceAnnotation(annotation.Name, annotationValue); } else { instanceAnnotationContainer.AddPropertyAnnotation(propertyName, annotation.Name, annotationValue); } }
/// <summary> /// Initializes a new instance of the <see cref="ODataResourceDeserializer"/> class. /// </summary> /// <param name="deserializerProvider">The deserializer provider to use to read inner objects.</param> public ODataResourceDeserializer(ODataDeserializerProvider deserializerProvider) : base(ODataPayloadKind.Resource, deserializerProvider) { }
private static void ReadValue(IEdmAction action, ODataParameterReader reader, ODataDeserializerContext readContext, ODataDeserializerProvider deserializerProvider, Dictionary <string, object> payload) { string parameterName; IEdmOperationParameter parameter = GetParameter(action, reader, out parameterName); if (parameter.Type.IsPrimitive()) { payload[parameterName] = reader.Value; } else { ODataEdmTypeDeserializer deserializer = deserializerProvider.GetEdmTypeDeserializer(parameter.Type); payload[parameterName] = deserializer.ReadInline(reader.Value, parameter.Type, readContext); } }
/// <summary> /// Initializes a new instance of the <see cref="ODataCollectionDeserializer"/> class. /// </summary> /// <param name="deserializerProvider">The deserializer provider to use to read inner objects.</param> public ODataCollectionDeserializer(ODataDeserializerProvider deserializerProvider) : base(ODataPayloadKind.Collection, deserializerProvider) { }
private static async Task ReadCollectionAsync(IEdmAction action, ODataParameterReader reader, ODataDeserializerContext readContext, ODataDeserializerProvider deserializerProvider, Dictionary <string, object> payload) { string parameterName; IEdmCollectionTypeReference collectionType = GetCollectionParameterType(action, reader, out parameterName); ODataCollectionValue value = await ODataCollectionDeserializer.ReadCollectionAsync(reader.CreateCollectionReader()); ODataCollectionDeserializer collectionDeserializer = (ODataCollectionDeserializer)deserializerProvider.GetEdmTypeDeserializer(collectionType); payload[parameterName] = collectionDeserializer.ReadInline(value, collectionType, readContext); }
internal static object ConvertValue(object oDataValue, ref IEdmTypeReference propertyType, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext, out EdmTypeKind typeKind) { if (oDataValue == null) { typeKind = EdmTypeKind.None; return null; } ODataComplexValue complexValue = oDataValue as ODataComplexValue; if (complexValue != null) { typeKind = EdmTypeKind.Complex; return ConvertComplexValue(complexValue, ref propertyType, deserializerProvider, readContext); } ODataEnumValue enumValue = oDataValue as ODataEnumValue; if (enumValue != null) { typeKind = EdmTypeKind.Enum; return ConvertEnumValue(enumValue, ref propertyType, deserializerProvider, readContext); } ODataCollectionValue collection = oDataValue as ODataCollectionValue; if (collection != null) { typeKind = EdmTypeKind.Collection; return ConvertCollectionValue(collection, ref propertyType, deserializerProvider, readContext); } typeKind = EdmTypeKind.Primitive; return oDataValue; }
private static async Task ReadResourceAsync(IEdmAction action, ODataParameterReader reader, ODataDeserializerContext readContext, ODataDeserializerProvider deserializerProvider, Dictionary <string, object> payload) { string parameterName; IEdmOperationParameter parameter = GetParameter(action, reader, out parameterName); Contract.Assert(parameter.Type.IsStructured()); object item = await reader.CreateResourceReader().ReadResourceOrResourceSetAsync(); ODataResourceDeserializer resourceDeserializer = (ODataResourceDeserializer)deserializerProvider.GetEdmTypeDeserializer(parameter.Type); payload[parameterName] = resourceDeserializer.ReadInline(item, parameter.Type, readContext); }
private static object ConvertEnumValue(ODataEnumValue enumValue, ref IEdmTypeReference propertyType, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { IEdmEnumTypeReference edmEnumType; if (propertyType == null) { // dynamic enum property Contract.Assert(!String.IsNullOrEmpty(enumValue.TypeName), "ODataLib should have verified that dynamic enum value has a type name since we provided metadata."); IEdmModel model = readContext.Model; IEdmType edmType = model.FindType(enumValue.TypeName); Contract.Assert(edmType.TypeKind == EdmTypeKind.Enum, "ODataLib should have verified that enum value has a enum resource type."); edmEnumType = new EdmEnumTypeReference(edmType as IEdmEnumType, isNullable: true); propertyType = edmEnumType; } else { edmEnumType = propertyType.AsEnum(); } ODataEdmTypeDeserializer deserializer = deserializerProvider.GetEdmTypeDeserializer(edmEnumType); return deserializer.ReadInline(enumValue, propertyType, readContext); }
internal static void ApplyProperty(ODataProperty property, IEdmStructuredTypeReference resourceType, object resource, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext) { IEdmProperty edmProperty; // Extract edmProperty using a Case-Sensitive match edmProperty = resourceType.FindProperty(property.Name); if (readContext != null && !readContext.DisableCaseInsensitiveRequestPropertyBinding && edmProperty == null) { // if edmProperty is null, we try a Case-Insensitive match. bool propertyMatched = false; IEnumerable <IEdmStructuralProperty> structuralProperties = resourceType.StructuralProperties(); foreach (IEdmStructuralProperty structuralProperty in structuralProperties) { if (structuralProperty.Name.Equals(property.Name, StringComparison.OrdinalIgnoreCase)) { // We throw an exception when we have more than 1 case-insensitive matches and no case sensitive matches. if (propertyMatched) { throw new ODataException(Error.Format(SRResources.CannotDeserializeUnknownProperty, property.Name, resourceType.Definition)); } propertyMatched = true; edmProperty = resourceType.FindProperty(structuralProperty.Name); } } } bool isDynamicProperty = false; string propertyName = property.Name; if (edmProperty != null) { propertyName = EdmLibHelpers.GetClrPropertyName(edmProperty, readContext.Model); } else { IEdmStructuredType structuredType = resourceType.StructuredDefinition(); isDynamicProperty = structuredType != null && structuredType.IsOpen; } if (!isDynamicProperty && edmProperty == null) { throw new ODataException( Error.Format(SRResources.CannotDeserializeUnknownProperty, property.Name, resourceType.Definition)); } // dynamic properties have null values IEdmTypeReference propertyType = edmProperty != null ? edmProperty.Type : null; EdmTypeKind propertyKind; object value = ConvertValue(property.Value, ref propertyType, deserializerProvider, readContext, out propertyKind); if (isDynamicProperty) { SetDynamicProperty(resource, resourceType, propertyKind, propertyName, value, propertyType, readContext.Model); } else { SetDeclaredProperty(resource, propertyKind, propertyName, value, edmProperty, readContext); } }