/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } IEdmNavigationProperty navigationProperty = GetNavigationProperty(readContext.Path); if (navigationProperty == null) { throw new SerializationException(SRResources.NavigationPropertyMissingDuringDeserialization); } ODataEntityReferenceLink entityReferenceLink = messageReader.ReadEntityReferenceLink(navigationProperty); if (entityReferenceLink != null) { return ResolveContentId(entityReferenceLink.Url, readContext); } return null; }
private string WriteAndVerifySingleLink(StreamResponseMessage responseMessage, ODataMessageWriter messageWriter, string mimeType) { var link = new ODataEntityReferenceLink() { Url = new Uri(this.ServiceUri + "Order(-10)") }; messageWriter.WriteEntityReferenceLink(link); var stream = responseMessage.GetStream(); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { stream.Seek(0, SeekOrigin.Begin); var settings = new ODataMessageReaderSettings() { BaseUri = this.ServiceUri }; ODataMessageReader messageReader = new ODataMessageReader(responseMessage, settings, WritePayloadHelper.Model); ODataEntityReferenceLink linkRead = messageReader.ReadEntityReferenceLink(); Assert.IsTrue(linkRead.Url.AbsoluteUri.Contains("Order(-10)"), "linkRead.Url"); } return(WritePayloadHelper.ReadStreamContent(stream)); }
/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } IEdmNavigationProperty navigationProperty = GetNavigationProperty(readContext.Path); if (navigationProperty == null) { throw new SerializationException(SRResources.NavigationPropertyMissingDuringDeserialization); } ODataEntityReferenceLink entityReferenceLink = messageReader.ReadEntityReferenceLink(navigationProperty); if (entityReferenceLink != null) { return(ResolveContentId(entityReferenceLink.Url, readContext)); } return(null); }
public ODataEntityReferenceLink QueryReferenceLink(string uri, string mimeType) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = baseUri }; var queryRequestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + uri, UriKind.Absolute)); queryRequestMessage.SetHeader("Accept", mimeType); queryRequestMessage.SetHeader("Prefer", string.Format("{0}={1}", IncludeAnnotation, "*")); var queryResponseMessage = queryRequestMessage.GetResponse(); Assert.AreEqual(200, queryResponseMessage.StatusCode); ODataEntityReferenceLink item = null; if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(queryResponseMessage, readerSettings, model)) { item = messageReader.ReadEntityReferenceLink(); } } return(item); }
private void ProcessUpdateEntityReference(IODataRequestMessage requestMessage, IODataResponseMessage responseMessage, ODataPath odataPath) { // This is for change the reference in single-valued navigation property // PUT ~/Person(0)/Parent/$ref // { // "@odata.context": "http://host/service/$metadata#$ref", // "@odata.id": "Orders(10643)" // } if (this.HttpMethod == HttpMethod.PATCH) { throw Utility.BuildException(HttpStatusCode.MethodNotAllowed, "PATCH on a reference link is not supported.", null); } // Get the parent first var level = this.QueryContext.QueryPath.Count - 2; var parent = this.QueryContext.ResolveQuery(this.DataSource, level); var navigationPropertyName = ((NavigationPropertyLinkSegment)odataPath.LastSegment).NavigationProperty.Name; using (var messageReader = new ODataMessageReader(requestMessage, this.GetReaderSettings(), this.DataSource.Model)) { var referenceLink = messageReader.ReadEntityReferenceLink(); var queryContext = new QueryContext(this.ServiceRootUri, referenceLink.Url, this.DataSource.Model); var target = queryContext.ResolveQuery(this.DataSource); this.DataSource.UpdateProvider.UpdateLink(parent, navigationPropertyName, target); this.DataSource.UpdateProvider.SaveChanges(); } ResponseWriter.WriteEmptyResponse(responseMessage); }
private void ProcessUpdateEntityReference(IODataRequestMessage requestMessage, IODataResponseMessage responseMessage, ODataPath odataPath) { // This is for change the reference in single-valued navigation property // PUT ~/Person(0)/Parent/$ref // { // "@odata.context": "http://host/service/$metadata#$ref", // "@odata.id": "Orders(10643)" // } if (this.HttpMethod == HttpMethod.PATCH) { throw Utility.BuildException(HttpStatusCode.MethodNotAllowed, "PATCH on a reference link is not supported.", null); } // Get the parent first var level = this.QueryContext.QueryPath.Count - 2; var parent = this.QueryContext.ResolveQuery(this.DataSource, level); var navigationPropertyName = ((NavigationPropertyLinkSegment)odataPath.LastSegment).NavigationProperty.Name; using (var messageReader = new ODataMessageReader(requestMessage, this.GetReaderSettings())) { var referenceLink = messageReader.ReadEntityReferenceLink(); var queryContext = new QueryContext(this.ServiceRootUri, referenceLink.Url, this.DataSource.Model, this.RequestContainer); var target = queryContext.ResolveQuery(this.DataSource); this.DataSource.UpdateProvider.UpdateLink(parent, navigationPropertyName, target); this.DataSource.UpdateProvider.SaveChanges(); } ResponseWriter.WriteEmptyResponse(responseMessage); }
/// <summary> /// Parse the constant entity node. /// </summary> /// <param name="nodeIn">The input constant node.</param> /// <returns>The parsed object.</returns> private object ParseEntity(ConstantNode nodeIn) { ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); InMemoryMessage message = new InMemoryMessage() { Stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(nodeIn.LiteralText)), }; var resourceType = (nodeIn.TypeReference as IEdmStructuredTypeReference).Definition as IEdmStructuredType; using ( ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, this.UriParser.Model)) { if (nodeIn.LiteralText.Contains("@odata.id")) { ODataEntityReferenceLink referenceLink = reader.ReadEntityReferenceLink(); var queryContext = new QueryContext(this.UriParser.ServiceRoot, referenceLink.Url, this.DataSource.Model, this.UriParser.Container); var target = queryContext.ResolveQuery(this.DataSource); return(target); } var entityType = resourceType as IEdmEntityType; var entryReader = reader.CreateODataUriParameterResourceReader( entityType == null ? null : new EdmEntitySet(new EdmEntityContainer("NS", "Test"), "TestType", entityType), resourceType); return(ODataObjectModelConverter.ReadEntityOrEntityCollection(entryReader, false)); } }
public void TestReadEntityReferenceLink_WithoutNavigationProperty_Throws() { // Arrange IODataRequestMessage request = CreateRequest("{\"odata.id\":\"aa:b\"}"); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.Throws <ODataException>(() => reader.ReadEntityReferenceLink()); } }
public void TestReadEntityReferenceLink_InJsonLight_WithNavigationProperty_DoesNotThrow() { // Arrange IODataRequestMessage request = CreateJsonLightRequest("{\"@odata.id\":\"aa:b\"}"); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.DoesNotThrow(() => reader.ReadEntityReferenceLink()); } }
public void TestReadEntityReferenceLink_InJsonLight_WithNavigationProperty_DoesNotThrow() { // Arrange IODataRequestMessage request = CreateJsonLightRequest("{\"url\":\"aa:b\"}"); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); IEdmNavigationProperty navigationProperty = model.EntityContainers().Single().EntitySets().First().NavigationTargets.First().NavigationProperty; using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.DoesNotThrow(() => reader.ReadEntityReferenceLink(navigationProperty)); } }
public override object Read(ODataMessageReader messageReader, ODataDeserializerReadContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } ODataEntityReferenceLink entityReferenceLink = messageReader.ReadEntityReferenceLink(); if (entityReferenceLink != null) { return entityReferenceLink.Url; } return null; }
public override object Read(ODataMessageReader messageReader, ODataDeserializerReadContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } ODataEntityReferenceLink entityReferenceLink = messageReader.ReadEntityReferenceLink(); if (entityReferenceLink != null) { return(entityReferenceLink.Url); } return(null); }
public override object Read(ODataMessageReader messageReader, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } // TODO: Feature #664 - Support JSON light (pass navigation property). ODataEntityReferenceLink entityReferenceLink = messageReader.ReadEntityReferenceLink(); if (entityReferenceLink != null) { return entityReferenceLink.Url; } return null; }
/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } ODataEntityReferenceLink entityReferenceLink = messageReader.ReadEntityReferenceLink(); if (entityReferenceLink != null) { return ResolveContentId(entityReferenceLink.Url, readContext); } return null; }
/// <inheritdoc /> public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { if (messageReader == null) { throw Error.ArgumentNull("messageReader"); } if (readContext == null) { throw Error.ArgumentNull("readContext"); } ODataEntityReferenceLink entityReferenceLink = messageReader.ReadEntityReferenceLink(); if (entityReferenceLink != null) { return(ResolveContentId(entityReferenceLink.Url, readContext)); } return(null); }
private void ProcessCreateLink(IODataRequestMessage requestMessage, IODataResponseMessage responseMessage) { var level = this.QueryContext.QueryPath.Count - 2; var parent = this.QueryContext.ResolveQuery(this.DataSource, level); var odataPath = this.QueryContext.QueryPath; var collectionPropertyName = ((NavigationPropertyLinkSegment)odataPath.LastSegment).NavigationProperty.Name; using (var messageReader = new ODataMessageReader(requestMessage, this.GetReaderSettings())) { var referenceLink = messageReader.ReadEntityReferenceLink(); var queryContext = new QueryContext(this.ServiceRootUri, referenceLink.Url, this.DataSource.Model, this.RequestContainer); var target = queryContext.ResolveQuery(this.DataSource); this.DataSource.UpdateProvider.CreateLink(parent, collectionPropertyName, target); this.DataSource.UpdateProvider.SaveChanges(); } // Protocol 11.4.6.1 Add a Reference to a Collection-Valued Navigation Property // On successful completion, the response MUST be 204 No Content and contain an empty body. ResponseWriter.WriteEmptyResponse(responseMessage); }
/// <summary> /// Parse the constant entity node. /// </summary> /// <param name="nodeIn">The input constant node.</param> /// <returns>The parsed object.</returns> private object ParseEntity(ConstantNode nodeIn) { ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); InMemoryMessage message = new InMemoryMessage() { Stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(nodeIn.LiteralText)), }; var entityType = (nodeIn.TypeReference as IEdmEntityTypeReference).Definition as IEdmEntityType; using ( ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, this.UriParser.Model)) { if (nodeIn.LiteralText.Contains("@odata.id")) { ODataEntityReferenceLink referenceLink = reader.ReadEntityReferenceLink(); var queryContext = new QueryContext(this.UriParser.ServiceRoot, referenceLink.Url, this.DataSource.Model); var target = queryContext.ResolveQuery(this.DataSource); return(target); } var entryReader = reader.CreateODataEntryReader( new EdmEntitySet(new EdmEntityContainer("NS", "Test"), "TestType", entityType), entityType); ODataEntry entry = null; while (entryReader.Read()) { if (entryReader.State == ODataReaderState.EntryEnd) { entry = entryReader.Item as ODataEntry; } } return(ODataObjectModelConverter.ConvertPropertyValue(entry)); } }
public ODataEntityReferenceLink QueryReferenceLink(string uri, string mimeType) { ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = baseUri }; var queryRequestMessage = new HttpWebRequestMessage(new Uri(baseUri.AbsoluteUri + uri, UriKind.Absolute)); queryRequestMessage.SetHeader("Accept", mimeType); var queryResponseMessage = queryRequestMessage.GetResponse(); Assert.AreEqual(200, queryResponseMessage.StatusCode); ODataEntityReferenceLink item = null; if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { using (var messageReader = new ODataMessageReader(queryResponseMessage, readerSettings, model)) { item = messageReader.ReadEntityReferenceLink(); } } return item; }
private string WriteAndVerifySingleLink(StreamResponseMessage responseMessage, ODataMessageWriter messageWriter, string mimeType) { var link = new ODataEntityReferenceLink() { Url = new Uri(this.ServiceUri + "Order(-10)") }; messageWriter.WriteEntityReferenceLink(link); var stream = responseMessage.GetStream(); if (!mimeType.Contains(MimeTypes.ODataParameterNoMetadata)) { stream.Seek(0, SeekOrigin.Begin); var settings = new ODataMessageReaderSettings() { BaseUri = this.ServiceUri }; ODataMessageReader messageReader = new ODataMessageReader(responseMessage, settings, WritePayloadHelper.Model); ODataEntityReferenceLink linkRead = messageReader.ReadEntityReferenceLink(); Assert.IsTrue(linkRead.Url.AbsoluteUri.Contains("Order(-10)"), "linkRead.Url"); } return WritePayloadHelper.ReadStreamContent(stream); }
public void TestReadEntityReferenceLink_InJsonLight_WithNavigationProperty_DoesNotThrow() { // Arrange IODataRequestMessage request = CreateJsonLightRequest("{\"odata.id\":\"aa:b\"}"); ODataMessageReaderSettings settings = CreateSettings(); IEdmModel model = CreateModel(); IEdmNavigationProperty navigationProperty = model.EntityContainers().Single().EntitySets().First().NavigationPropertyBindings.First().NavigationProperty; using (ODataMessageReader reader = new ODataMessageReader(request, settings, model)) { // Act & Assert Assert.DoesNotThrow(() => reader.ReadEntityReferenceLink(navigationProperty)); } }
private void ProcessCreateLink(IODataRequestMessage requestMessage, IODataResponseMessage responseMessage) { var level = this.QueryContext.QueryPath.Count - 2; var parent = this.QueryContext.ResolveQuery(this.DataSource, level); var odataPath = this.QueryContext.QueryPath; var collectionPropertyName = ((NavigationPropertyLinkSegment)odataPath.LastSegment).NavigationProperty.Name; using (var messageReader = new ODataMessageReader(requestMessage, this.GetReaderSettings(), this.DataSource.Model)) { var referenceLink = messageReader.ReadEntityReferenceLink(); var queryContext = new QueryContext(this.ServiceRootUri, referenceLink.Url, this.DataSource.Model); var target = queryContext.ResolveQuery(this.DataSource); this.DataSource.UpdateProvider.CreateLink(parent, collectionPropertyName, target); this.DataSource.UpdateProvider.SaveChanges(); } // Protocol 11.4.6.1 Add a Reference to a Collection-Valued Navigation Property // On successful completion, the response MUST be 204 No Content and contain an empty body. ResponseWriter.WriteEmptyResponse(responseMessage); }