Esempio n. 1
0
 private ODataWriter CreateODataFeedWriter(ODataMessageWriter messageWriter, IEdmEntitySet entitySet, IEdmEntityType entityType, bool hasModel)
 {
     if (hasModel)
     {
         return(messageWriter.CreateODataFeedWriter(entitySet, entityType));
     }
     else
     {
         return(messageWriter.CreateODataFeedWriter());
     }
 }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        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();
        }
Esempio n. 10
0
        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();
        }
Esempio n. 13
0
        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();
            }
        }
Esempio n. 14
0
        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());
            }
        }
Esempio n. 16
0
        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();
            }
        }
Esempio n. 17
0
        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());
        }
Esempio n. 23
0
        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);
        }
Esempio n. 24
0
        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);
        }
Esempio n. 27
0
        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);
        }
Esempio n. 28
0
        /// <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);
        }
Esempio n. 29
0
        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);
        }
Esempio n. 31
0
        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;
        }
Esempio n. 33
0
        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));
            }
        }
Esempio n. 36
0
        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();
     }
 }
Esempio n. 38
0
        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);
        }
Esempio n. 40
0
        /// <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();
                }
            }
        }
Esempio n. 43
0
        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);
        }
Esempio n. 44
0
        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));
        }
Esempio n. 45
0
        /// <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();
        }
Esempio n. 46
0
        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);
            }
        }
Esempio n. 47
0
        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);
        }