/// <inheritdoc /> public override void WriteObjectInline(object graph, ODataWriter writer, ODataSerializerContext writeContext) { if (writer == null) { throw Error.ArgumentNull("writer"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } if (graph == null) { throw new SerializationException(Error.Format(SRResources.CannotSerializerNull, Feed)); } IEnumerable enumerable = graph as IEnumerable; // Data to serialize if (enumerable == null) { throw new SerializationException( Error.Format(SRResources.CannotWriteType, GetType().Name, graph.GetType().FullName)); } WriteFeed(enumerable, writer, writeContext); }
private void WriteEntry(object graph, ODataWriter writer, ODataSerializerContext writeContext) { Contract.Assert(writeContext != null); IEdmEntityType entityType = EntityType.EntityDefinition(); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(writeContext, entityType, graph); ODataEntry entry = CreateEntry(entityInstanceContext, writeContext); if (entry != null) { writer.WriteStart(entry); WriteNavigationLinks(entityInstanceContext, writer, writeContext); writer.WriteEnd(); } }
private void WriteEntry(object graph, IEnumerable<ODataProperty> propertyBag, ODataWriter writer, ODataSerializerContext writeContext) { IEdmEntityType entityType = _edmEntityTypeReference.EntityDefinition(); EntityInstanceContext entityInstanceContext = new EntityInstanceContext { EdmModel = SerializerProvider.EdmModel, EntitySet = writeContext.EntitySet, EntityType = entityType, UrlHelper = writeContext.UrlHelper, PathHandler = writeContext.PathHandler, EntityInstance = graph, SkipExpensiveAvailabilityChecks = writeContext.SkipExpensiveAvailabilityChecks }; ODataEntry entry = new ODataEntry { TypeName = _edmEntityTypeReference.FullName(), Properties = propertyBag, Actions = CreateActions(entityInstanceContext) }; if (writeContext.EntitySet != null) { IEntitySetLinkBuilder linkBuilder = SerializerProvider.EdmModel.GetEntitySetLinkBuilder(writeContext.EntitySet); string idLink = linkBuilder.BuildIdLink(entityInstanceContext); if (idLink != null) { entry.Id = idLink; } Uri readLink = linkBuilder.BuildReadLink(entityInstanceContext); if (readLink != null) { entry.ReadLink = readLink; } Uri editLink = linkBuilder.BuildEditLink(entityInstanceContext); if (editLink != null) { entry.EditLink = editLink; } } writer.WriteStart(entry); WriteNavigationLinks(entityInstanceContext, writer, writeContext); writer.WriteEnd(); }
private void WriteFeed(object graph, ODataWriter writer, ODataSerializerContext writeContext) { ODataSerializer entrySerializer = SerializerProvider.GetEdmTypeSerializer(_edmCollectionType.ElementType()); if (entrySerializer == null) { throw Error.NotSupported(SRResources.TypeCannotBeSerialized, _edmCollectionType.ElementType(), typeof(ODataMediaTypeFormatter).Name); } Contract.Assert(entrySerializer.ODataPayloadKind == ODataPayloadKind.Entry); IEnumerable enumerable = graph as IEnumerable; // Data to serialize if (enumerable != null) { ODataFeed feed = new ODataFeed(); if (writeContext.EntitySet != null) { IEntitySetLinkBuilder linkBuilder = SerializerProvider.EdmModel.GetEntitySetLinkBuilder(writeContext.EntitySet); Uri feedSelfLink = linkBuilder.BuildFeedSelfLink(new FeedContext(writeContext.EntitySet, writeContext.UrlHelper, graph)); if (feedSelfLink != null) { feed.SetAnnotation(new AtomFeedMetadata() { SelfLink = new AtomLinkMetadata() { Relation = SelfLinkRelation, Href = feedSelfLink } }); } } // TODO: Bug 467590: remove the hardcoded feed id. Get support for it from the model builder ? feed.Id = FeedNamespace + _edmCollectionType.FullName(); // If we have more OData format specific information apply it now. ODataResult odataFeedAnnotations = graph as ODataResult; if (odataFeedAnnotations != null) { feed.Count = odataFeedAnnotations.Count; feed.NextPageLink = odataFeedAnnotations.NextPageLink; } writer.WriteStart(feed); foreach (object entry in enumerable) { entrySerializer.WriteObjectInline(entry, writer, writeContext); } writer.WriteEnd(); } }
private void WriteEntry(object graph, ODataWriter writer, ODataSerializerContext writeContext) { Contract.Assert(writeContext != null); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(writeContext, EntityType, graph); SelectExpandNode selectExpandNode = CreateSelectExpandNode(entityInstanceContext); if (selectExpandNode != null) { ODataEntry entry = CreateEntry(selectExpandNode, entityInstanceContext); if (entry != null) { writer.WriteStart(entry); WriteNavigationLinks(selectExpandNode.SelectedNavigationProperties, entityInstanceContext, writer); WriteExpandedNavigationProperties(selectExpandNode.ExpandedNavigationProperties, entityInstanceContext, writer); writer.WriteEnd(); } } }
/// <inheritdoc /> public override void WriteObjectInline(object graph, ODataWriter writer, ODataSerializerContext writeContext) { if (writer == null) { throw Error.ArgumentNull("writer"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } if (graph == null) { throw new SerializationException(Error.Format(Properties.SRResources.CannotSerializerNull, Entry)); } else { WriteEntry(graph, writer, writeContext); } }
public override void WriteObjectInline(object graph, ODataWriter writer, ODataSerializerContext writeContext) { if (writer == null) { throw Error.ArgumentNull("writer"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } if (graph != null) { WriteFeed(graph, writer, writeContext); } else { throw new SerializationException(Error.Format(SRResources.CannotSerializerNull, ODataFormatterConstants.Feed)); } }
public override void WriteObjectInline(object graph, ODataWriter writer, ODataSerializerContext writeContext) { if (writer == null) { throw Error.ArgumentNull("writer"); } if (writeContext == null) { throw Error.ArgumentNull("writeContext"); } if (graph != null) { IEnumerable<ODataProperty> propertyBag = CreatePropertyBag(graph, writeContext); WriteEntry(graph, propertyBag, writer, writeContext); } else { throw new SerializationException(Error.Format(Properties.SRResources.CannotSerializerNull, ODataFormatterConstants.Entry)); } }
private void WriteEntry(object graph, IEnumerable<ODataProperty> propertyBag, ODataWriter writer, ODataSerializerContext writeContext) { IEdmEntityType entityType = _edmEntityTypeReference.EntityDefinition(); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(SerializerProvider.EdmModel, writeContext.EntitySet, entityType, writeContext.UrlHelper, graph); ODataEntry entry = new ODataEntry { TypeName = _edmEntityTypeReference.FullName(), Properties = propertyBag, }; if (writeContext.EntitySet != null) { IEntitySetLinkBuilder linkBuilder = SerializerProvider.EdmModel.GetEntitySetLinkBuilder(writeContext.EntitySet); string idLink = linkBuilder.BuildIdLink(entityInstanceContext); if (idLink != null) { entry.Id = idLink; } Uri readLink = linkBuilder.BuildReadLink(entityInstanceContext); if (readLink != null) { entry.ReadLink = readLink; } Uri editLink = linkBuilder.BuildEditLink(entityInstanceContext); if (editLink != null) { entry.EditLink = editLink; } } writer.WriteStart(entry); WriteNavigationLinks(entityInstanceContext, writer, writeContext); writer.WriteEnd(); }
private static void WriteOdataEntity(ITableEntity entity, TableOperationType operationType, OperationContext ctx, ODataWriter writer) { ODataEntry entry = new ODataEntry() { Properties = GetPropertiesWithKeys(entity, ctx) }; if (operationType != TableOperationType.Insert && operationType != TableOperationType.Retrieve) { entry.ETag = entity.ETag; } writer.WriteStart(entry); writer.WriteEnd(); writer.Flush(); }
/// <summary> /// Writes the given object specified by the parameter graph as a part of an existing OData message using the given /// messageWriter and the writeContext. /// </summary> /// <param name="graph">The object to be written.</param> /// <param name="expectedType">The expected EDM type of the object represented by <paramref name="graph"/>.</param> /// <param name="writer">The <see cref="ODataWriter" /> to be used for writing.</param> /// <param name="writeContext">The <see cref="ODataSerializerContext"/>.</param> public virtual void WriteObjectInline(object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext) { throw Error.NotSupported(SRResources.WriteObjectInlineNotSupported, GetType().Name); }
private void WriteExpandedNavigationProperty( KeyValuePair<IEdmNavigationProperty, SelectExpandClause> navigationPropertyToExpand, EntityInstanceContext entityInstanceContext, ODataWriter writer) { Contract.Assert(entityInstanceContext != null); Contract.Assert(writer != null); ODataSerializerContext writeContext = entityInstanceContext.SerializerContext; IEdmNavigationProperty navigationProperty = navigationPropertyToExpand.Key; SelectExpandClause selectExpandClause = navigationPropertyToExpand.Value; object propertyValue = entityInstanceContext.GetPropertyValue(navigationProperty.Name); if (propertyValue != null) { // backup current context. SelectExpandClause currentSelectExpandClause = writeContext.SelectExpandClause; IEdmEntitySet currentEntitySet = writeContext.EntitySet; // update the context with child context. writeContext.SelectExpandClause = selectExpandClause; writeContext.EntitySet = currentEntitySet.FindNavigationTarget(navigationProperty); // write object. Type propertyType = propertyValue.GetType(); ODataEdmTypeSerializer serializer = SerializerProvider.GetEdmTypeSerializer(writeContext.Model, propertyValue); if (serializer == null) { throw new SerializationException( Error.Format(SRResources.TypeCannotBeSerialized, propertyType.FullName, typeof(ODataMediaTypeFormatter).Name)); } serializer.WriteObjectInline(propertyValue, writer, writeContext); // revert back context. writeContext.SelectExpandClause = currentSelectExpandClause; writeContext.EntitySet = currentEntitySet; } }
private void WriteExpandedNavigationProperties( IDictionary<IEdmNavigationProperty, SelectExpandClause> navigationPropertiesToExpand, EntityInstanceContext entityInstanceContext, ODataWriter writer) { Contract.Assert(navigationPropertiesToExpand != null); Contract.Assert(entityInstanceContext != null); Contract.Assert(writer != null); foreach (KeyValuePair<IEdmNavigationProperty, SelectExpandClause> navigationPropertyToExpand in navigationPropertiesToExpand) { IEdmNavigationProperty navigationProperty = navigationPropertyToExpand.Key; ODataNavigationLink navigationLink = CreateNavigationLink(navigationProperty, entityInstanceContext); if (navigationLink != null) { writer.WriteStart(navigationLink); WriteExpandedNavigationProperty(navigationPropertyToExpand, entityInstanceContext, writer); writer.WriteEnd(); } } }
public override void WriteObjectInline(object graph, ODataWriter writer, ODataSerializerContext writeContext) { }
private static void WriteOdataEntity(ITableEntity entity, TableOperationType operationType, OperationContext ctx, ODataWriter writer, TableRequestOptions options) { ODataEntry entry = new ODataEntry() { Properties = GetPropertiesWithKeys(entity, ctx, operationType, options), TypeName = "account.sometype" }; entry.SetAnnotation(new SerializationTypeNameAnnotation { TypeName = null }); writer.WriteStart(entry); writer.WriteEnd(); writer.Flush(); }
private void WriteExpandedNavigationProperty( KeyValuePair<IEdmNavigationProperty, SelectExpandClause> navigationPropertyToExpand, EntityInstanceContext entityInstanceContext, ODataWriter writer) { Contract.Assert(entityInstanceContext != null); Contract.Assert(writer != null); ODataSerializerContext writeContext = entityInstanceContext.SerializerContext; IEdmNavigationProperty navigationProperty = navigationPropertyToExpand.Key; SelectExpandClause selectExpandClause = navigationPropertyToExpand.Value; object propertyValue = entityInstanceContext.GetPropertyValue(navigationProperty.Name); if (propertyValue != null) { // create the serializer context for the expanded item. ODataSerializerContext nestedWriteContext = new ODataSerializerContext(entityInstanceContext, selectExpandClause, navigationProperty); // write object. ODataEdmTypeSerializer serializer = SerializerProvider.GetEdmTypeSerializer(navigationProperty.Type); if (serializer == null) { throw new SerializationException( Error.Format(SRResources.TypeCannotBeSerialized, navigationProperty.Type.ToTraceString(), typeof(ODataMediaTypeFormatter).Name)); } serializer.WriteObjectInline(propertyValue, navigationProperty.Type, writer, nestedWriteContext); } }
private void WriteEntry(object graph, IEnumerable<ODataProperty> propertyBag, ODataWriter writer, ODataSerializerContext writeContext) { Contract.Assert(writeContext != null); IEdmEntityType entityType = _edmEntityTypeReference.EntityDefinition(); EntityInstanceContext entityInstanceContext = new EntityInstanceContext { Request = writeContext.Request, EdmModel = writeContext.Model, EntitySet = writeContext.EntitySet, EntityType = entityType, Url = writeContext.Url, EntityInstance = graph, SkipExpensiveAvailabilityChecks = writeContext.SkipExpensiveAvailabilityChecks }; string typeName = _edmEntityTypeReference.FullName(); ODataEntry entry = new ODataEntry { TypeName = typeName, Properties = propertyBag, Actions = CreateActions(entityInstanceContext, writeContext) }; AddTypeNameAnnotationAsNeeded(entry, writeContext.EntitySet, writeContext.MetadataLevel); if (writeContext.EntitySet != null) { IEdmModel model = writeContext.Model; EntitySetLinkBuilderAnnotation linkBuilder = model.GetEntitySetLinkBuilder(writeContext.EntitySet); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityInstanceContext, writeContext.MetadataLevel); if (selfLinks.IdLink != null) { entry.Id = selfLinks.IdLink; } if (selfLinks.ReadLink != null) { entry.ReadLink = selfLinks.ReadLink; } if (selfLinks.EditLink != null) { entry.EditLink = selfLinks.EditLink; } } writer.WriteStart(entry); WriteNavigationLinks(entityInstanceContext, writer, writeContext); writer.WriteEnd(); }
private void WriteNavigationLinks(EntityInstanceContext context, ODataWriter writer, ODataSerializerContext writeContext) { Contract.Assert(writeContext != null); foreach (IEdmNavigationProperty navProperty in _edmEntityTypeReference.NavigationProperties()) { IEdmTypeReference propertyType = navProperty.Type; if (writeContext.EntitySet != null) { IEdmModel model = writeContext.Model; EntitySetLinkBuilderAnnotation linkBuilder = model.GetEntitySetLinkBuilder(writeContext.EntitySet); Uri navigationUrl = linkBuilder.BuildNavigationLink(context, navProperty, writeContext.MetadataLevel); ODataNavigationLink navigationLink = new ODataNavigationLink { IsCollection = propertyType.IsCollection(), Name = navProperty.Name, }; if (navigationUrl != null) { navigationLink.Url = navigationUrl; } writer.WriteStart(navigationLink); writer.WriteEnd(); } } }
private void WriteLink(ODataWriter entryWriter, Microsoft.Data.OData.ODataEntry entry, string linkName, IEnumerable<ReferenceLink> links) { var navigationProperty = (_model.FindDeclaredType(entry.TypeName) as IEdmEntityType).NavigationProperties() .BestMatch(x => x.Name, linkName, _session.Pluralizer); bool isCollection = navigationProperty.Type.Definition.TypeKind == EdmTypeKind.Collection; var linkType = GetNavigationPropertyEntityType(navigationProperty); var linkTypeWithKey = linkType; while (linkTypeWithKey.DeclaredKey == null && linkTypeWithKey.BaseEntityType() != null) { linkTypeWithKey = linkTypeWithKey.BaseEntityType(); } entryWriter.WriteStart(new ODataNavigationLink() { Name = linkName, IsCollection = isCollection, Url = new Uri("http://schemas.microsoft.com/ado/2007/08/dataservices/related/" + linkType, UriKind.Absolute), }); foreach (var referenceLink in links) { var linkKey = linkTypeWithKey.DeclaredKey; var linkEntry = referenceLink.LinkData.ToDictionary(); var contentId = GetContentId(referenceLink); string linkUri; if (contentId != null) { linkUri = "$" + contentId; } else { var linkSet = _model.EntityContainers() .SelectMany(x => x.EntitySets()) .BestMatch(x => x.ElementType.Name, linkTypeWithKey.Name, _session.Pluralizer); var formattedKey = _session.Adapter.GetCommandFormatter().ConvertKeyValuesToUriLiteral( linkKey.ToDictionary(x => x.Name, x => linkEntry[x.Name]), true); linkUri = linkSet.Name + formattedKey; } var link = new ODataEntityReferenceLink { Url = Utils.CreateAbsoluteUri(_session.Settings.BaseUri.AbsoluteUri, linkUri) }; entryWriter.WriteEntityReferenceLink(link); } entryWriter.WriteEnd(); }
internal void WriteNavigationLink(EntityDescriptor entityDescriptor, IEnumerable<LinkDescriptor> relatedLinks, ODataWriter odataWriter) { ClientTypeAnnotation clientTypeAnnotation = null; foreach (LinkDescriptor descriptor in relatedLinks) { descriptor.ContentGeneratedForSave = true; if (clientTypeAnnotation == null) { ClientEdmModel model = ClientEdmModel.GetModel(this.requestInfo.MaxProtocolVersion); clientTypeAnnotation = model.GetClientTypeAnnotation(model.GetOrCreateEdmType(entityDescriptor.Entity.GetType())); } ODataNavigationLink navigationLink = new ODataNavigationLink { Url = this.requestInfo.EntityTracker.GetEntityDescriptor(descriptor.Target).GetLatestEditLink(), IsCollection = new bool?(clientTypeAnnotation.GetProperty(descriptor.SourceProperty, false).IsEntityCollection), Name = descriptor.SourceProperty }; odataWriter.WriteStart(navigationLink); ODataEntityReferenceLink entityReferenceLink = new ODataEntityReferenceLink { Url = navigationLink.Url }; odataWriter.WriteEntityReferenceLink(entityReferenceLink); odataWriter.WriteEnd(); } }
private void WriteLink(ODataWriter entryWriter, Microsoft.Data.OData.ODataEntry entry, string linkName, IEnumerable<ReferenceLink> links) { var navigationProperty = (_model.FindDeclaredType(entry.TypeName) as IEdmEntityType).NavigationProperties() .BestMatch(x => x.Name, linkName, _session.Pluralizer); bool isCollection = navigationProperty.Type.Definition.TypeKind == EdmTypeKind.Collection; var linkType = GetNavigationPropertyEntityType(navigationProperty); var linkTypeWithKey = linkType; while (linkTypeWithKey.DeclaredKey == null && linkTypeWithKey.BaseEntityType() != null) { linkTypeWithKey = linkTypeWithKey.BaseEntityType(); } entryWriter.WriteStart(new ODataNavigationLink() { Name = linkName, IsCollection = isCollection, Url = new Uri(ODataNamespace.Related + linkType, UriKind.Absolute), }); foreach (var referenceLink in links) { var linkKey = linkTypeWithKey.DeclaredKey; var linkEntry = referenceLink.LinkData.ToDictionary(); var contentId = GetContentId(referenceLink); string linkUri; if (contentId != null) { linkUri = "$" + contentId; } else { bool isSingleton; var formattedKey = _session.Adapter.GetCommandFormatter().ConvertKeyValuesToUriLiteral( linkKey.ToDictionary(x => x.Name, x => linkEntry[x.Name]), true); var linkedCollectionName = _session.Metadata.GetLinkedCollectionName( referenceLink.LinkData.GetType().Name, linkTypeWithKey.Name, out isSingleton); linkUri = linkedCollectionName + (isSingleton ? string.Empty : formattedKey); } var link = new ODataEntityReferenceLink { Url = Utils.CreateAbsoluteUri(_session.Settings.BaseUri.AbsoluteUri, linkUri) }; entryWriter.WriteEntityReferenceLink(link); } entryWriter.WriteEnd(); }
private void WriteNavigationLinks(EntityInstanceContext context, ODataWriter writer, ODataSerializerContext writeContext) { foreach (IEdmNavigationProperty navProperty in _edmEntityTypeReference.NavigationProperties()) { IEdmTypeReference propertyType = navProperty.Type; if (writeContext.EntitySet != null) { IEntitySetLinkBuilder linkBuilder = SerializerProvider.EdmModel.GetEntitySetLinkBuilder(writeContext.EntitySet); ODataNavigationLink navigationLink = new ODataNavigationLink { IsCollection = propertyType.IsCollection(), Name = navProperty.Name, Url = linkBuilder.BuildNavigationLink(context, navProperty) }; writer.WriteStart(navigationLink); writer.WriteEnd(); } } }
private void WriteNavigationLinks(EntityInstanceContext context, ODataWriter writer, ODataSerializerContext writeContext) { foreach (IEdmNavigationProperty navProperty in _edmEntityTypeReference.NavigationProperties()) { IEdmTypeReference propertyType = navProperty.Type; object propertyValue = context.EntityInstance.GetType().GetProperty(navProperty.Name).GetValue(context.EntityInstance, index: null); if (writeContext.EntitySet != null) { IEdmEntitySet currentEntitySet = writeContext.EntitySet.FindNavigationTarget(navProperty); IEntitySetLinkBuilder linkBuilder = SerializerProvider.EdmModel.GetEntitySetLinkBuilder(writeContext.EntitySet); ODataNavigationLink navigationLink = new ODataNavigationLink { IsCollection = propertyType.IsCollection(), Name = navProperty.Name, Url = linkBuilder.BuildNavigationLink(context, navProperty) }; ODataQueryProjectionNode expandNode = null; if (writeContext.CurrentProjectionNode != null) { expandNode = writeContext.CurrentProjectionNode.Expands.FirstOrDefault(p => p.Name == navProperty.Name); } if (expandNode != null && propertyValue != null) { writer.WriteStart(navigationLink); ODataSerializer serializer = SerializerProvider.GetEdmTypeSerializer(propertyType); if (serializer == null) { throw Error.NotSupported(SRResources.TypeCannotBeSerialized, navProperty.Type.FullName(), typeof(ODataMediaTypeFormatter).Name); } ODataSerializerContext childWriteContext = new ODataSerializerContext(); childWriteContext.UrlHelper = writeContext.UrlHelper; childWriteContext.EntitySet = currentEntitySet; childWriteContext.RootProjectionNode = writeContext.RootProjectionNode; childWriteContext.CurrentProjectionNode = expandNode; childWriteContext.ServiceOperationName = writeContext.ServiceOperationName; serializer.WriteObjectInline(propertyValue, writer, childWriteContext); writer.WriteEnd(); } writer.WriteStart(navigationLink); writer.WriteEnd(); } } }
private void WriteNavigationLinks( IEnumerable<IEdmNavigationProperty> navigationProperties, EntityInstanceContext entityInstanceContext, ODataWriter writer) { Contract.Assert(entityInstanceContext != null); IEnumerable<ODataNavigationLink> navigationLinks = CreateNavigationLinks(navigationProperties, entityInstanceContext); foreach (ODataNavigationLink navigationLink in navigationLinks) { writer.WriteStart(navigationLink); writer.WriteEnd(); } }
private void WriteFeed(IEnumerable enumerable, ODataWriter writer, ODataSerializerContext writeContext) { Contract.Assert(writer != null); Contract.Assert(writeContext != null); Contract.Assert(enumerable != null); ODataFeed feed = CreateODataFeed(enumerable, writeContext); if (feed == null) { throw new SerializationException(Error.Format(SRResources.CannotSerializerNull, Feed)); } // save this for later to support JSON lite streaming. Uri nextPageLink = feed.NextPageLink; feed.NextPageLink = null; writer.WriteStart(feed); foreach (object entry in enumerable) { if (entry == null) { throw new SerializationException(SRResources.NullElementInCollection); } ODataEdmTypeSerializer entrySerializer = SerializerProvider.GetEdmTypeSerializer(writeContext.Model, entry); if (entrySerializer == null) { throw new SerializationException( Error.Format(SRResources.TypeCannotBeSerialized, entry.GetType(), typeof(ODataMediaTypeFormatter).Name)); } entrySerializer.WriteObjectInline(entry, writer, writeContext); } // Subtle and suprising behavior: If the NextPageLink property is set before calling WriteStart(feed), // the next page link will be written early in a manner not compatible with streaming=true. Instead, if // the next page link is not set when calling WriteStart(feed) but is instead set later on that feed // object before calling WriteEnd(), the next page link will be written at the end, as required for // streaming=true support. if (nextPageLink != null) { feed.NextPageLink = nextPageLink; } writer.WriteEnd(); }
public override void WriteObjectInline(object graph, ODataWriter writer, ODataSerializerContext writeContext) { WriteObjectInlineCall call = new WriteObjectInlineCall { Graph = graph, WriteContext = writeContext, }; WriteObjectInlineCalls.Add(call); }
private void WriteNavigationLinks(EntityInstanceContext entityInstanceContext, ODataWriter writer, ODataSerializerContext writeContext) { Contract.Assert(writeContext != null); IEnumerable<ODataNavigationLink> navigationLinks = CreateNavigationLinks(entityInstanceContext, writeContext); if (navigationLinks != null) { foreach (ODataNavigationLink navigationLink in navigationLinks) { writer.WriteStart(navigationLink); writer.WriteEnd(); } } }
private void WriteFeed(object graph, ODataWriter writer, ODataSerializerContext writeContext) { IEnumerable enumerable = graph as IEnumerable; // Data to serialize if (enumerable != null) { ODataFeed feed = new ODataFeed(); if (writeContext.EntitySet != null) { IEdmModel model = writeContext.Model; EntitySetLinkBuilderAnnotation linkBuilder = model.GetEntitySetLinkBuilder(writeContext.EntitySet); FeedContext feedContext = new FeedContext { Request = writeContext.Request, EntitySet = writeContext.EntitySet, Url = writeContext.Url, FeedInstance = graph }; Uri feedSelfLink = linkBuilder.BuildFeedSelfLink(feedContext); if (feedSelfLink != null) { feed.SetAnnotation(new AtomFeedMetadata() { SelfLink = new AtomLinkMetadata() { Relation = "self", Href = feedSelfLink } }); } } // TODO: Bug 467590: remove the hardcoded feed id. Get support for it from the model builder ? feed.Id = "http://schemas.datacontract.org/2004/07/" + _edmCollectionType.FullName(); // Compute and save the NextPageLink for JSON Light streaming support. Uri nextPageLink = null; // If we have more OData format specific information apply it now. PageResult odataFeedAnnotations = graph as PageResult; if (odataFeedAnnotations != null) { feed.Count = odataFeedAnnotations.Count; nextPageLink = odataFeedAnnotations.NextPageLink; } else { nextPageLink = writeContext.NextPageLink; long? inlineCount = writeContext.InlineCount; if (inlineCount.HasValue) { feed.Count = inlineCount.Value; } } writer.WriteStart(feed); foreach (object entry in enumerable) { if (entry == null) { throw Error.NotSupported(SRResources.NullElementInCollection); } ODataSerializer entrySerializer = SerializerProvider.GetODataPayloadSerializer(writeContext.Model, entry.GetType()); if (entrySerializer == null) { throw Error.NotSupported(SRResources.TypeCannotBeSerialized, entry.GetType(), typeof(ODataMediaTypeFormatter).Name); } Contract.Assert(entrySerializer.ODataPayloadKind == ODataPayloadKind.Entry); entrySerializer.WriteObjectInline(entry, writer, writeContext); } // Subtle and suprising behavior: If the NextPageLink property is set before calling WriteStart(feed), // the next page link will be written early in a manner not compatible with streaming=true. Instead, if // the next page link is not set when calling WriteStart(feed) but is instead set later on that feed // object before calling WriteEnd(), the next page link will be written at the end, as required for // streaming=true support. if (nextPageLink != null) { feed.NextPageLink = nextPageLink; } writer.WriteEnd(); } }
private IEnumerable<PropertyInfo> WriteNavigationLinks(ODataWriter entryWriter, Uri entryLink, IGraph resultsGraph, string entryResource, string entryType) { var subject = resultsGraph.CreateUriNode(UriFactory.Create(entryResource)); var navigableProperties = new List<PropertyInfo>(); foreach (var assocMap in _map.GetAssociationPropertyMappings(entryType)) { var predicate = resultsGraph.CreateUriNode(UriFactory.Create(assocMap.Uri)); List<Triple> matches = assocMap.IsInverse ? resultsGraph.GetTriplesWithPredicateObject(predicate, subject).ToList() : resultsGraph.GetTriplesWithSubjectPredicate(subject, predicate).ToList(); if (matches.Any(t => t.Object is UriNode)) // Ignore literal and blank nodes as these cannot be entities { var navLink = new ODataNavigationLink { IsCollection = assocMap.IsCollection, Name = assocMap.Name, Url = new Uri(entryLink + "/" + assocMap.Name) }; entryWriter.WriteStart(navLink); entryWriter.WriteEnd(); navigableProperties.Add(assocMap); } } return navigableProperties; }
private void WriteFeed(object graph, ODataWriter writer, ODataSerializerContext writeContext) { IEnumerable enumerable = graph as IEnumerable; // Data to serialize if (enumerable != null) { ODataFeed feed = new ODataFeed(); if (writeContext.EntitySet != null) { IEntitySetLinkBuilder linkBuilder = SerializerProvider.EdmModel.GetEntitySetLinkBuilder(writeContext.EntitySet); FeedContext feedContext = new FeedContext { EntitySet = writeContext.EntitySet, UrlHelper = writeContext.UrlHelper, PathHandler = writeContext.PathHandler, FeedInstance = graph }; Uri feedSelfLink = linkBuilder.BuildFeedSelfLink(feedContext); if (feedSelfLink != null) { feed.SetAnnotation(new AtomFeedMetadata() { SelfLink = new AtomLinkMetadata() { Relation = SelfLinkRelation, Href = feedSelfLink } }); } } // TODO: Bug 467590: remove the hardcoded feed id. Get support for it from the model builder ? feed.Id = FeedNamespace + _edmCollectionType.FullName(); // If we have more OData format specific information apply it now. ODataResult odataFeedAnnotations = graph as ODataResult; if (odataFeedAnnotations != null) { feed.Count = odataFeedAnnotations.Count; feed.NextPageLink = odataFeedAnnotations.NextPageLink; } else { object nextPageLinkPropertyValue; HttpRequestMessage request = writeContext.Request; if (request != null && request.Properties.TryGetValue(ODataQueryOptions.NextPageLinkPropertyKey, out nextPageLinkPropertyValue)) { Uri nextPageLink = nextPageLinkPropertyValue as Uri; if (nextPageLink != null) { feed.NextPageLink = nextPageLink; } } } writer.WriteStart(feed); foreach (object entry in enumerable) { if (entry == null) { throw Error.NotSupported(SRResources.NullElementInCollection); } ODataSerializer entrySerializer = SerializerProvider.GetODataPayloadSerializer(entry.GetType()); if (entrySerializer == null) { throw Error.NotSupported(SRResources.TypeCannotBeSerialized, entry.GetType(), typeof(ODataMediaTypeFormatter).Name); } Contract.Assert(entrySerializer.ODataPayloadKind == ODataPayloadKind.Entry); entrySerializer.WriteObjectInline(entry, writer, writeContext); } writer.WriteEnd(); } }