public virtual async Task ExecuteResultAsync(ActionContext context) { var settings = new ODataMessageWriterSettings() { BaseUri = _odataUri.ServiceRoot, EnableMessageStreamDisposal = false, ODataUri = _odataUri, Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames, Version = ODataVersion.V4 }; var requestHeaders = OeRequestHeaders.Parse(context.HttpContext.Request.Headers["Accept"], context.HttpContext.Request.Headers["Prefer"]); if (requestHeaders.MaxPageSize > 0 && PageSize == 0) { PageSize = requestHeaders.MaxPageSize; } IODataResponseMessage responseMessage = new Infrastructure.OeInMemoryMessage(context.HttpContext.Response.Body, context.HttpContext.Request.ContentType); using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, _edmModel)) { ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet); IEdmEntityType entityType = _resultEntitySet.EntityType(); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(_resultEntitySet, entityType); await SerializeAsync(writer, requestHeaders.MetadataLevel); } }
public static async Task SerializeAsync(Uri baseUri, OeParseUriContext parseUriContext, Db.OeEntityAsyncEnumerator asyncEnumerator, Stream stream) { IEdmModel edmModel = parseUriContext.EdmModel; OeEntryFactory entryFactory = parseUriContext.EntryFactory; String contentType = parseUriContext.Headers.ContentType; var settings = new ODataMessageWriterSettings() { BaseUri = baseUri, EnableMessageStreamDisposal = false, ODataUri = parseUriContext.ODataUri, Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames, Version = ODataVersion.V4 }; IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, contentType); using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, edmModel)) { ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EntityType); var getWriter = new GetWriter(baseUri, parseUriContext.Headers.MetadataLevel, writer); await getWriter.SerializeAsync(entryFactory, asyncEnumerator, stream); } }
/// <inheritdoc /> public override async Task WriteObjectAsync(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } IEdmEntitySetBase entitySet = writeContext.NavigationSource as IEdmEntitySetBase; IEdmTypeReference resourceSetType; if (typeof(IEnumerable <DynamicTypeWrapper>).IsAssignableFrom(type) || typeof(DynamicTypeWrapper).IsAssignableFrom(type)) { resourceSetType = writeContext.Path.EdmType.ToEdmTypeReference(false); } else { resourceSetType = writeContext.GetEdmType(graph, type); } Contract.Assert(resourceSetType != null); IEdmStructuredTypeReference resourceType = GetResourceType(resourceSetType); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(entitySet, resourceType.StructuredDefinition()); await WriteObjectInlineAsync(graph, resourceSetType, writer, writeContext); }
private void WriteAnnotationsAndValidatePayload(Action <ODataWriter> action, IEdmNavigationSource navigationSource, ODataFormat format, string expectedPayload, bool request, bool createFeedWriter, bool enableWritingODataAnnotationWithoutPrefix = false, IEdmStructuredType resourceType = null) { var writerSettings = new ODataMessageWriterSettings { EnableMessageStreamDisposal = false }; writerSettings.SetContentType(format); writerSettings.SetServiceDocumentUri(new Uri("http://www.example.com/")); var container = ContainerBuilderHelper.BuildContainer(null); container.GetRequiredService <ODataSimplifiedOptions>().SetOmitODataPrefix( enableWritingODataAnnotationWithoutPrefix); MemoryStream stream = new MemoryStream(); if (request) { IODataRequestMessage requestMessageToWrite = new InMemoryMessage { Method = "GET", Stream = stream, Container = container }; using (var messageWriter = new ODataMessageWriter(requestMessageToWrite, writerSettings, Model)) { ODataWriter odataWriter = (createFeedWriter && !(navigationSource is EdmSingleton)) ? messageWriter.CreateODataResourceSetWriter(navigationSource as EdmEntitySet, EntityType) : messageWriter.CreateODataResourceWriter(navigationSource, resourceType ?? EntityType); action(odataWriter); } } else { IODataResponseMessage responseMessageToWrite = new InMemoryMessage { StatusCode = 200, Stream = stream, Container = container }; responseMessageToWrite.PreferenceAppliedHeader().AnnotationFilter = "*"; using (var messageWriter = new ODataMessageWriter(responseMessageToWrite, writerSettings, Model)) { ODataWriter odataWriter = (createFeedWriter && !(navigationSource is EdmSingleton)) ? messageWriter.CreateODataResourceSetWriter(navigationSource as EdmEntitySet, EntityType) : messageWriter.CreateODataResourceWriter(navigationSource, resourceType ?? EntityType); action(odataWriter); } } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); Assert.Equal(expectedPayload, payload); }
public void TestCreateODataFeedWriter_InJsonLight_WithoutEntitySetOrType_DoesNotThrow() { // Arrange IODataResponseMessage response = CreateResponse(); ODataMessageWriterSettings settings = CreateJsonLightSettings(); IEdmModel model = CreateModel(); using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model)) { // Act & Assert ExceptionAssert.DoesNotThrow(() => writer.CreateODataResourceSetWriter()); } }
public void TestCreateODataFeedWriter_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow() { // Arrange IODataResponseMessage response = CreateResponse(); ODataMessageWriterSettings settings = CreateJsonLightSettings(); IEdmModel model = CreateModel(); IEdmEntitySet entitySet = model.EntityContainer.EntitySets().First(); using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model)) { // Act & Assert Assert.DoesNotThrow(() => writer.CreateODataResourceSetWriter(entitySet)); } }
public async Task ExecuteResultAsync(ActionContext context) { var settings = new ODataMessageWriterSettings() { BaseUri = _odataUri.ServiceRoot, EnableMessageStreamDisposal = false, ODataUri = _odataUri, Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames, Version = ODataVersion.V4 }; var requestHeaders = OeRequestHeaders.Parse(context.HttpContext.Request.Headers["Accept"], context.HttpContext.Request.Headers["Prefer"]); _metadataLevel = requestHeaders.MetadataLevel; if (requestHeaders.MaxPageSize > 0 && PageSize == 0) { PageSize = requestHeaders.MaxPageSize; } IODataResponseMessage responseMessage = new OeInMemoryMessage(context.HttpContext.Response.Body, context.HttpContext.Request.ContentType); using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, _edmModel)) { ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet); IEdmEntitySet edmEntitySet = null; IEdmEntityType edmEntityType = null; foreach (IEdmEntitySet element in _edmModel.EntityContainer.EntitySets()) { edmEntityType = element.EntityType(); if (edmEntityType.FullName() == typeof(T).FullName) { edmEntitySet = element; break; } } ODataWriter writer = messageWriter.CreateODataResourceSetWriter(edmEntitySet, edmEntityType); await SerializeAsync(writer); } }
public string GetSampleFeedPayload(IEnumerable entities, IEnumerable <string> projectedProperties) { var message = new SimpleResponseMessage(this.StatusCode, this.ContentType); using (var writer = new ODataMessageWriter(message, Settings)) { var feedWriter = writer.CreateODataResourceSetWriter(); feedWriter.WriteStart(new ODataResourceSet() { Id = new Uri("http://temp.org/feed"), SerializationInfo = MySerializationInfo }); foreach (var entity in entities) { WriteEntry(feedWriter, entity, projectedProperties); } feedWriter.WriteEnd(); } return(message.GetMessageString()); }
protected void WriteAnnotationsAndValidatePayload(Action <ODataWriter> action, ODataFormat format, string expectedPayload, bool request, bool createFeedWriter) { var writerSettings = new ODataMessageWriterSettings { EnableMessageStreamDisposal = false }; writerSettings.SetContentType(format); writerSettings.SetServiceDocumentUri(new Uri("http://www.example.com/")); MemoryStream stream = new MemoryStream(); if (request) { IODataRequestMessage requestMessageToWrite = new InMemoryMessage { Method = "GET", Stream = stream }; using (var messageWriter = new ODataMessageWriter(requestMessageToWrite, writerSettings, Model)) { ODataWriter odataWriter = createFeedWriter ? messageWriter.CreateODataResourceSetWriter(EntitySet, EntityType) : messageWriter.CreateODataResourceWriter(EntitySet, EntityType); action(odataWriter); } } else { IODataResponseMessage responseMessageToWrite = new InMemoryMessage { StatusCode = 200, Stream = stream }; using (var messageWriter = new ODataMessageWriter(responseMessageToWrite, writerSettings, Model)) { ODataWriter odataWriter = createFeedWriter ? messageWriter.CreateODataResourceSetWriter(EntitySet, EntityType) : messageWriter.CreateODataResourceWriter(EntitySet, EntityType); action(odataWriter); } } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); Assert.Equal(expectedPayload, payload); }
public static async Task SerializeAsync(OeQueryContext queryContext, IAsyncEnumerator <Object> asyncEnumerator, String contentType, Stream stream, OeEntryFactory entryFactory, CancellationToken cancellationToken) { var settings = new ODataMessageWriterSettings() { BaseUri = queryContext.ODataUri.ServiceRoot, EnableMessageStreamDisposal = false, ODataUri = queryContext.ODataUri, Validations = ValidationKinds.ThrowOnDuplicatePropertyNames, Version = ODataVersion.V4 }; IODataResponseMessage responseMessage = new Infrastructure.OeInMemoryMessage(stream, contentType); using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, queryContext.EdmModel)) { ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EdmEntityType); var odataWriter = new OeODataWriter(queryContext, writer, cancellationToken); await odataWriter.WriteAsync(entryFactory, asyncEnumerator).ConfigureAwait(false); } }
private bool TryWriteAggregationResult( object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext, IEdmTypeReference resourceSetType) { if (typeof(IEnumerable <DynamicTypeWrapper>).IsAssignableFrom(type)) { IEdmTypeReference elementType = resourceSetType.AsCollection().ElementType(); if (elementType.IsEntity()) { var entitySet = writeContext.NavigationSource as IEdmEntitySetBase; var entityType = elementType.AsEntity(); var writer = messageWriter.CreateODataResourceSetWriter(entitySet, entityType.EntityDefinition()); WriteObjectInline(graph, resourceSetType, writer, writeContext); return(true); } } return(false); }
public static async Task SerializeAsync(OeQueryContext queryContext, Db.OeAsyncEnumerator asyncEnumerator, String contentType, Stream stream) { OeEntryFactory entryFactory = queryContext.EntryFactory; var settings = new ODataMessageWriterSettings() { BaseUri = queryContext.ODataUri.ServiceRoot, EnableMessageStreamDisposal = false, ODataUri = queryContext.ODataUri, Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames, Version = ODataVersion.V4 }; IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, contentType); using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, queryContext.EdmModel)) { ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EntityType); var getWriter = new GetWriter(queryContext, writer); await getWriter.SerializeAsync(entryFactory, asyncEnumerator, queryContext).ConfigureAwait(false); } }
private bool TryWriteAggregationResult( object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext, IEdmTypeReference resourceSetType) { if (typeof(IEnumerable<DynamicTypeWrapper>).IsAssignableFrom(type)) { IEdmTypeReference elementType = resourceSetType.AsCollection().ElementType(); if (elementType.IsEntity()) { var entitySet = writeContext.NavigationSource as IEdmEntitySetBase; var entityType = elementType.AsEntity(); var writer = messageWriter.CreateODataResourceSetWriter(entitySet, entityType.EntityDefinition()); WriteObjectInline(graph, resourceSetType, writer, writeContext); return true; } } return false; }
/// <inheritdoc /> public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } IEdmEntitySetBase entitySet = writeContext.NavigationSource as IEdmEntitySetBase; IEdmTypeReference resourceSetType = writeContext.GetEdmType(graph, type); Contract.Assert(resourceSetType != null); IEdmStructuredTypeReference resourceType = GetResourceType(resourceSetType); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(entitySet, resourceType.StructuredDefinition()); WriteObjectInline(graph, resourceSetType, writer, writeContext); }
public Task WriteCustomers(IEnumerable <Customer> payload, Stream stream) { var settings = new ODataMessageWriterSettings(); settings.ODataUri = new ODataUri { ServiceRoot = new Uri("https://services.odata.org/V4/OData/OData.svc/") }; InMemoryMessage message = new InMemoryMessage { Stream = stream }; var messageWriter = new ODataMessageWriter((IODataResponseMessage)message, settings, model); var entitySet = model.EntityContainer.FindEntitySet("Customers"); var writer = messageWriter.CreateODataResourceSetWriter(entitySet); var resourceSet = new ODataResourceSet(); //Console.WriteLine("Start writing resource set"); writer.WriteStart(resourceSet); //Console.WriteLine("About to write resources {0}", payload.Count()); foreach (var customer in payload) { // await resourceSerializer.WriteObjectInlineAsync(item, elementType, writer, writeContext); // create resource with only primitive types var resource = new ODataResource { Properties = new[] { new ODataProperty { Name = "Id", Value = customer.Id }, new ODataProperty { Name = "Name", Value = customer.Name }, new ODataProperty { Name = "Emails", Value = new ODataCollectionValue { Items = customer.Emails, TypeName = "Collection(Edm.String)" } } } }; //Console.WriteLine("Start writing resource {0}", customer.Id); writer.WriteStart(resource); // skip WriterStreamPropertiesAsync // WriteComplexPropertiesAsync // -- HomeAddress var homeAddressInfo = new ODataNestedResourceInfo { Name = "HomeAddress", IsCollection = false }; // start write homeAddress writer.WriteStart(homeAddressInfo); var homeAddressResource = new ODataResource { Properties = new[] { new ODataProperty { Name = "City", Value = customer.HomeAddress.City }, new ODataProperty { Name = "Street", Value = customer.HomeAddress.Street } } }; writer.WriteStart(homeAddressResource); writer.WriteEnd(); // end write homeAddress writer.WriteEnd(); // -- End HomeAddress // -- Addresses var addressesInfo = new ODataNestedResourceInfo { Name = "Addresses", IsCollection = true }; // start addressesInfo writer.WriteStart(addressesInfo); var addressesResourceSet = new ODataResourceSet(); // start addressesResourceSet writer.WriteStart(addressesResourceSet); foreach (var address in customer.Addresses) { var addressResource = new ODataResource { Properties = new[] { new ODataProperty { Name = "City", Value = address.City }, new ODataProperty { Name = "Street", Value = address.Street } } }; writer.WriteStart(addressResource); writer.WriteEnd(); } // end addressesResourceSet writer.WriteEnd(); // end addressesInfo writer.WriteEnd(); // -- End Addresses // end write resource writer.WriteEnd(); //Console.WriteLine("Finish writing resource {0}", customer.Id); } writer.WriteEnd(); return(Task.CompletedTask); }
public void WriteEntryWithWrongSerializationInfo() { foreach (var mimeType in this.testMimeTypes) { var settings = new ODataMessageWriterSettings(); settings.ODataUri = new ODataUri() { ServiceRoot = this.ServiceUri }; // wrong EntitySetName for entry var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataResourceWriter(); var entry = this.CreatePersonEntryWithoutSerializationInfo(); entry.SetSerializationInfo(new ODataResourceSerializationInfo() { NavigationSourceName = "Parsen", NavigationSourceEntityTypeName = NameSpace + "Person" }); odataWriter.WriteStart(entry); odataWriter.WriteEnd(); var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream()); Assert.IsTrue(result.Contains("\"PersonId\":-5")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // no metadata does not write odata.metadata Assert.IsTrue(result.Contains("$metadata#Parsen/$entity")); Assert.IsTrue(result.Contains("Person(-5)\",\"PersonId\":-5")); } else { Assert.IsFalse(result.Contains("Person(-5)\",\"PersonId\":-5")); } } // wrong EntitySetName for feed responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataResourceSetWriter(); var feed = this.CreatePersonFeed(); feed.SetSerializationInfo(new ODataResourceSerializationInfo() { NavigationSourceName = "Parsen", NavigationSourceEntityTypeName = NameSpace + "Person" }); var entry = this.CreatePersonEntryWithoutSerializationInfo(); odataWriter.WriteStart(feed); odataWriter.WriteStart(entry); odataWriter.WriteEnd(); odataWriter.WriteEnd(); var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream()); Assert.IsTrue(result.Contains("\"PersonId\":-5")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // no metadata does not write odata.metadata Assert.IsTrue(result.Contains("$metadata#Parsen\"")); Assert.IsTrue(result.Contains("Person(-5)\",\"PersonId\":-5")); } else { Assert.IsFalse(result.Contains("Person(-5)\",\"PersonId\":-5")); } } // wrong complex collection type name responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataResourceSetWriter(); var complexCollection = new ODataResourceSetWrapper() { ResourceSet = new ODataResourceSet(), Resources = new List <ODataResourceWrapper>() { WritePayloadHelper.CreatePrimaryContactODataWrapper() } }; complexCollection.ResourceSet.SetSerializationInfo(new ODataResourceSerializationInfo() { ExpectedTypeName = NameSpace + "ContactDETAIL" }); ODataWriterHelper.WriteResourceSet(odataWriter, complexCollection); var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream()); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // [{"@odata.type":"#Microsoft.Test.OData.Services.AstoriaDefaultService.ContactDetails","*****@*****.**":"#Collection(String)"... Assert.IsTrue(result.Contains("\"value\":[{\"@odata.type\":\"#Microsoft.Test.OData.Services.AstoriaDefaultService.ContactDetails\",\"EmailBag")); // no metadata does not write odata.metadata Assert.IsTrue(result.Contains("$metadata#Collection(" + NameSpace + "ContactDETAIL)")); } else { Assert.IsFalse(result.Contains("\"@odata.type\":\"#Microsoft.Test.OData.Services.AstoriaDefaultService.ContactDetails\"")); } } // The following two cases of wrong reference link info is no longer active. The ODataEntityReferenceLinkSerializationInfo is ignored when writer writes the payload. // Consider removing them. // wrong reference link info responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var link = new ODataEntityReferenceLink() { Url = new Uri(this.ServiceUri + "Order(-10)") }; messageWriter.WriteEntityReferenceLink(link); var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream()); Assert.IsTrue(result.Contains(this.ServiceUri + "Order(-10)")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // no metadata does not write odata.context Assert.IsTrue(result.Contains("$metadata#$ref")); } } // wrong reference links info responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var links = new ODataEntityReferenceLinks() { Links = new[] { new ODataEntityReferenceLink() { Url = new Uri(this.ServiceUri + "Order(-10)") } }, }; messageWriter.WriteEntityReferenceLinks(links); var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream()); Assert.IsTrue(result.Contains(this.ServiceUri + "Order(-10)")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // no metadata does not write odata.metadata Assert.IsTrue(result.Contains("$metadata#Collection($ref)")); } } } }
private static void WriteCustomInstanceAnnotationToFeedAndEntry(string expectedPayload, ODataFormat format) { var writerSettings = new ODataMessageWriterSettings { EnableMessageStreamDisposal = false }; writerSettings.SetContentType(format); writerSettings.ODataUri = new ODataUri() { ServiceRoot = new Uri("http://www.example.com/") }; MemoryStream stream = new MemoryStream(); IODataResponseMessage messageToWrite = new InMemoryMessage { StatusCode = 200, Stream = stream }; messageToWrite.PreferenceAppliedHeader().AnnotationFilter = "Custom.*"; // Write payload using (var messageWriter = new ODataMessageWriter(messageToWrite, writerSettings, Model)) { var odataWriter = messageWriter.CreateODataResourceSetWriter(EntitySet, EntityType); // Add instance annotations to the feed. var feedToWrite = new ODataResourceSet { Id = new Uri("urn:feedId") }; feedToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("Custom.Int32Annotation", PrimitiveValue1)); feedToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("Custom.GuidAnnotation", PrimitiveValue2)); feedToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("ShouldSkip.Int32Annotation", PrimitiveValue1)); feedToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("ShouldSkip.GuidAnnotation", PrimitiveValue2)); // Writes instance annotations at the beginning of the feed odataWriter.WriteStart(feedToWrite); // Add instance annotations to the entry. var entryToWrite = new ODataResource { Properties = new[] { new ODataProperty { Name = "ID", Value = 1 } } }; entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("Custom.ComplexAnnotation", ResourceValue1)); entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("ShouldSkip.ComplexAnnotation", ResourceValue2)); // Writes instance annotations at the beginning of the entry odataWriter.WriteStart(entryToWrite); // Add more instance annotations to the entry. entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("Custom.PrimitiveCollectionAnnotation", PrimitiveCollectionValue)); entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("ShouldSkip.PrimitiveCollectionAnnotation", PrimitiveCollectionValue)); // The writer remembers which instance annotations in the collection has been written // and only write out the unwritten ones since WriteStart() to the end of the entry. odataWriter.WriteEnd(); // Add more instance annotations to the feed. feedToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("Custom.ComplexCollectionAnnotation", ComplexCollectionValue)); feedToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("ShouldSkip.ComplexCollectionAnnotation", ComplexCollectionValue)); // The writer remembers which instance annotations in the collection has been written // and only write out the unwritten ones since WriteStart() to the end of the feed. odataWriter.WriteEnd(); } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); Assert.Equal(payload, expectedPayload); }
public void ValidateWriteMethodGroup() { // setup model var model = new EdmModel(); var complexType = new EdmComplexType("NS", "ComplexType"); complexType.AddStructuralProperty("PrimitiveProperty1", EdmPrimitiveTypeKind.Int64); complexType.AddStructuralProperty("PrimitiveProperty2", EdmPrimitiveTypeKind.Int64); var entityType = new EdmEntityType("NS", "EntityType", null, false, true); entityType.AddKeys( entityType.AddStructuralProperty("PrimitiveProperty", EdmPrimitiveTypeKind.Int64)); var container = new EdmEntityContainer("NS", "Container"); var entitySet = container.AddEntitySet("EntitySet", entityType); model.AddElements(new IEdmSchemaElement[] { complexType, entityType, container }); // write payload using new API string str1; { // setup var stream = new MemoryStream(); var message = new InMemoryMessage { Stream = stream }; message.SetHeader("Content-Type", "application/json;odata.metadata=full"); var settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://svc/") }, }; var writer = new ODataMessageWriter((IODataResponseMessage)message, settings, model); var entitySetWriter = writer.CreateODataResourceSetWriter(entitySet); entitySetWriter.Write(new ODataResourceSet(), () => entitySetWriter .Write(new ODataResource { Properties = new[] { new ODataProperty { Name = "PrimitiveProperty", Value = 1L } } }) .Write(new ODataResource { Properties = new[] { new ODataProperty { Name = "PrimitiveProperty", Value = 2L } } }, () => entitySetWriter .Write(new ODataNestedResourceInfo { Name = "DynamicNavProperty" }) .Write(new ODataNestedResourceInfo { Name = "DynamicCollectionProperty", IsCollection = true }, () => entitySetWriter .Write(new ODataResourceSet { TypeName = "Collection(NS.ComplexType)" }))) ); str1 = Encoding.UTF8.GetString(stream.ToArray()); } // write payload using old API string str2; { // setup var stream = new MemoryStream(); var message = new InMemoryMessage { Stream = stream }; message.SetHeader("Content-Type", "application/json;odata.metadata=full"); var settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://svc/") }, }; var writer = new ODataMessageWriter((IODataResponseMessage)message, settings, model); var entitySetWriter = writer.CreateODataResourceSetWriter(entitySet); entitySetWriter.WriteStart(new ODataResourceSet()); entitySetWriter.WriteStart(new ODataResource { Properties = new[] { new ODataProperty { Name = "PrimitiveProperty", Value = 1L } } }); entitySetWriter.WriteEnd(); entitySetWriter.WriteStart(new ODataResource { Properties = new[] { new ODataProperty { Name = "PrimitiveProperty", Value = 2L } } }); entitySetWriter.WriteStart(new ODataNestedResourceInfo { Name = "DynamicNavProperty" }); entitySetWriter.WriteEnd(); entitySetWriter.WriteStart(new ODataNestedResourceInfo { Name = "DynamicCollectionProperty", IsCollection = true }); entitySetWriter.WriteStart(new ODataResourceSet { TypeName = "Collection(NS.ComplexType)" }); entitySetWriter.WriteEnd(); entitySetWriter.WriteEnd(); entitySetWriter.WriteEnd(); entitySetWriter.WriteEnd(); str2 = Encoding.UTF8.GetString(stream.ToArray()); } Assert.Equal(str1, str2); }
public void WriteWithoutSerializationInfo() { foreach (var mimeType in this.testMimeTypes) { var settings = new ODataMessageWriterSettings(); settings.ODataUri = new ODataUri() { ServiceRoot = this.ServiceUri }; // write entry without serialization info var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataResourceWriter(); var entry = this.CreatePersonEntryWithoutSerializationInfo(); var expectedError = mimeType.Contains(MimeTypes.ODataParameterNoMetadata) ? null : "ODataResourceTypeContext_MetadataOrSerializationInfoMissing"; AssertThrows <ODataException>(() => odataWriter.WriteStart(entry), expectedError); } // write feed without serialization info responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataResourceSetWriter(); var feed = this.CreatePersonFeed(); var entry = this.CreatePersonEntryWithoutSerializationInfo(); entry.SetSerializationInfo(new ODataResourceSerializationInfo() { NavigationSourceName = "Person", NavigationSourceEntityTypeName = NameSpace + "Person" }); var expectedError = mimeType.Contains(MimeTypes.ODataParameterNoMetadata) ? null : "ODataResourceTypeContext_MetadataOrSerializationInfoMissing"; AssertThrows <ODataException>(() => odataWriter.WriteStart(feed), expectedError); } // write collection without serialization info responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataCollectionWriter(); var collectionStart = new ODataCollectionStart() { Name = "BackupContactInfo" }; var expectedError = mimeType.Contains(MimeTypes.ODataParameterNoMetadata) ? null : "ODataContextUriBuilder_TypeNameMissingForTopLevelCollection"; AssertThrows <ODataException>(() => odataWriter.WriteStart(collectionStart), expectedError); } // write a reference link without serialization info responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var link = new ODataEntityReferenceLink() { Url = new Uri(this.ServiceUri + "Order(-10)") }; messageWriter.WriteEntityReferenceLink(link); // No exception is expected. Simply verify the writing succeeded. if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { Stream stream = responseMessageWithoutModel.GetStream(); Assert.IsTrue(WritePayloadHelper.ReadStreamContent(stream).Contains("$metadata#$ref")); } } // write reference links without serialization info responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var links = new ODataEntityReferenceLinks() { Links = new[] { new ODataEntityReferenceLink() { Url = new Uri(this.ServiceUri + "Order(-10)") } }, }; messageWriter.WriteEntityReferenceLinks(links); // No exception is expected. Simply verify the writing succeeded. if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { Stream stream = responseMessageWithoutModel.GetStream(); Assert.IsTrue(WritePayloadHelper.ReadStreamContent(stream).Contains("$metadata#Collection($ref)")); } } // write request message containing an entry var requestMessageWithoutModel = new StreamRequestMessage(new MemoryStream(), new Uri(this.ServiceUri + "Person"), "POST"); requestMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(requestMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataResourceWriter(); var entry = this.CreatePersonEntryWithoutSerializationInfo(); odataWriter.WriteStart(entry); odataWriter.WriteEnd(); Stream stream = requestMessageWithoutModel.GetStream(); Assert.IsTrue(WritePayloadHelper.ReadStreamContent(stream).Contains("Person(-5)\",\"PersonId\":-5,\"Name\":\"xhsdckkeqzvlnprheujeycqrglfehtdocildrequohlffazfgtvmddyqsaxrojqxrsckohrakdxlrghgmzqnyruzu\"")); } } }
public void ShouldBeAbleToWriteFeedAndEntryResponseInJsonLightWithoutModel() { const string expectedPayload = "{" + "\"@odata.context\":\"http://www.example.com/$metadata#Customers/NS.VIPCustomer\"," + "\"value\":[" + "{" + "\"Name\":\"Bob\"," + "\"[email protected]\":\"MostRecentOrder\"," + "\"MostRecentOrder\":{\"OrderId\":101}" + "}" + "]" + "}"; var writerSettings = new ODataMessageWriterSettings { EnableMessageStreamDisposal = false }; writerSettings.SetContentType(ODataFormat.Json); writerSettings.ODataUri = new ODataUri() { ServiceRoot = new Uri("http://www.example.com") }; MemoryStream stream = new MemoryStream(); IODataResponseMessage responseMessage = new InMemoryMessage { StatusCode = 200, Stream = stream }; // Write payload using (var messageWriter = new ODataMessageWriter(responseMessage, writerSettings)) { var odataWriter = messageWriter.CreateODataResourceSetWriter(); // Create customers feed with serializtion info to write odata.metadata. var customersFeed = new ODataResourceSet(); customersFeed.SetSerializationInfo(new ODataResourceSerializationInfo { NavigationSourceName = "Customers", NavigationSourceEntityTypeName = "NS.Customer", ExpectedTypeName = "NS.VIPCustomer" }); // Write customers feed. odataWriter.WriteStart(customersFeed); // Write VIP customer { // Create VIP customer, don't need to pass in serialization info since the writer knows the context from the feed scope. var vipCustomer = new ODataResource { TypeName = "NS.VIPCustomer" }; var customerKey = new ODataProperty { Name = "Name", Value = "Bob" }; // Provide serialization info at the property level to compute the edit link. customerKey.SetSerializationInfo(new ODataPropertySerializationInfo { PropertyKind = ODataPropertyKind.Key }); vipCustomer.Properties = new[] { customerKey }; // Write customer entry. odataWriter.WriteStart(vipCustomer); // Write expanded most recent order { // No API to set serialization info on ODataNavigationLink since what we are adding on ODataFeed and ODataResource should be sufficient for the 5.5 release. var navigationLink = new ODataNestedResourceInfo { Name = "MostRecentOrder", IsCollection = false, Url = new Uri("MostRecentOrder", UriKind.Relative) }; odataWriter.WriteStart(navigationLink); // Write the most recent customer. { var mostRecentOrder = new ODataResource { TypeName = "NS.Order" }; // Add serialization info so we can computer links. mostRecentOrder.SetSerializationInfo(new ODataResourceSerializationInfo { NavigationSourceName = "Orders", NavigationSourceEntityTypeName = "NS.Order", ExpectedTypeName = "NS.Order" }); var orderKey = new ODataProperty { Name = "OrderId", Value = 101 }; // Provide serialization info at the property level to compute the edit link. orderKey.SetSerializationInfo(new ODataPropertySerializationInfo { PropertyKind = ODataPropertyKind.Key }); mostRecentOrder.Properties = new[] { orderKey }; // Write order entry. odataWriter.WriteStart(mostRecentOrder); odataWriter.WriteEnd(); } // End navigationLink. odataWriter.WriteEnd(); } // End customer entry. odataWriter.WriteEnd(); } // End customers feed. odataWriter.WriteEnd(); } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); payload.Should().Be(expectedPayload); }
public void SpecifySerializationInfoForFeedAndEntry() { foreach (var mimeType in this.testMimeTypes) { var settings = new ODataMessageWriterSettings(); settings.ODataUri = new ODataUri() { ServiceRoot = this.ServiceUri }; var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataResourceSetWriter(); var feed = this.CreatePersonFeed(); feed.SetSerializationInfo(new ODataResourceSerializationInfo() { NavigationSourceName = "Person", NavigationSourceEntityTypeName = NameSpace + "Person" }); var entry = new ODataResource() { Id = new Uri(ServiceUri + "Person(-5)"), TypeName = NameSpace + "Employee" }; var personEntryP1 = new ODataProperty { Name = "PersonId", Value = -5 }; var personEntryP2 = new ODataProperty { Name = "Name", Value = "xhsdckkeqzvlnprheujeycqrglfehtdocildrequohlffazfgtvmddyqsaxrojqxrsckohrakdxlrghgmzqnyruzu" }; var personEntryP3 = new ODataProperty { Name = "ManagersPersonId", Value = -465010984 }; entry.Properties = new[] { personEntryP1, personEntryP2, personEntryP3 }; entry.SetSerializationInfo(new ODataResourceSerializationInfo() { NavigationSourceName = "Person", NavigationSourceEntityTypeName = NameSpace + "Person" }); odataWriter.WriteStart(feed); odataWriter.WriteStart(entry); odataWriter.WriteEnd(); odataWriter.WriteEnd(); Stream stream = responseMessageWithoutModel.GetStream(); string result = WritePayloadHelper.ReadStreamContent(stream); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { Assert.IsTrue(result.Contains(NameSpace + "Employee")); Assert.IsTrue(result.Contains("$metadata#Person")); } else { Assert.IsFalse(result.Contains(NameSpace + "Employee")); } } } }