/// <summary> /// Builds the ODataPayloadContext context from OODataUri. /// </summary> /// <param name="uri">The URI.</param> /// <returns>A OData Payload Context</returns> public static ODataPayloadContext BuildODataPayloadContextFromODataUri(ODataUri uri) { var payloadContext = new ODataPayloadContext(); payloadContext.PayloadUri = uri; payloadContext.ExpectedPayloadKind = uri.GetExpectedPayloadType(); switch (payloadContext.ExpectedPayloadKind) { case ODataPayloadElementType.EntitySetInstance: case ODataPayloadElementType.EntityInstance: SetExpectedEntitySetAndTypeFromUri(payloadContext, uri); break; case ODataPayloadElementType.PrimitiveProperty: case ODataPayloadElementType.PrimitiveMultiValueProperty: case ODataPayloadElementType.ComplexProperty: case ODataPayloadElementType.ComplexMultiValueProperty: case ODataPayloadElementType.EmptyCollectionProperty: var propertySegment = uri.Segments.OfType <PropertySegment>().LastOrDefault(); if (propertySegment != null) { payloadContext.ExpectedMemberProperty = propertySegment.Property; SetExpectedEntitySetAndTypeFromUri(payloadContext, uri); var parentPropertySegment = uri.Segments.GetSecondToLastOrDefault <PropertySegment>(); if (parentPropertySegment != null) { var collectionDataType = parentPropertySegment.Property.PropertyType as CollectionDataType; if (collectionDataType != null) { var elementComplexDataType = collectionDataType.ElementDataType as ComplexDataType; ExceptionUtilities.CheckObjectNotNull(elementComplexDataType, "Expected non complex DataType"); payloadContext.ExpectedPropertyDeclaringParentType = elementComplexDataType.Definition; } else { var complexDataType = parentPropertySegment.Property.PropertyType as ComplexDataType; ExceptionUtilities.CheckObjectNotNull(complexDataType, "Expected non null complex DataType"); payloadContext.ExpectedPropertyDeclaringParentType = complexDataType.Definition; } } else { payloadContext.ExpectedPropertyDeclaringParentType = payloadContext.ExpectedEntityType; } } else { ExceptionUtilities.Assert( uri.IsFunction() || uri.IsServiceOperation() || uri.IsAction(), "Property uri contains no property segments and is not a function/service operation/action."); var functionSegment = uri.Segments.Last() as FunctionSegment ?? uri.Segments[uri.Segments.Count - 2] as FunctionSegment; ExceptionUtilities.CheckObjectNotNull(functionSegment, "Failed to find function segment in finction/service operation uri"); payloadContext.ExpectedFunction = functionSegment.Function; } break; case ODataPayloadElementType.DeferredLink: case ODataPayloadElementType.LinkCollection: var navigationSegment = uri.Segments.OfType <NavigationSegment>().Last(); ExceptionUtilities.CheckObjectNotNull(navigationSegment, "No navigation segments found for expected navigation property uri"); payloadContext.ExpectedNavigationProperty = navigationSegment.NavigationProperty; SetExpectedEntitySetAndTypeFromUri(payloadContext, uri); break; } return(payloadContext); }
/// <summary> /// Builds the ODataPayloadContext context from OODataUri. /// </summary> /// <param name="uri">The URI.</param> /// <returns>A OData Payload Context</returns> public static ODataPayloadContext BuildODataPayloadContextFromODataUri(ODataUri uri) { var payloadContext = new ODataPayloadContext(); payloadContext.PayloadUri = uri; payloadContext.ExpectedPayloadKind = uri.GetExpectedPayloadType(); switch (payloadContext.ExpectedPayloadKind) { case ODataPayloadElementType.EntitySetInstance: case ODataPayloadElementType.EntityInstance: SetExpectedEntitySetAndTypeFromUri(payloadContext, uri); break; case ODataPayloadElementType.PrimitiveProperty: case ODataPayloadElementType.PrimitiveMultiValueProperty: case ODataPayloadElementType.ComplexProperty: case ODataPayloadElementType.ComplexMultiValueProperty: case ODataPayloadElementType.EmptyCollectionProperty: var propertySegment = uri.Segments.OfType<PropertySegment>().LastOrDefault(); if (propertySegment != null) { payloadContext.ExpectedMemberProperty = propertySegment.Property; SetExpectedEntitySetAndTypeFromUri(payloadContext, uri); var parentPropertySegment = uri.Segments.GetSecondToLastOrDefault<PropertySegment>(); if (parentPropertySegment != null) { var collectionDataType = parentPropertySegment.Property.PropertyType as CollectionDataType; if (collectionDataType != null) { var elementComplexDataType = collectionDataType.ElementDataType as ComplexDataType; ExceptionUtilities.CheckObjectNotNull(elementComplexDataType, "Expected non complex DataType"); payloadContext.ExpectedPropertyDeclaringParentType = elementComplexDataType.Definition; } else { var complexDataType = parentPropertySegment.Property.PropertyType as ComplexDataType; ExceptionUtilities.CheckObjectNotNull(complexDataType, "Expected non null complex DataType"); payloadContext.ExpectedPropertyDeclaringParentType = complexDataType.Definition; } } else { payloadContext.ExpectedPropertyDeclaringParentType = payloadContext.ExpectedEntityType; } } else { ExceptionUtilities.Assert( uri.IsFunction() || uri.IsServiceOperation() || uri.IsAction(), "Property uri contains no property segments and is not a function/service operation/action."); var functionSegment = uri.Segments.Last() as FunctionSegment ?? uri.Segments[uri.Segments.Count - 2] as FunctionSegment; ExceptionUtilities.CheckObjectNotNull(functionSegment, "Failed to find function segment in finction/service operation uri"); payloadContext.ExpectedFunction = functionSegment.Function; } break; case ODataPayloadElementType.DeferredLink: case ODataPayloadElementType.LinkCollection: var navigationSegment = uri.Segments.OfType<NavigationSegment>().Last(); ExceptionUtilities.CheckObjectNotNull(navigationSegment, "No navigation segments found for expected navigation property uri"); payloadContext.ExpectedNavigationProperty = navigationSegment.NavigationProperty; SetExpectedEntitySetAndTypeFromUri(payloadContext, uri); break; } return payloadContext; }