public void UpdateUsingAtomShouldBeFailed() { var entryWrapper = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = NameSpacePrefix + "Person" }, NestedResourceInfoWrappers = new List <ODataNestedResourceInfoWrapper>() { new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "HomeAddress", IsCollection = false }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = NameSpacePrefix + "HomeAddress", Properties = new[] { new ODataProperty { Name = "City", Value = "Chengdu" }, new ODataProperty { Name = "FamilyName", Value = "Tigers" } } } } } } }; var settings = new ODataMessageWriterSettings(); settings.BaseUri = ServiceBaseUri; var personType = Model.FindDeclaredType(NameSpacePrefix + "Person") as IEdmEntityType; var personSet = Model.EntityContainer.FindEntitySet("People"); var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "People(1)")); requestMessage.SetHeader("Content-Type", MimeTypes.ApplicationAtomXml); requestMessage.SetHeader("Accept", MimeTypes.ApplicationAtomXml); requestMessage.Method = "PATCH"; using (var messageWriter = new ODataMessageWriter(requestMessage, settings, Model)) { try { var odataWriter = messageWriter.CreateODataResourceWriter(personSet, personType); ODataWriterHelper.WriteResource(odataWriter, entryWrapper); } catch (Microsoft.OData.ODataContentTypeException) { return; } Assert.IsTrue(false); } }
public void PostUsingAtomShouldBeFailed() { var entryWrapper = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = NameSpacePrefix + "Person", Properties = new[] { new ODataProperty { Name = "PersonID", Value = 101 }, new ODataProperty { Name = "FirstName", Value = "Peter" }, new ODataProperty { Name = "LastName", Value = "Zhang" }, new ODataProperty { Name = "Home", Value = GeographyPoint.Create(32.1, 23.1) }, new ODataProperty { Name = "Numbers", Value = new ODataCollectionValue { TypeName = "Collection(Edm.String)", Items = new string[] { "12345" } } }, new ODataProperty { Name = "Emails", Value = new ODataCollectionValue { TypeName = "Collection(Edm.String)", Items = new string[] { "*****@*****.**" } } } } }, NestedResourceInfoWrappers = new List <ODataNestedResourceInfoWrapper>() { new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "HomeAddress", IsCollection = false }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = NameSpacePrefix + "HomeAddress", Properties = new[] { new ODataProperty { Name = "Street", Value = "ZiXing Road" }, new ODataProperty { Name = "City", Value = "Chengdu" }, new ODataProperty { Name = "PostalCode", Value = "200241" }, new ODataProperty { Name = "FamilyName", Value = "Tigers" } } } } } } }; var settings = new ODataMessageWriterSettings(); settings.BaseUri = ServiceBaseUri; var personType = Model.FindDeclaredType(NameSpacePrefix + "Person") as IEdmEntityType; var peopleSet = Model.EntityContainer.FindEntitySet("People"); var requestMessage = new HttpWebRequestMessage(new Uri(ServiceBaseUri + "People")); requestMessage.SetHeader("Content-Type", MimeTypes.ApplicationAtomXml); requestMessage.SetHeader("Accept", MimeTypes.ApplicationAtomXml); requestMessage.Method = "POST"; using (var messageWriter = new ODataMessageWriter(requestMessage, settings, Model)) { try { var odataWriter = messageWriter.CreateODataResourceWriter(peopleSet, personType); ODataWriterHelper.WriteResource(odataWriter, entryWrapper); } catch (Microsoft.OData.ODataContentTypeException) { return; } Assert.IsTrue(false); } }
/// <summary> /// Writes the body operation parameters associated with a ServiceAction. For each BodyOperationParameter: /// 1. calls ODataPropertyConverter to convert CLR object into ODataValue/primitive values. /// 2. then calls ODataParameterWriter to write the ODataValue/primitive values. /// </summary> /// <param name="operationParameters">The list of operation parameters to write.</param> /// <param name="requestMessage">The OData request message used to write the operation parameters.</param> internal void WriteBodyOperationParameters(List <BodyOperationParameter> operationParameters, ODataRequestMessageWrapper requestMessage) { Debug.Assert(requestMessage != null, "requestMessage != null"); Debug.Assert(operationParameters != null, "operationParameters != null"); Debug.Assert(operationParameters.Any(), "operationParameters.Any()"); using (ODataMessageWriter messageWriter = Serializer.CreateMessageWriter(requestMessage, this.requestInfo, true /*isParameterPayload*/)) { ODataParameterWriter parameterWriter = messageWriter.CreateODataParameterWriter(null); parameterWriter.WriteStart(); foreach (BodyOperationParameter operationParameter in operationParameters) { if (operationParameter.Value == null) { parameterWriter.WriteValue(operationParameter.Name, operationParameter.Value); } else { ClientEdmModel model = this.requestInfo.Model; IEdmType edmType = model.GetOrCreateEdmType(operationParameter.Value.GetType()); Debug.Assert(edmType != null, "edmType != null"); switch (edmType.TypeKind) { case EdmTypeKind.Collection: { this.WriteCollectionValueInBodyOperationParameter(parameterWriter, operationParameter, (IEdmCollectionType)edmType); break; } case EdmTypeKind.Complex: case EdmTypeKind.Entity: { Debug.Assert(model.GetClientTypeAnnotation(edmType).ElementType != null, "model.GetClientTypeAnnotation(edmType).ElementType != null"); ODataResourceWrapper entry = this.CreateODataResourceFromEntityOperationParameter(model.GetClientTypeAnnotation(edmType), operationParameter.Value); Debug.Assert(entry != null, "entry != null"); var entryWriter = parameterWriter.CreateResourceWriter(operationParameter.Name); ODataWriterHelper.WriteResource(entryWriter, entry); break; } case EdmTypeKind.Primitive: object primitiveValue = ODataPropertyConverter.ConvertPrimitiveValueToRecognizedODataType(operationParameter.Value, operationParameter.Value.GetType()); parameterWriter.WriteValue(operationParameter.Name, primitiveValue); break; case EdmTypeKind.Enum: ODataEnumValue tmp = this.propertyConverter.CreateODataEnumValue( model.GetClientTypeAnnotation(edmType).ElementType, operationParameter.Value, false); parameterWriter.WriteValue(operationParameter.Name, tmp); break; default: // EdmTypeKind.Row // EdmTypeKind.EntityReference throw new NotSupportedException(Strings.Serializer_InvalidParameterType(operationParameter.Name, edmType.TypeKind)); } } // else } // foreach parameterWriter.WriteEnd(); parameterWriter.Flush(); } }
/// <summary> /// Writes collection value in body operation parameter. /// </summary> /// <param name="parameterWriter">The odata parameter writer.</param> /// <param name="operationParameter">The operation parameter.</param> /// <param name="edmCollectionType">The edm collection type.</param> private void WriteCollectionValueInBodyOperationParameter(ODataParameterWriter parameterWriter, BodyOperationParameter operationParameter, IEdmCollectionType edmCollectionType) { ClientEdmModel model = this.requestInfo.Model; var elementTypeKind = edmCollectionType.ElementType.TypeKind(); if (elementTypeKind == EdmTypeKind.Entity || elementTypeKind == EdmTypeKind.Complex) { ODataWriter feedWriter = parameterWriter.CreateResourceSetWriter(operationParameter.Name); feedWriter.WriteStart(new ODataResourceSet()); IEnumerator enumerator = ((ICollection)operationParameter.Value).GetEnumerator(); while (enumerator.MoveNext()) { Object collectionItem = enumerator.Current; if (collectionItem == null) { if (elementTypeKind == EdmTypeKind.Complex) { feedWriter.WriteStart((ODataResource)null); feedWriter.WriteEnd(); continue; } else { throw new NotSupportedException(Strings.Serializer_NullCollectionParameterItemValue(operationParameter.Name)); } } IEdmType edmItemType = model.GetOrCreateEdmType(collectionItem.GetType()); Debug.Assert(edmItemType != null, "edmItemType != null"); if (edmItemType.TypeKind != EdmTypeKind.Entity && edmItemType.TypeKind != EdmTypeKind.Complex) { throw new NotSupportedException(Strings.Serializer_InvalidCollectionParameterItemType(operationParameter.Name, edmItemType.TypeKind)); } Debug.Assert(model.GetClientTypeAnnotation(edmItemType).ElementType != null, "edmItemType.GetClientTypeAnnotation().ElementType != null"); ODataResourceWrapper entry = this.CreateODataResourceFromEntityOperationParameter(model.GetClientTypeAnnotation(edmItemType), collectionItem); Debug.Assert(entry != null, "entry != null"); ODataWriterHelper.WriteResource(feedWriter, entry); } feedWriter.WriteEnd(); feedWriter.Flush(); } else { ODataCollectionWriter collectionWriter = parameterWriter.CreateCollectionWriter(operationParameter.Name); ODataCollectionStart odataCollectionStart = new ODataCollectionStart(); collectionWriter.WriteStart(odataCollectionStart); IEnumerator enumerator = ((ICollection)operationParameter.Value).GetEnumerator(); while (enumerator.MoveNext()) { Object collectionItem = enumerator.Current; if (collectionItem == null) { collectionWriter.WriteItem(null); continue; } IEdmType edmItemType = model.GetOrCreateEdmType(collectionItem.GetType()); Debug.Assert(edmItemType != null, "edmItemType != null"); switch (edmItemType.TypeKind) { case EdmTypeKind.Primitive: { object primitiveItemValue = ODataPropertyConverter.ConvertPrimitiveValueToRecognizedODataType(collectionItem, collectionItem.GetType()); collectionWriter.WriteItem(primitiveItemValue); break; } case EdmTypeKind.Enum: { ODataEnumValue enumTmp = this.propertyConverter.CreateODataEnumValue(model.GetClientTypeAnnotation(edmItemType).ElementType, collectionItem, false); collectionWriter.WriteItem(enumTmp); break; } default: // EdmTypeKind.Entity // EdmTypeKind.Row // EdmTypeKind.EntityReference throw new NotSupportedException(Strings.Serializer_InvalidCollectionParameterItemType(operationParameter.Name, edmItemType.TypeKind)); } } collectionWriter.WriteEnd(); collectionWriter.Flush(); } }
private ODataResourceWrapper CreateVehicleGPS(bool postDeleteTypeInReferencingModel) { ODataResource newVehicleGPS = new ODataResource { TypeName = TestModelNameSpace + (postDeleteTypeInReferencingModel ? ".TruckDemo.DerivedVehicleGPSType" : ".GPS.VehicleGPSType") }; var properties = new List <ODataProperty> { new ODataProperty { Name = "Key", Value = "000" }, new ODataProperty { Name = "VehicleSpeed", Value = 999.9 }, }; if (postDeleteTypeInReferencingModel) { properties.Add(new ODataProperty { Name = "DisplayName", Value = "NewDisplayName" }); } newVehicleGPS.Properties = properties; var newVehicleGPSWrapper = new ODataResourceWrapper() { Resource = newVehicleGPS, NestedResourceInfoWrappers = new List <ODataNestedResourceInfoWrapper>() { new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "StartLocation", IsCollection = false }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = TestModelNameSpace + ".Location.GeoLocation", Properties = new[] { new ODataProperty { Name = "Lat", Value = 99.9 }, new ODataProperty { Name = "Long", Value = 88.8 } } } } }, new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "EndLocation", IsCollection = false }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = TestModelNameSpace + ".Location.GeoLocation", Properties = new[] { new ODataProperty { Name = "Lat", Value = 77.7 }, new ODataProperty { Name = "Long", Value = 88.8 } } } } }, new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "CurrentLocation", IsCollection = false }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = TestModelNameSpace + ".Location.GeoLocation", Properties = new[] { new ODataProperty { Name = "Lat", Value = 88.8 }, new ODataProperty { Name = "Long", Value = 88.8 } } } } }, new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "Map", IsCollection = false }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = TestModelNameSpace + ".Map.MapType", Properties = new[] { new ODataProperty { Name = "ProviderName", Value = "ProviderNew" }, new ODataProperty { Name = "Uri", Value = "NewUri" }, new ODataProperty { Name = "MBytesDownloaded", Value = 12.3 } } } } }, new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "LostSignalAlarm", IsCollection = false }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = TestModelNameSpace + ".GPS.GPSLostSignalAlarmType", Properties = new[] { new ODataProperty { Name = "Severity", Value = 1 } } }, NestedResourceInfoWrappers = new List <ODataNestedResourceInfoWrapper>() { new ODataNestedResourceInfoWrapper() { NestedResourceInfo = new ODataNestedResourceInfo() { Name = "LastKnownLocation", IsCollection = false, }, NestedResourceOrResourceSet = new ODataResourceWrapper() { Resource = new ODataResource() { TypeName = TestModelNameSpace + ".Location.GeoLocation", Properties = new[] { new ODataProperty { Name = "Lat", Value = 88.8 }, new ODataProperty { Name = "Long", Value = 88.8 } } } } } } } } } }; return(newVehicleGPSWrapper); }