private ODataWriter CreateODataFeedWriter(ODataMessageWriter messageWriter, IEdmEntitySet entitySet, IEdmEntityType entityType, bool hasModel) { if (hasModel) { return(messageWriter.CreateODataFeedWriter(entitySet, entityType)); } else { return(messageWriter.CreateODataFeedWriter()); } }
private static void WriteTopLevelFeed(bool enableFullValidation = true) { var msg = ODataSamplesUtil.CreateMessage(); var settings = new ODataMessageWriterSettings(BaseSettings) { ODataUri = new ODataUri() { ServiceRoot = new Uri("http://demo/odata.svc/PetSet") }, EnableFullValidation = enableFullValidation }; using (var omw = new ODataMessageWriter((IODataResponseMessage)msg, settings, ExtModel.Model)) { var writer = omw.CreateODataFeedWriter(ExtModel.PetSet); writer.WriteStart(Feed); writer.WriteStart(PetEntry); writer.WriteEnd(); writer.WriteStart(FishEntry); writer.WriteEnd(); writer.WriteEnd(); } Console.WriteLine(ODataSamplesUtil.MessageToString(msg)); }
/// <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; if (entitySet == null) { throw new SerializationException(SRResources.EntitySetMissingDuringSerialization); } IEdmTypeReference feedType = writeContext.GetEdmType(graph, type); Contract.Assert(feedType != null); IEdmEntityTypeReference entityType = GetEntityType(feedType); ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType.EntityDefinition()); WriteObjectInline(graph, feedType, writer, writeContext); }
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.CreateODataFeedWriter(); var feed = this.CreatePersonFeed(); feed.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "Person", NavigationSourceEntityTypeName = NameSpace + "Person" }); var entry = new ODataEntry() { 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 ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "Person", NavigationSourceEntityTypeName = NameSpace + "Person" }); odataWriter.WriteStart(feed); odataWriter.WriteStart(entry); odataWriter.WriteEnd(); odataWriter.WriteEnd(); Stream stream = responseMessageWithoutModel.GetStream(); string result = WritePayloadHelper.ReadStreamContent(stream); Assert.IsTrue(result.Contains(NameSpace + "Employee")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { Assert.IsTrue(result.Contains("$metadata#Person")); } } } }
public void OrderFeedTest() { foreach (var mimeType in this.mimeTypes) { var settings = new ODataMessageWriterSettings(); settings.ODataUri = new ODataUri() { ServiceRoot = this.ServiceUri }; string outputWithModel = null; string outputWithoutModel = null; var responseMessageWithModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithModel, settings, WritePayloadHelper.Model)) { var odataWriter = messageWriter.CreateODataFeedWriter(WritePayloadHelper.OrderSet, WritePayloadHelper.OrderType); outputWithModel = this.WriteAndVerifyOrderFeed(responseMessageWithModel, odataWriter, true, mimeType); } var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataFeedWriter(); outputWithoutModel = this.WriteAndVerifyOrderFeed(responseMessageWithoutModel, odataWriter, false, mimeType); } WritePayloadHelper.VerifyPayloadString(outputWithModel, outputWithoutModel, mimeType); } }
/// <inheritdoc /> public override void WriteObject(object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } IEdmEntitySet entitySet = writeContext.EntitySet; if (entitySet == null) { throw new SerializationException(SRResources.EntitySetMissingDuringSerialization); } IEdmEntityType entityType = EntityType.EntityDefinition(); ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType); WriteObjectInline(graph, writer, writeContext); }
/// <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"); } IEdmEntitySet entitySet = writeContext.EntitySet; if (entitySet == null) { throw new SerializationException(SRResources.EntitySetMissingDuringSerialization); } IEdmTypeReference feedType = writeContext.GetEdmType(graph, type); Contract.Assert(feedType != null); IEdmEntityTypeReference entityType = GetEntityType(feedType); ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType.EntityDefinition()); WriteObjectInline(graph, feedType, writer, writeContext); }
public void OrderFeedTest() { foreach (var mimeType in this.mimeTypes) { var settings = new ODataMessageWriterSettings(); settings.ODataUri = new ODataUri() { ServiceRoot = this.ServiceUri }; string outputWithModel = null; string outputWithoutModel = null; var responseMessageWithModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithModel, settings, WritePayloadHelper.Model)) { var odataWriter = messageWriter.CreateODataFeedWriter(WritePayloadHelper.OrderSet, WritePayloadHelper.OrderType); outputWithModel = this.WriteAndVerifyOrderFeed(responseMessageWithModel, odataWriter, true, mimeType); } var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataFeedWriter(); outputWithoutModel = this.WriteAndVerifyOrderFeed(responseMessageWithoutModel, odataWriter, false, mimeType); } WritePayloadHelper.VerifyPayloadString(outputWithModel, outputWithoutModel, mimeType); } }
public override void WriteObject(object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } IEdmEntitySet entitySet = writeContext.EntitySet; if (entitySet == null) { throw new SerializationException(SRResources.EntitySetMissingDuringSerialization); } // No null check; entity type is not required for successful serialization. IEdmEntityType entityType = _edmElementType; ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType); WriteObjectInline(graph, writer, writeContext); writer.Flush(); }
public void ConvertFeed(Uri relativeODataUri, Uri relativeSodaUri, JsonPayload jsonPayload, DateTimeOffset feedUpdateTime) { var jsonObject = jsonPayload.JsonObject; var entries = jsonObject.PropertyValue<JArray>("entries"); var meta = jsonObject.PropertyValue<JObject>("meta"); var view = meta.PropertyValue<JObject>("view"); IList<string> fieldsToIgnore; var model = BuildModel(view, out fieldsToIgnore); var entitySet = model.EntityContainers.Single().EntitySets().Single(); var settings = new ODataMessageWriterSettings { Indent = true, }; using (var writer = new ODataMessageWriter(Message, settings, model)) { var feedWriter = writer.CreateODataFeedWriter(); var feed = new ODataFeed(); feed.SetAnnotation(new AtomFeedMetadata { Updated = feedUpdateTime, }); feed.Id = new Uri(ODataEndpointUri, relativeODataUri.OriginalString).OriginalString; feedWriter.WriteStart(feed); foreach (var entry in entries.Cast<JObject>()) { var entryMetadata = new ODataEntry(); entryMetadata.Id = (string) ((JValue) entry.Property("id").Value).Value; entryMetadata.TypeName = entitySet.ElementType.FullName(); entryMetadata.Properties = ConvertProperties(entry, fieldsToIgnore); entryMetadata.SetAnnotation(new AtomEntryMetadata { Updated = ConvertDateTimeOffset(entry.PrimitivePropertyValue<long>("updated_at")), Published = ConvertDateTimeOffset(entry.PrimitivePropertyValue<long>("created_at")), }); feedWriter.WriteStart(entryMetadata); feedWriter.WriteEnd(); } feedWriter.WriteEnd(); } }
public override void WriteObject(object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } ODataWriter writer = messageWriter.CreateODataFeedWriter(); WriteObjectInline(graph, writer, writeContext); writer.Flush(); }
public override void WriteObject(object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } ODataWriter writer = messageWriter.CreateODataFeedWriter(); WriteObjectInline(graph, writer, writeContext); writer.Flush(); }
public static void WriteODataFeed(IEdmModel model, Stream stream) { // Create a ODataEntry var entry = new ODataEntry() { Properties = new List <ODataProperty>() { new ODataProperty { Name = "ProductId", Value = 100 }, new ODataProperty { Name = "Name", Value = "The World" }, new ODataProperty { Name = "SkinColor", Value = new ODataEnumValue("Green", DefaultNamespace + ".Color") }, new ODataProperty { Name = "UserAccess", Value = new ODataEnumValue("ReadWrite, Execute", DefaultNamespace + ".AccessLevel") } } }; ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(); writerSettings.ODataUri = new ODataUri() { ServiceRoot = ServiceRootUri }; writerSettings.PayloadBaseUri = ServiceRootUri; writerSettings.SetContentType("application/json;odata.metadata=full", Encoding.UTF8.WebName); writerSettings.AutoComputePayloadMetadataInJson = true; var responseMessage = new ODataResponseMessage(stream); using (var messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { IEdmEntitySet entitySet = model.FindDeclaredEntitySet("Products"); ODataWriter feedWriter = messageWriter.CreateODataFeedWriter(entitySet); var feed = new ODataFeed { Id = new Uri(ServiceRootUri, "Products") }; feedWriter.WriteStart(feed); feedWriter.WriteStart(entry); feedWriter.WriteEnd(); feedWriter.WriteEnd(); feedWriter.Flush(); } }
private static void CsvWriterDemo() { EdmEntityType customer = new EdmEntityType("ns", "customer"); var key = customer.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32); customer.AddKeys(key); customer.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String); ODataEntry entry1 = new ODataEntry() { Properties = new[] { new ODataProperty(){Name = "Id", Value = 51}, new ODataProperty(){Name = "Name", Value = "Name_A"}, } }; ODataEntry entry2 = new ODataEntry() { Properties = new[] { new ODataProperty(){Name = "Id", Value = 52}, new ODataProperty(){Name = "Name", Value = "Name_B"}, } }; var stream = new MemoryStream(); var message = new Message { Stream = stream }; // Set Content-Type header value message.SetHeader("Content-Type", "text/csv"); var settings = new ODataMessageWriterSettings { // Set our resolver here. MediaTypeResolver = CsvMediaTypeResolver.Instance, DisableMessageStreamDisposal = true, }; using (var messageWriter = new ODataMessageWriter(message, settings)) { var writer = messageWriter.CreateODataFeedWriter(null, customer); writer.WriteStart(new ODataFeed()); writer.WriteStart(entry1); writer.WriteEnd(); writer.WriteStart(entry2); writer.WriteEnd(); writer.WriteEnd(); writer.Flush(); } stream.Seek(0, SeekOrigin.Begin); string msg; using (var sr = new StreamReader(stream)) { msg = sr.ReadToEnd(); } Console.WriteLine(msg); }
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 Assert.DoesNotThrow(() => writer.CreateODataFeedWriter()); } }
public static void WriteODataFeed(IEdmModel model, Stream stream, NavigationPropertySegment containedSegment, ODataPath queryPath) { // Create a ODataEntry ODataEntry[] entries = new ODataEntry[] { new ODataEntry() { Properties = new[] { new ODataProperty { Name = "ProductID", Value = 1 }, }, } }; var message = new ODataResponseMessage(stream); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(); writerSettings.ODataUri = new ODataUri() { ServiceRoot = ServiceRootUri }; writerSettings.PayloadBaseUri = ServiceRootUri; writerSettings.SetContentType("application/json;odata.metadata=full", Encoding.UTF8.WebName); writerSettings.AutoComputePayloadMetadataInJson = true; writerSettings.ODataUri = new ODataUri() { ServiceRoot = ServiceRootUri, Path = queryPath, }; using (var messageWriter = new ODataMessageWriter(message, writerSettings, model)) { var feedWriter = messageWriter.CreateODataFeedWriter(containedSegment.NavigationSource as IEdmEntitySetBase, containedSegment.NavigationSource.EntityType()); var feed = new ODataFeed(); feedWriter.WriteStart(feed); foreach (ODataEntry entry in entries) { feedWriter.WriteStart(entry); feedWriter.WriteEnd(); } feedWriter.WriteEnd(); feedWriter.Flush(); } }
public void TestCreateODataFeedWriter_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow() { // Arrange IODataResponseMessage response = CreateResponse(); ODataMessageWriterSettings settings = CreateJsonLightSettings(); IEdmModel model = CreateModel(); IEdmEntitySet entitySet = model.EntityContainers().Single().EntitySets().First(); using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model)) { // Act & Assert Assert.DoesNotThrow(() => writer.CreateODataFeedWriter(entitySet)); } }
public void PersonFeedTest() { foreach (var mimeType in this.mimeTypes) { var settings = new ODataMessageWriterSettings() { PayloadBaseUri = this.ServiceUri }; settings.ODataUri = new ODataUri() { ServiceRoot = this.ServiceUri }; string outputWithModel = null; string outputWithoutModel = null; var responseMessageWithModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithModel, settings, WritePayloadHelper.Model)) { var odataWriter = messageWriter.CreateODataFeedWriter(WritePayloadHelper.PersonSet, WritePayloadHelper.PersonType); outputWithModel = this.WriteAndVerifyPersonFeed(responseMessageWithModel, odataWriter, true, mimeType); } var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataFeedWriter(); outputWithoutModel = this.WriteAndVerifyPersonFeed(responseMessageWithoutModel, odataWriter, false, mimeType); } WritePayloadHelper.VerifyPayloadString(outputWithModel, outputWithoutModel, mimeType); if (mimeType.Contains(MimeTypes.ODataParameterMinimalMetadata) || mimeType.Contains(MimeTypes.ODataParameterFullMetadata)) { Assert.IsTrue(outputWithoutModel.Contains(this.ServiceUri + "$metadata#Person\"")); } if (mimeType.Contains(MimeTypes.ApplicationJsonLight)) { // odata.type is included in json light payload only if entry typename is different than serialization info Assert.IsFalse(outputWithoutModel.Contains("{\"@odata.type\":\"" + "#" + NameSpace + "Person\","), "odata.type Person"); Assert.IsTrue(outputWithoutModel.Contains("{\"@odata.type\":\"" + "#" + NameSpace + "Employee\","), "odata.type Employee"); Assert.IsTrue(outputWithoutModel.Contains("{\"@odata.type\":\"" + "#" + NameSpace + "SpecialEmployee\","), "odata.type SpecialEmployee"); } } }
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.CreateODataFeedWriter(); feedWriter.WriteStart(new ODataFeed() { 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 { DisableMessageStreamDisposal = true, EnableAtom = true }; 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.CreateODataFeedWriter(EntitySet, EntityType) : messageWriter.CreateODataEntryWriter(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.CreateODataFeedWriter(EntitySet, EntityType) : messageWriter.CreateODataEntryWriter(EntitySet, EntityType); action(odataWriter); } } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); if (format == ODataFormat.Atom) { // The <updated> element is computed dynamically, so we remove it from the both the baseline and the actual payload. payload = Regex.Replace(payload, "<updated>[^<]*</updated>", ""); expectedPayload = Regex.Replace(expectedPayload, "<updated>[^<]*</updated>", ""); } Assert.AreEqual(expectedPayload, payload); }
ODataResponse IODataView.CreateView() { var oDataResponse = new ODataResponse(); var messageWriter = new ODataMessageWriter(oDataResponse); var entryWriter = messageWriter.CreateODataFeedWriter(); var feed = new ODataFeed() { Count = Videos.Count, Id = "Hypermedia-Learning" }; var atomFeed = feed.Atom(); atomFeed.Title = "Hypermedia API - " + PageTitle; entryWriter.WriteStart(feed); foreach (var video in Videos) { var oDataEntry = new ODataEntry() {}; var atom = oDataEntry.Atom(); atom.Title = "Video : " + video.Link.Title; atom.Summary = video.Description; entryWriter.WriteStart(oDataEntry); entryWriter.WriteEnd(); } foreach (var item in Community) { var oDataEntry = new ODataEntry() { }; var atom = oDataEntry.Atom(); atom.Title = "Community : " + item.Link.Title; atom.Summary = item.Description; entryWriter.WriteStart(oDataEntry); entryWriter.WriteEnd(); } entryWriter.WriteEnd(); entryWriter.Flush(); oDataResponse.GetStream().Position = 0; return oDataResponse; }
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.CreateODataFeedWriter(); feedWriter.WriteStart(new ODataFeed() { Id = new Uri("http://temp.org/feed"), SerializationInfo = MySerializationInfo }); foreach (var entity in entities) { WriteEntry(feedWriter, entity, projectedProperties); } feedWriter.WriteEnd(); } return(message.GetMessageString()); }
public static Stream CreatePackagesStream(string baseUrl, IInternalPackageRepository packageRepository, string baseAddress, IEnumerable <IInternalPackage> packages, int feedId, int total) { var writerSettings = new ODataMessageWriterSettings() { Indent = true, CheckCharacters = false, BaseUri = new Uri(baseUrl), Version = ODataVersion.V3 }; writerSettings.SetContentType(ODataFormat.Atom); var responseMessage = new MemoryResponseMessage(); var writer = new ODataMessageWriter(responseMessage, writerSettings); var feedWriter = writer.CreateODataFeedWriter(); feedWriter.WriteStart(new ODataFeed() { Id = "Packages", Count = total }); var pks = packages.Select(pk => new ODataPackage(pk)); foreach (var package in pks) { feedWriter.WriteStart(MapPackageToEntry(baseAddress, package)); feedWriter.WriteEnd(); } feedWriter.WriteEnd(); feedWriter.Flush(); var stream = responseMessage.GetStream(); stream.Seek(0, SeekOrigin.Begin); return(stream); }
private bool TryWriteAggregationResult( object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext, IEdmTypeReference feedType) { if (typeof(IEnumerable <DynamicTypeWrapper>).IsAssignableFrom(type)) { IEdmTypeReference elementType = feedType.AsCollection().ElementType(); if (elementType.IsEntity()) { IEdmEntitySetBase entitySet = writeContext.NavigationSource as IEdmEntitySetBase; IEdmEntityTypeReference entityType = elementType.AsEntity(); ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType.EntityDefinition()); WriteObjectInline(graph, feedType, writer, writeContext); return(true); } } return(false); }
/// <summary> /// Writes the entity collection results to the response message. /// </summary> /// <param name="graph">The entity collection results.</param> /// <param name="type">The type of the entities.</param> /// <param name="messageWriter">The message writer.</param> /// <param name="writeContext">The writing context.</param> public override void WriteObject( object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { Ensure.NotNull(messageWriter, "messageWriter"); Ensure.NotNull(writeContext, "writeContext"); IEdmEntitySetBase entitySet = writeContext.NavigationSource as IEdmEntitySetBase; if (entitySet == null) { throw new SerializationException(Resources.EntitySetMissingForSerialization); } EntityCollectionResult collectionResult = (EntityCollectionResult)graph; IEdmTypeReference feedType = collectionResult.EdmType; IEdmEntityTypeReference entityType = GetEntityType(feedType); ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType.EntityDefinition()); this.WriteObjectInline(collectionResult.Query, feedType, writer, writeContext); }
protected void WriteAnnotationsAndValidatePayload(Action<ODataWriter> action, ODataFormat format, string expectedPayload, bool request, bool createFeedWriter) { var writerSettings = new ODataMessageWriterSettings { DisableMessageStreamDisposal = true, EnableAtom = true }; 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.CreateODataFeedWriter(EntitySet, EntityType) : messageWriter.CreateODataEntryWriter(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.CreateODataFeedWriter(EntitySet, EntityType) : messageWriter.CreateODataEntryWriter(EntitySet, EntityType); action(odataWriter); } } stream.Position = 0; string payload = (new StreamReader(stream)).ReadToEnd(); if (format == ODataFormat.Atom) { // The <updated> element is computed dynamically, so we remove it from the both the baseline and the actual payload. payload = Regex.Replace(payload, "<updated>[^<]*</updated>", ""); expectedPayload = Regex.Replace(expectedPayload, "<updated>[^<]*</updated>", ""); } Assert.AreEqual(expectedPayload, payload); }
public static Stream CreatePackagesStream(string baseAddress, IEnumerable <IWebPackage> packages) { var writerSettings = new ODataMessageWriterSettings() { Indent = true, // pretty printing CheckCharacters = false, BaseUri = new Uri("http://localhost:12345"), Version = ODataVersion.V3 }; writerSettings.SetContentType(ODataFormat.Atom); var responseMessage = new MemoryResposneMessage(); var writer = new ODataMessageWriter(responseMessage, writerSettings); var feedWriter = writer.CreateODataFeedWriter(); feedWriter.WriteStart(new ODataFeed() { Id = "Packages" }); foreach (var package in packages) { feedWriter.WriteStart(MapPackageToEntry(baseAddress, package)); feedWriter.WriteEnd(); } feedWriter.WriteEnd(); feedWriter.Flush(); var stream = responseMessage.GetStream(); stream.Seek(0, SeekOrigin.Begin); return(stream); }
/// <summary> /// Writes the entity collection results to the response message. /// </summary> /// <param name="graph">The entity collection results.</param> /// <param name="type">The type of the entities.</param> /// <param name="messageWriter">The message writer.</param> /// <param name="writeContext">The writing context.</param> public override void WriteObject( object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { Ensure.NotNull(messageWriter, "messageWriter"); Ensure.NotNull(writeContext, "writeContext"); IEdmEntitySetBase entitySet = writeContext.NavigationSource as IEdmEntitySetBase; if (entitySet == null) { throw new SerializationException(Resources.EntitySetMissingForSerialization); } EntityCollectionResult collectionResult = (EntityCollectionResult)graph; IEdmTypeReference feedType = collectionResult.EdmType; IEdmEntityTypeReference entityType = GetEntityType(feedType); ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType.EntityDefinition()); this.WriteObjectInline(collectionResult.Query, feedType, writer, writeContext); }
private static void WriteTopLevelFeed(bool enableFullValidation = true) { Console.WriteLine("WriteTopLevelFeed, enableFullValidation:{0}", enableFullValidation); var msg = ODataSamplesUtil.CreateMessage(); var settings = new ODataMessageWriterSettings(BaseSettings) { EnableFullValidation = enableFullValidation }; using (var omw = new ODataMessageWriter((IODataResponseMessage)msg, settings, ExtModel.Model)) { var writer = omw.CreateODataFeedWriter(ExtModel.PetSet); writer.WriteStart(Feed); writer.WriteStart(PetEntry); writer.WriteEnd(); writer.WriteStart(FishEntry); writer.WriteEnd(); writer.WriteEnd(); } Console.WriteLine(ODataSamplesUtil.MessageToString(msg)); }
/// <inheritdoc /> public override void WriteObject(object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { if (messageWriter == null) { throw Error.ArgumentNull("messageWriter"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } IEdmEntitySet entitySet = writeContext.EntitySet; if (entitySet == null) { throw new SerializationException(SRResources.EntitySetMissingDuringSerialization); } IEdmEntityType entityType = EntityType.EntityDefinition(); ODataWriter writer = messageWriter.CreateODataFeedWriter(entitySet, entityType); WriteObjectInline(graph, writer, writeContext); }
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.CreateODataEntryWriter(); var entry = this.CreatePersonEntryWithoutSerializationInfo(); entry.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "Parsen", NavigationSourceEntityTypeName = NameSpace + "Person" }); odataWriter.WriteStart(entry); odataWriter.WriteEnd(); var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream()); Assert.IsTrue(result.Contains("Person(-5)\",\"PersonId\":-5")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // no metadata does not write odata.metadata Assert.IsTrue(result.Contains("$metadata#Parsen/$entity")); } } // wrong EntitySetName for feed responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataFeedWriter(); var feed = this.CreatePersonFeed(); feed.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { 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("Person(-5)\",\"PersonId\":-5")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // no metadata does not write odata.metadata Assert.IsTrue(result.Contains("$metadata#Parsen\"")); } } // wrong collection type name responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataCollectionWriter(); var collctionStart = new ODataCollectionStart() { Name = "BackupContactInfo" }; collctionStart.SetSerializationInfo(new ODataCollectionStartSerializationInfo() { CollectionTypeName = "Collection(" + NameSpace + "ContactDETAIL)" }); odataWriter.WriteStart(collctionStart); odataWriter.WriteItem( WritePayloadHelper.CreatePrimaryContactODataComplexValue()); odataWriter.WriteEnd(); var result = WritePayloadHelper.ReadStreamContent(responseMessageWithoutModel.GetStream()); Assert.IsTrue(result.Contains("value\":[{\"EmailBag\":[")); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { // no metadata does not write odata.metadata Assert.IsTrue(result.Contains("$metadata#Collection(" + NameSpace + "ContactDETAIL)")); } } // 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 string GetWriterOutputForContentTypeAndKnobValue( string contentType, bool autoComputePayloadMetadataInJson, ODataItem[] itemsToWrite, EdmModel edmModel, IEdmEntitySetBase edmEntitySet, EdmEntityType edmEntityType, string selectClause = null, string expandClause = null, string resourcePath = null, bool enableFullValidation = true) { MemoryStream outputStream = new MemoryStream(); IODataResponseMessage message = new InMemoryMessage() { Stream = outputStream }; message.SetHeader("Content-Type", contentType); ODataMessageWriterSettings settings = new ODataMessageWriterSettings() { AutoComputePayloadMetadataInJson = autoComputePayloadMetadataInJson, EnableFullValidation = enableFullValidation }; var result = new ODataQueryOptionParser(edmModel, edmEntityType, edmEntitySet, new Dictionary<string, string> { { "$expand", expandClause }, { "$select", selectClause } }).ParseSelectAndExpand(); ODataUri odataUri = new ODataUri() { ServiceRoot = new Uri("http://example.org/odata.svc"), SelectAndExpand = result }; if (resourcePath != null) { Uri requestUri = new Uri("http://example.org/odata.svc/" + resourcePath); odataUri.RequestUri = requestUri; odataUri.Path = new ODataUriParser(edmModel, new Uri("http://example.org/odata.svc/"), requestUri).ParsePath(); } settings.ODataUri = odataUri; string output; using (var messageWriter = new ODataMessageWriter(message, settings, edmModel)) { int currentIdx = 0; if (itemsToWrite[currentIdx] is ODataFeed) { ODataWriter writer = messageWriter.CreateODataFeedWriter(edmEntitySet, edmEntityType); this.WriteFeed(writer, itemsToWrite, ref currentIdx); } else if (itemsToWrite[currentIdx] is ODataEntry) { ODataWriter writer = messageWriter.CreateODataEntryWriter(edmEntitySet, edmEntityType); this.WriteEntry(writer, itemsToWrite, ref currentIdx); } else { Assert.True(false, "Top level item to write must be entry or feed."); } currentIdx.Should().Be(itemsToWrite.Length, "Invalid list of items to write."); outputStream.Seek(0, SeekOrigin.Begin); output = new StreamReader(outputStream).ReadToEnd(); } return output; }
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.CreateODataEntryWriter(); var entry = this.CreatePersonEntryWithoutSerializationInfo(); var expectedError = mimeType.Contains(MimeTypes.ODataParameterNoMetadata) ? null : "ODataFeedAndEntryTypeContext_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.CreateODataFeedWriter(); var feed = this.CreatePersonFeed(); var entry = this.CreatePersonEntryWithoutSerializationInfo(); entry.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "Person", NavigationSourceEntityTypeName = NameSpace + "Person" }); var expectedError = mimeType.Contains(MimeTypes.ODataParameterNoMetadata) ? null : "ODataFeedAndEntryTypeContext_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.CreateODataEntryWriter(); 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 TestCreateODataFeedWriter_InJsonLight_WithoutEntitySetOrType_Throws() { // Arrange IODataResponseMessage response = CreateResponse(); ODataMessageWriterSettings settings = CreateJsonLightSettings(); IEdmModel model = CreateModel(); using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model)) { // Act & Assert Assert.Throws<ODataException>(() => writer.CreateODataFeedWriter()); } }
public void TestCreateODataFeedWriter_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow() { // Arrange IODataResponseMessage response = CreateResponse(); ODataMessageWriterSettings settings = CreateJsonLightSettings(); IEdmModel model = CreateModel(); IEdmEntitySet entitySet = model.EntityContainers().Single().EntitySets().First(); using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model)) { // Act & Assert Assert.DoesNotThrow(() => writer.CreateODataFeedWriter(entitySet)); } }
private void WriterTestMetaProperties(ODataMessageWriter messageWriter, bool expandNavigationLinks, bool includeSpatial, int entryCount) { #region ODatalib Writer code var writer = messageWriter.CreateODataFeedWriter(TestEntitySet); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product") }); for (int i0 = 0; i0 < entryCount; ++i0) { var entry1 = includeSpatial ? EntryWithSpatialData() : EntryWithoutSpatialData(); writer.WriteStart(entry1); #region Nav Prop Group if (expandNavigationLinks) { #region Nav Prop 1 writer.WriteStart(new ODataNavigationLink { Name = "BillOfMaterials", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/BillOfMaterials") }); for (int i3 = 0; i3 < 10; ++i3) { #region entry 4 var entry4 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "BillOfMaterialsID", Value = 5}, new ODataProperty {Name = "ProductAssemblyID", Value = -1}, new ODataProperty {Name = "ComponentID", Value = 1}, new ODataProperty {Name = "StartDate", Value = DateTimeOffset.Now}, new ODataProperty {Name = "EndDate", Value = null}, new ODataProperty {Name = "UnitMeasureCode", Value = "abc"}, new ODataProperty {Name = "BOMLevel", Value = (short)0}, new ODataProperty {Name = "PerAssemblyQty", Value = Decimal.MinusOne}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; #endregion writer.WriteStart(entry4); writer.WriteEnd(); // entry4 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 2 writer.WriteStart(new ODataNavigationLink { Name = "BillOfMaterials1", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/BillOfMaterials1") }); for (int i6 = 0; i6 < 10; ++i6) { var entry7 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "BillOfMaterialsID", Value = 8}, new ODataProperty {Name = "ProductAssemblyID", Value = 1}, new ODataProperty {Name = "ComponentID", Value = -1}, new ODataProperty {Name = "StartDate", Value = DateTimeOffset.MaxValue}, new ODataProperty {Name = "EndDate", Value = DateTimeOffset.Now}, new ODataProperty {Name = "UnitMeasureCode", Value = "abc"}, new ODataProperty {Name = "BOMLevel", Value = Int16.MaxValue}, new ODataProperty {Name = "PerAssemblyQty", Value = Decimal.MinusOne}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MaxValue}, } }; writer.WriteStart(entry7); writer.WriteEnd(); // entry7 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 3 writer.WriteStart(new ODataNavigationLink { Name = "ProductModel", IsCollection = false, }); var entry9 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductModelID", Value = 10}, new ODataProperty {Name = "Name", Value = "abc123"}, new ODataProperty {Name = "CatalogDescription", Value = "abc123"}, new ODataProperty {Name = "Instructions", Value = "abc123"}, new ODataProperty {Name = "rowguid", Value = Guid.NewGuid()}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; writer.WriteStart(entry9); writer.WriteEnd(); // entry9 writer.WriteEnd(); // nav prop #endregion #region Nav Prop 4 writer.WriteStart(new ODataNavigationLink { Name = "ProductSubcategory", IsCollection = false, }); var entry11 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductSubcategoryID", Value = 12}, new ODataProperty {Name = "ProductCategoryID", Value = 1}, new ODataProperty {Name = "Name", Value = string.Empty}, new ODataProperty {Name = "rowguid", Value = Guid.NewGuid()}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MinValue}, } }; writer.WriteStart(entry11); writer.WriteEnd(); // entry11 writer.WriteEnd(); // nav prop #endregion #region Nav Prop 5 writer.WriteStart(new ODataNavigationLink { Name = "UnitMeasure", IsCollection = false, }); var entry13 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "UnitMeasureCode", Value = "abcdef12345"}, new ODataProperty {Name = "Name", Value = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*"}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; writer.WriteStart(entry13); writer.WriteEnd(); // entry13 writer.WriteEnd(); // nav prop #endregion #region Nav Prop 6 writer.WriteStart(new ODataNavigationLink { Name = "UnitMeasure1", IsCollection = false, }); var entry14 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "UnitMeasureCode", Value = "abcdef12345"}, new ODataProperty {Name = "Name", Value = "abc123"}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MaxValue}, } }; writer.WriteStart(entry14); writer.WriteEnd(); // entry14 writer.WriteEnd(); // nav prop #endregion #region Nav Prop 7 writer.WriteStart(new ODataNavigationLink { Name = "ProductCostHistory", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ProductCostHistory") }); for (int i15 = 0; i15 < 10; ++i15) { var entry16 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductID", Value = 17}, new ODataProperty {Name = "StartDate", Value = DateTimeOffset.Parse("2012-06-08T16:20:53.2388635-07:00")}, new ODataProperty {Name = "EndDate", Value = DateTimeOffset.Now}, new ODataProperty {Name = "StandardCost", Value = Decimal.Zero}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MaxValue}, } }; writer.WriteStart(entry16); writer.WriteEnd(); // entry16 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 8 writer.WriteStart(new ODataNavigationLink { Name = "ProductDocument", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ProductDocument") }); for (int i18 = 0; i18 < 10; ++i18) { var entry19 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductID", Value = 20}, new ODataProperty {Name = "DocumentID", Value = 21}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MinValue}, } }; writer.WriteStart(entry19); writer.WriteEnd(); // entry19 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 9 writer.WriteStart(new ODataNavigationLink { Name = "ProductInventory", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ProductInventory") }); for (int i22 = 0; i22 < 10; ++i22) { var entry23 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductID", Value = 24}, new ODataProperty {Name = "LocationID", Value = (short)25}, new ODataProperty {Name = "Shelf", Value = "abc123"}, new ODataProperty {Name = "Bin", Value = Byte.MinValue}, new ODataProperty {Name = "Quantity", Value = (short)0}, new ODataProperty {Name = "rowguid", Value = Guid.NewGuid()}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; writer.WriteStart(entry23); writer.WriteEnd(); // entry23 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 10 writer.WriteStart(new ODataNavigationLink { Name = "ProductListPriceHistory", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ProductListPriceHistory") }); for (int i26 = 0; i26 < 10; ++i26) { var entry27 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductID", Value = 28}, new ODataProperty {Name = "StartDate", Value = DateTimeOffset.Parse("2012-06-08T16:20:53.2544949-07:00")}, new ODataProperty {Name = "EndDate", Value = DateTimeOffset.MaxValue}, new ODataProperty {Name = "ListPrice", Value = Decimal.Zero}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MinValue}, } }; writer.WriteStart(entry27); writer.WriteEnd(); // entry27 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 11 writer.WriteStart(new ODataNavigationLink { Name = "ProductProductPhoto", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ProductProductPhoto") }); for (int i29 = 0; i29 < 10; ++i29) { var entry30 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductID", Value = 31}, new ODataProperty {Name = "ProductPhotoID", Value = 32}, new ODataProperty {Name = "Primary", Value = false}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; writer.WriteStart(entry30); writer.WriteEnd(); // entry30 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 12 writer.WriteStart(new ODataNavigationLink { Name = "ProductReview", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ProductReview") }); for (int i33 = 0; i33 < 10; ++i33) { var entry34 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductReviewID", Value = 35}, new ODataProperty {Name = "ProductID", Value = Int32.MaxValue}, new ODataProperty {Name = "ReviewerName", Value = string.Empty}, new ODataProperty {Name = "ReviewDate", Value = DateTimeOffset.MinValue}, new ODataProperty {Name = "EmailAddress", Value = string.Empty}, new ODataProperty {Name = "Rating", Value = 0}, new ODataProperty {Name = "Comments", Value = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*"}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MinValue}, } }; writer.WriteStart(entry34); writer.WriteEnd(); // entry34 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 13 writer.WriteStart(new ODataNavigationLink { Name = "ProductVendor", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ProductVendor") }); for (int i36 = 0; i36 < 10; ++i36) { var entry37 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ProductID", Value = 38}, new ODataProperty {Name = "VendorID", Value = 39}, new ODataProperty {Name = "AverageLeadTime", Value = Int32.MinValue}, new ODataProperty {Name = "StandardPrice", Value = Decimal.MinValue}, new ODataProperty {Name = "LastReceiptCost", Value = Decimal.MinValue}, new ODataProperty {Name = "LastReceiptDate", Value = DateTimeOffset.MaxValue}, new ODataProperty {Name = "MinOrderQty", Value = 0}, new ODataProperty {Name = "MaxOrderQty", Value = 1}, new ODataProperty {Name = "OnOrderQty", Value = 1}, new ODataProperty {Name = "UnitMeasureCode", Value = string.Empty}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MinValue}, } }; writer.WriteStart(entry37); writer.WriteEnd(); // entry37 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 14 writer.WriteStart(new ODataNavigationLink { Name = "PurchaseOrderDetail", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/PurchaseOrderDetail") }); for (int i40 = 0; i40 < 10; ++i40) { var entry41 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "PurchaseOrderID", Value = 42}, new ODataProperty {Name = "PurchaseOrderDetailID", Value = 43}, new ODataProperty {Name = "DueDate", Value = DateTimeOffset.Now}, new ODataProperty {Name = "OrderQty", Value = (short)0}, new ODataProperty {Name = "ProductID", Value = Int32.MaxValue}, new ODataProperty {Name = "UnitPrice", Value = Decimal.Zero}, new ODataProperty {Name = "LineTotal", Value = Decimal.MinValue}, new ODataProperty {Name = "ReceivedQty", Value = 123.456m}, new ODataProperty {Name = "RejectedQty", Value = 123.456m}, new ODataProperty {Name = "StockedQty", Value = Decimal.MaxValue}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; writer.WriteStart(entry41); writer.WriteEnd(); // entry41 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 15 writer.WriteStart(new ODataNavigationLink { Name = "ShoppingCartItem", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/ShoppingCartItem") }); for (int i44 = 0; i44 < 10; ++i44) { var entry45 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ShoppingCartItemID", Value = 46}, new ODataProperty {Name = "ShoppingCartID", Value = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*"}, new ODataProperty {Name = "Quantity", Value = -1}, new ODataProperty {Name = "ProductID", Value = 0}, new ODataProperty {Name = "DateCreated", Value = DateTimeOffset.Now}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; writer.WriteStart(entry45); writer.WriteEnd(); // entry45 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion Nav Prop 16 #region Nav Prop 16 writer.WriteStart(new ODataNavigationLink { Name = "SpecialOfferProduct", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/SpecialOfferProduct") }); for (int i47 = 0; i47 < 10; ++i47) { var entry48 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "SpecialOfferID", Value = 49}, new ODataProperty {Name = "ProductID", Value = 50}, new ODataProperty {Name = "rowguid", Value = Guid.NewGuid()}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MinValue}, } }; writer.WriteStart(entry48); writer.WriteEnd(); // entry48 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 17 writer.WriteStart(new ODataNavigationLink { Name = "TransactionHistory", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/TransactionHistory") }); for (int i51 = 0; i51 < 10; ++i51) { var entry52 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "TransactionID", Value = 53}, new ODataProperty {Name = "ProductID", Value = -1}, new ODataProperty {Name = "ReferenceOrderID", Value = Int32.MaxValue}, new ODataProperty {Name = "ReferenceOrderLineID", Value = 1}, new ODataProperty {Name = "TransactionDate", Value = DateTimeOffset.MinValue}, new ODataProperty {Name = "TransactionType", Value = "a"}, new ODataProperty {Name = "Quantity", Value = Int32.MinValue}, new ODataProperty {Name = "ActualCost", Value = Decimal.MaxValue}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.MinValue}, } }; writer.WriteStart(entry52); writer.WriteEnd(); // entry52 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion #region Nav Prop 18 writer.WriteStart(new ODataNavigationLink { Name = "WorkOrder", IsCollection = true, }); writer.WriteStart(new ODataFeed { Id = new Uri("http://www.odata.org/Perf.svc/Product(2)/WorkOrder") }); for (int i54 = 0; i54 < 10; ++i54) { var entry55 = new ODataEntry { Properties = new[] { new ODataProperty {Name = "WorkOrderID", Value = 56}, new ODataProperty {Name = "ProductID", Value = Int32.MinValue}, new ODataProperty {Name = "OrderQty", Value = 1}, new ODataProperty {Name = "StockedQty", Value = -1}, new ODataProperty {Name = "ScrappedQty", Value = (short)1}, new ODataProperty {Name = "StartDate", Value = DateTimeOffset.MaxValue}, new ODataProperty {Name = "EndDate", Value = DateTimeOffset.Now}, new ODataProperty {Name = "DueDate", Value = DateTimeOffset.MinValue}, new ODataProperty {Name = "ScrapReasonID", Value = Int16.MaxValue}, new ODataProperty {Name = "ModifiedDate", Value = DateTimeOffset.Now}, } }; writer.WriteStart(entry55); writer.WriteEnd(); // entry55 } writer.WriteEnd(); // feed writer.WriteEnd(); // nav prop #endregion } #endregion writer.WriteEnd(); // entry1 } writer.WriteEnd(); // feed writer.Flush(); #endregion }
private ODataWriter CreateODataFeedWriter(ODataMessageWriter messageWriter, IEdmEntitySet entitySet, IEdmEntityType entityType, bool hasModel) { if (hasModel) { return messageWriter.CreateODataFeedWriter(entitySet, entityType); } else { return messageWriter.CreateODataFeedWriter(); } }
public static void FeedWriteReadNormal() { ODataFeed Feed = new ODataFeed(); Feed.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "Mails", NavigationSourceEntityTypeName = "NS.Mail", NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet }); ODataEntry Entry = new ODataEntry() { Properties = new[] { new ODataProperty() { Name = "Id", Value = 2 }, }, EditLink = new Uri("http://example/Web/Users(3)"), }; Entry.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "MyLogin", NavigationSourceEntityTypeName = "NS.Person", NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet }); // Parse the full request Uri ODataPath path = new ODataUriParser( CraftModel.Model, new Uri("http://example.org/svc/"), new Uri("http://example.org/svc/MyLogin/Mails")).ParsePath(); // Alternatively, construct the normal path for the contained entity manually. //ODataPath path = new ODataPath( // new ODataPathSegment[] // { // new SingletonSegment(CraftModel.MyLogin), new NavigationPropertySegment(CraftModel.MailBox, CraftModel.MyLogin) // }); var stream = new MemoryStream(); var wsetting = new ODataMessageWriterSettings() { DisableMessageStreamDisposal = true, ODataUri = new ODataUri() { ServiceRoot = new Uri("http://example.org/svc/"), Path = path } }; IODataResponseMessage msg = new Message() { Stream = stream, }; var omw = new ODataMessageWriter(msg, wsetting); var writer = omw.CreateODataFeedWriter(); writer.WriteStart(Feed); writer.WriteStart(Entry); writer.WriteEnd(); writer.WriteEnd(); stream.Seek(0, SeekOrigin.Begin); var payload = new StreamReader(stream).ReadToEnd(); // {"@odata.context":"http://example.org/svc/$metadata#Web/Items","value":[{"@odata.editLink":"http://example/Web/Users(3)","Id":2}]} Console.WriteLine(payload); //Read ODataEntry entry = null; stream.Seek(0, SeekOrigin.Begin); var rsetting = new ODataMessageReaderSettings(); var omr = new ODataMessageReader(msg, rsetting, CraftModel.Model); var reader = omr.CreateODataFeedReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entry = (ODataEntry)reader.Item; break; } } //Id=2 foreach (var prop in entry.Properties) { Console.WriteLine("{0}={1}", prop.Name, prop.Value); } }
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 { DisableMessageStreamDisposal = true }; 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.CreateODataFeedWriter(); // Create customers feed with serializtion info to write odata.metadata. var customersFeed = new ODataFeed(); customersFeed.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo { 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 ODataEntry { 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 ODataEntry should be sufficient for the 5.5 release. var navigationLink = new ODataNavigationLink { Name = "MostRecentOrder", IsCollection = false, Url = new Uri("MostRecentOrder", UriKind.Relative) }; odataWriter.WriteStart(navigationLink); // Write the most recent customer. { var mostRecentOrder = new ODataEntry { TypeName = "NS.Order" }; // Add serialization info so we can computer links. mostRecentOrder.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo { 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); }
/// <summary> /// Creates an OData feed response containing a list of entries for a particular type of entity /// </summary> /// <param name="resultsGraph">The RDF graph containing the SPARQL results</param> /// <param name="entityType">The fully qualified domain name for the type of entity to be written</param> /// <param name="resultsCount">The count of the total number of results that the server can provide</param> /// <param name="originalQueryModel">The SPARQL query that was executed to generate this graph</param> public void CreateFeedFromGraph(IGraph resultsGraph, string entityType, int resultsCount, SparqlModel originalQueryModel = null) { var msgWriter = new ODataMessageWriter(_response, _writerSettings, _map.Model); var feedWriter = msgWriter.CreateODataFeedWriter(); var entries = new List<ODataEntry>(); var typeUri = _map.GetUriForType(entityType); if (!String.IsNullOrEmpty(typeUri)) { var predNode = resultsGraph.CreateUriNode(UriFactory.Create(RdfConstants.RdfType)); var objNode = resultsGraph.CreateUriNode(UriFactory.Create(typeUri)); if (originalQueryModel == null || originalQueryModel.Ordering == null) { // No sorting required, just iterate all instances foreach (var instanceTriple in resultsGraph.GetTriplesWithPredicateObject(predNode, objNode)) { var instanceUri = (instanceTriple.Subject as IUriNode).Uri; entries.Add(CreateODataEntry(resultsGraph, instanceUri.ToString(), entityType)); } } else { // We need to apply the same sort criteria to this graph to ensure // that the ODATA results are properly sorted. // NOTE: This will only work if all the properties used in the original query // are present in the graph - this could be a problem with more complex traversals // and the query may instead need to be rewritten / regenerated to extract only // the required sort properties. originalQueryModel.IsDescribe = false; var resultsTable = resultsGraph.ExecuteQuery(originalQueryModel.GetSparqlRepresentation()) as SparqlResultSet; var targetVariable= originalQueryModel.SelectVariables[0]; foreach (var result in resultsTable.Results) { var instanceUriNode = result[targetVariable] as IUriNode; if (instanceUriNode != null) { entries.Add(CreateODataEntry(resultsGraph, instanceUriNode.Uri.ToString(), entityType)); } } } } var feed = new ODataFeed {Id = _baseUri + _map.GetTypeSet(entityType)}; if (_writerSettings.Version >= ODataVersion.V2) { feed.Count = resultsCount; } if (originalQueryModel != null) { feed.NextPageLink = GetNextPageLink(originalQueryModel); } feedWriter.WriteStart(feed); foreach (var entry in entries) { feedWriter.WriteStart(entry); feedWriter.WriteEnd(); } feedWriter.WriteEnd(); feedWriter.Flush(); }
public void TestCreateODataFeedWriter_InJsonLight_WithEntitySetButWithoutType_DoesNotThrow() { // Arrange IODataResponseMessage response = CreateResponse(); ODataMessageWriterSettings settings = CreateJsonLightSettings(); IEdmModel model = CreateModel(); IEdmEntitySet entitySet = model.EntityContainers().Single().EntitySets().First(); using (ODataMessageWriter writer = new ODataMessageWriter(response, settings, model)) { // Act writer.CreateODataFeedWriter(entitySet); // No assert (just ensuring this kind of call does not throw). } }
public void ProcessRequest(HttpContext context) { if (!HttpContext.Current.Request.IsAuthenticated) { HttpContext.Current.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = HttpContext.Current.Request.FilePath }, "OAuth2Bearer"); return; } MSRAHttpResponseMessage message = new MSRAHttpResponseMessage(this.ContextBase.Response); message.StatusCode = 200; message.SetHeader(ODataConstants.ContentTypeHeader, "application/json"); // create the writer, indent for readability ODataMessageWriterSettings messageWriterSettings = new ODataMessageWriterSettings() { Indent = true, CheckCharacters = false, BaseUri = context.Request.Url }; messageWriterSettings.SetContentType(ODataFormat.Json); messageWriterSettings.SetMetadataDocumentUri(new Uri("http://localhost:31435/odata/MSRAQuery/$metadata")); if (string.IsNullOrEmpty(QueryId)) { AzureTestDBEntities db = new AzureTestDBEntities(); var queries = db.MsrRecurringQueries.ToList().Take(1); ODataWorkspace workSpace = new ODataWorkspace(); var collections = new List<ODataResourceCollectionInfo>(); foreach (MsrRecurringQuery recurringQuery in queries) { ODataResourceCollectionInfo collectionInfo = new ODataResourceCollectionInfo() { Name = "MsrRecurringQueries", Url = new Uri(context.Request.Url+"data/" + recurringQuery.RecurringQueryID.ToString(), UriKind.Absolute) }; collectionInfo.SetAnnotation<AtomResourceCollectionMetadata>(new AtomResourceCollectionMetadata() { Title = new AtomTextConstruct() { Text = "MsrRecurringQueries"//recurringQuery.RecurringQueryName }, }); collections.Add(collectionInfo); } workSpace.Collections = collections.AsEnumerable<ODataResourceCollectionInfo>(); using (ODataMessageWriter messageWriter = new ODataMessageWriter(message, messageWriterSettings)) { messageWriter.WriteServiceDocumentAsync(workSpace); } } else { EdmModel mainModel =(EdmModel) QueryMetadataHttpHandler.BuildODataModel(); using (ODataMessageWriter messageWriter = new ODataMessageWriter(message, messageWriterSettings, mainModel)) { var msrRecurringQueryResultType = new EdmEntityType("mainNS", "MsrRecurringQuery", null); IEdmPrimitiveType edmPrimitiveType1 = new MSRAEdmPrimitiveType("Int32", "Edm", EdmPrimitiveTypeKind.Int32, EdmSchemaElementKind.TypeDefinition, EdmTypeKind.Primitive); IEdmPrimitiveType edmPrimitiveType2 = new MSRAEdmPrimitiveType("String", "Edm", EdmPrimitiveTypeKind.String, EdmSchemaElementKind.TypeDefinition, EdmTypeKind.Primitive); IEdmPrimitiveType edmPrimitiveType3 = new MSRAEdmPrimitiveType("String", "Edm", EdmPrimitiveTypeKind.String, EdmSchemaElementKind.TypeDefinition, EdmTypeKind.Primitive); IEdmPrimitiveType edmPrimitiveType4 = new MSRAEdmPrimitiveType("String", "Edm", EdmPrimitiveTypeKind.String, EdmSchemaElementKind.TypeDefinition, EdmTypeKind.Primitive); IEdmPrimitiveType edmPrimitiveType5 = new MSRAEdmPrimitiveType("String", "Edm", EdmPrimitiveTypeKind.String, EdmSchemaElementKind.TypeDefinition, EdmTypeKind.Primitive); IEdmPrimitiveType edmPrimitiveType6 = new MSRAEdmPrimitiveType("Decimal", "Edm", EdmPrimitiveTypeKind.Decimal, EdmSchemaElementKind.TypeDefinition, EdmTypeKind.Primitive); msrRecurringQueryResultType.AddKeys(new EdmStructuralProperty(msrRecurringQueryResultType, "RowId", new EdmPrimitiveTypeReference(edmPrimitiveType1, false))); msrRecurringQueryResultType.AddProperty(new EdmStructuralProperty(msrRecurringQueryResultType, "RowId", new EdmPrimitiveTypeReference(edmPrimitiveType1, false))); msrRecurringQueryResultType.AddProperty(new EdmStructuralProperty(msrRecurringQueryResultType, "Pricing_Level", new EdmPrimitiveTypeReference(edmPrimitiveType2, false))); msrRecurringQueryResultType.AddProperty(new EdmStructuralProperty(msrRecurringQueryResultType, "Business_Summary", new EdmPrimitiveTypeReference(edmPrimitiveType3, false))); msrRecurringQueryResultType.AddProperty(new EdmStructuralProperty(msrRecurringQueryResultType, "Future_Flag", new EdmPrimitiveTypeReference(edmPrimitiveType4, false))); msrRecurringQueryResultType.AddProperty(new EdmStructuralProperty(msrRecurringQueryResultType, "Fiscal_Month", new EdmPrimitiveTypeReference(edmPrimitiveType5, false))); msrRecurringQueryResultType.AddProperty(new EdmStructuralProperty(msrRecurringQueryResultType, "MS_Sales_Amount_Const", new EdmPrimitiveTypeReference(edmPrimitiveType6, false))); ODataWriter feedWriter = messageWriter.CreateODataFeedWriter( mainModel.EntityContainers().Select(c => c.EntitySets().First()).First(), msrRecurringQueryResultType); ODataFeed feed = new ODataFeed() { Id = "MsrRecurringQueries", }; feedWriter.WriteStart(feed); AzureTestDBEntities db = new AzureTestDBEntities(); var queries = db.T_annooli_231161891 ; foreach (var recurringQuery in queries) { ODataEntry entry = this.GetODataEntry(recurringQuery); feedWriter.WriteStart(entry); feedWriter.WriteEnd(); } feedWriter.WriteEnd(); } } }
private static void CsvWriterDemo() { EdmEntityType customer = new EdmEntityType("ns", "customer"); var key = customer.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32); customer.AddKeys(key); customer.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String); ODataEntry entry1 = new ODataEntry() { Properties = new[] { new ODataProperty() { Name = "Id", Value = 51 }, new ODataProperty() { Name = "Name", Value = "Name_A" }, } }; ODataEntry entry2 = new ODataEntry() { Properties = new[] { new ODataProperty() { Name = "Id", Value = 52 }, new ODataProperty() { Name = "Name", Value = "Name_B" }, } }; var stream = new MemoryStream(); var message = new Message { Stream = stream }; // Set Content-Type header value message.SetHeader("Content-Type", "text/csv"); var settings = new ODataMessageWriterSettings { // Set our resolver here. MediaTypeResolver = CsvMediaTypeResolver.Instance, DisableMessageStreamDisposal = true, }; using (var messageWriter = new ODataMessageWriter(message, settings)) { var writer = messageWriter.CreateODataFeedWriter(null, customer); writer.WriteStart(new ODataFeed()); writer.WriteStart(entry1); writer.WriteEnd(); writer.WriteStart(entry2); writer.WriteEnd(); writer.WriteEnd(); writer.Flush(); } stream.Seek(0, SeekOrigin.Begin); string msg; using (var sr = new StreamReader(stream)) { msg = sr.ReadToEnd(); } Console.WriteLine(msg); }
private static void WriteTopLevelFeed(bool enableFullValidation = true) { Console.WriteLine("WriteTopLevelFeed, enableFullValidation:{0}", enableFullValidation); var msg = ODataSamplesUtil.CreateMessage(); var settings = new ODataMessageWriterSettings(BaseSettings) { ODataUri = new ODataUri() { ServiceRoot = ServiceRoot }, EnableFullValidation = enableFullValidation }; using (var omw = new ODataMessageWriter((IODataResponseMessage)msg, settings, ExtModel.Model)) { var writer = omw.CreateODataFeedWriter(ExtModel.PetSet); writer.WriteStart(Feed); writer.WriteStart(PetEntry); writer.WriteEnd(); writer.WriteStart(FishEntry); writer.WriteEnd(); writer.WriteEnd(); } Console.WriteLine(ODataSamplesUtil.MessageToString(msg)); }
/// <summary> /// Creates an OData feed response containing a list of entries for a particular type of entity /// </summary> /// <param name="resultsGraph">The RDF graph containing the SPARQL results</param> /// <param name="entityType">The fully qualified domain name for the type of entity to be written</param> /// <param name="resultsCount">The count of the total number of results that the server can provide</param> /// <param name="originalQueryModel">The SPARQL query that was executed to generate this graph</param> public void CreateFeedFromGraph(IGraph resultsGraph, string entityType, int resultsCount, SparqlModel originalQueryModel = null) { var msgWriter = new ODataMessageWriter(_response, _writerSettings, _map.Model); var feedWriter = msgWriter.CreateODataFeedWriter(); var entries = new List <ODataEntry>(); var typeUri = _map.GetUriForType(entityType); if (!String.IsNullOrEmpty(typeUri)) { var predNode = resultsGraph.CreateUriNode(UriFactory.Create(RdfConstants.RdfType)); var objNode = resultsGraph.CreateUriNode(UriFactory.Create(typeUri)); if (originalQueryModel == null || originalQueryModel.Ordering == null) { // No sorting required, just iterate all instances foreach (var instanceTriple in resultsGraph.GetTriplesWithPredicateObject(predNode, objNode)) { var instanceUri = (instanceTriple.Subject as IUriNode).Uri; entries.Add(CreateODataEntry(resultsGraph, instanceUri.ToString(), entityType)); } } else { // We need to apply the same sort criteria to this graph to ensure // that the ODATA results are properly sorted. // NOTE: This will only work if all the properties used in the original query // are present in the graph - this could be a problem with more complex traversals // and the query may instead need to be rewritten / regenerated to extract only // the required sort properties. originalQueryModel.IsDescribe = false; var resultsTable = resultsGraph.ExecuteQuery(originalQueryModel.GetSparqlRepresentation()) as SparqlResultSet; var targetVariable = originalQueryModel.SelectVariables[0]; foreach (var result in resultsTable.Results) { var instanceUriNode = result[targetVariable] as IUriNode; if (instanceUriNode != null) { entries.Add(CreateODataEntry(resultsGraph, instanceUriNode.Uri.ToString(), entityType)); } } } } var feed = new ODataFeed { Id = _baseUri + _map.GetTypeSet(entityType) }; if (_writerSettings.Version >= ODataVersion.V2) { feed.Count = resultsCount; } if (originalQueryModel != null) { feed.NextPageLink = GetNextPageLink(originalQueryModel); } feedWriter.WriteStart(feed); foreach (var entry in entries) { feedWriter.WriteStart(entry); feedWriter.WriteEnd(); } feedWriter.WriteEnd(); feedWriter.Flush(); }
public static void FeedWriteReadNormal() { Console.WriteLine("FeedWriteReadNormal"); ODataFeed Feed = new ODataFeed(); Feed.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "Mails", NavigationSourceEntityTypeName = "NS.Mail", NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet }); ODataEntry Entry = new ODataEntry() { Properties = new[] { new ODataProperty() {Name = "Id", Value = 2}, }, EditLink = new Uri("http://example/Web/Users(3)"), }; Entry.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceName = "MyLogin", NavigationSourceEntityTypeName = "NS.Person", NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet }); // Parse the full request Uri ODataPath path = new ODataUriParser( CraftModel.Model, new Uri("http://example.org/svc/"), new Uri("http://example.org/svc/MyLogin/Mails")).ParsePath(); // Alternatively, construct the normal path for the contained entity manually. //ODataPath path = new ODataPath( // new ODataPathSegment[] // { // new SingletonSegment(CraftModel.MyLogin), new NavigationPropertySegment(CraftModel.MailBox, CraftModel.MyLogin) // }); var stream = new MemoryStream(); var wsetting = new ODataMessageWriterSettings() { DisableMessageStreamDisposal = true, ODataUri = new ODataUri() { ServiceRoot = new Uri("http://example.org/svc/"), Path = path } }; IODataResponseMessage msg = new Message() { Stream = stream, }; var omw = new ODataMessageWriter(msg, wsetting); var writer = omw.CreateODataFeedWriter(); writer.WriteStart(Feed); writer.WriteStart(Entry); writer.WriteEnd(); writer.WriteEnd(); stream.Seek(0, SeekOrigin.Begin); var payload = new StreamReader(stream).ReadToEnd(); // {"@odata.context":"http://example.org/svc/$metadata#Web/Items","value":[{"@odata.editLink":"http://example/Web/Users(3)","Id":2}]} Console.WriteLine(payload); //Read ODataEntry entry = null; stream.Seek(0, SeekOrigin.Begin); var rsetting = new ODataMessageReaderSettings(); var omr = new ODataMessageReader(msg, rsetting, CraftModel.Model); var reader = omr.CreateODataFeedReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { entry = (ODataEntry)reader.Item; break; } } //Id=2 foreach (var prop in entry.Properties) { Console.WriteLine("{0}={1}", prop.Name, prop.Value); } }
private static void WriteCustomInstanceAnnotationToFeedAndEntry(string expectedPayload, ODataFormat format) { var writerSettings = new ODataMessageWriterSettings { DisableMessageStreamDisposal = true, EnableAtom = format == ODataFormat.Atom }; 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.CreateODataFeedWriter(EntitySet, EntityType); // Add instance annotations to the feed. var feedToWrite = new ODataFeed { 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 ODataEntry { Properties = new[] { new ODataProperty { Name = "ID", Value = 1 } } }; entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("Custom.ComplexAnnotation", ComplexValue1)); entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("ShouldSkip.ComplexAnnotation", ComplexValue1)); // 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(); if (format == ODataFormat.Atom) { // The <updated> element is computed dynamically, so we remove it from the both the baseline and the actual payload. payload = Regex.Replace(payload, "<updated>[^<]*</updated>", ""); expectedPayload = Regex.Replace(expectedPayload, "<updated>[^<]*</updated>", ""); } payload.Should().Be(expectedPayload); }
private static void WriteCustomInstanceAnnotationToFeedAndEntry(string expectedPayload, ODataFormat format) { var writerSettings = new ODataMessageWriterSettings { DisableMessageStreamDisposal = true, EnableAtom = format == ODataFormat.Atom }; 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.CreateODataFeedWriter(EntitySet, EntityType); // Add instance annotations to the feed. var feedToWrite = new ODataFeed { 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 ODataEntry { Properties = new[] { new ODataProperty { Name = "ID", Value = 1 } } }; entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("Custom.ComplexAnnotation", ComplexValue1)); entryToWrite.InstanceAnnotations.Add(new ODataInstanceAnnotation("ShouldSkip.ComplexAnnotation", ComplexValue1)); // 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(); if (format == ODataFormat.Atom) { // The <updated> element is computed dynamically, so we remove it from the both the baseline and the actual payload. payload = Regex.Replace(payload, "<updated>[^<]*</updated>", ""); expectedPayload = Regex.Replace(expectedPayload, "<updated>[^<]*</updated>", ""); } payload.Should().Be(expectedPayload); }
public void PersonFeedTest() { foreach (var mimeType in this.mimeTypes) { var settings = new ODataMessageWriterSettings() { PayloadBaseUri = this.ServiceUri }; settings.ODataUri = new ODataUri() { ServiceRoot = this.ServiceUri }; string outputWithModel = null; string outputWithoutModel = null; var responseMessageWithModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithModel, settings, WritePayloadHelper.Model)) { var odataWriter = messageWriter.CreateODataFeedWriter(WritePayloadHelper.PersonSet, WritePayloadHelper.PersonType); outputWithModel = this.WriteAndVerifyPersonFeed(responseMessageWithModel, odataWriter, true, mimeType); } var responseMessageWithoutModel = new StreamResponseMessage(new MemoryStream()); responseMessageWithoutModel.SetHeader("Content-Type", mimeType); using (var messageWriter = new ODataMessageWriter(responseMessageWithoutModel, settings)) { var odataWriter = messageWriter.CreateODataFeedWriter(); outputWithoutModel = this.WriteAndVerifyPersonFeed(responseMessageWithoutModel, odataWriter, false, mimeType); } WritePayloadHelper.VerifyPayloadString(outputWithModel, outputWithoutModel, mimeType); if (mimeType.Contains(MimeTypes.ODataParameterMinimalMetadata) || mimeType.Contains(MimeTypes.ODataParameterFullMetadata)) { Assert.IsTrue(outputWithoutModel.Contains(this.ServiceUri + "$metadata#Person\"")); } if (mimeType.Contains(MimeTypes.ApplicationJsonLight)) { // odata.type is included in json light payload only if entry typename is different than serialization info Assert.IsFalse(outputWithoutModel.Contains("{\"@odata.type\":\"" + "#" + NameSpace + "Person\","), "odata.type Person"); Assert.IsTrue(outputWithoutModel.Contains("{\"@odata.type\":\"" + "#" + NameSpace + "Employee\","), "odata.type Employee"); Assert.IsTrue(outputWithoutModel.Contains("{\"@odata.type\":\"" + "#" + NameSpace + "SpecialEmployee\","), "odata.type SpecialEmployee"); } } }
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 { DisableMessageStreamDisposal = true }; 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.CreateODataFeedWriter(); // Create customers feed with serializtion info to write odata.metadata. var customersFeed = new ODataFeed(); customersFeed.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo { 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 ODataEntry { 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 ODataEntry should be sufficient for the 5.5 release. var navigationLink = new ODataNavigationLink { Name = "MostRecentOrder", IsCollection = false, Url = new Uri("MostRecentOrder", UriKind.Relative) }; odataWriter.WriteStart(navigationLink); // Write the most recent customer. { var mostRecentOrder = new ODataEntry { TypeName = "NS.Order" }; // Add serialization info so we can computer links. mostRecentOrder.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo { 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); }