/// <summary> /// Write the metadata for an OData association link; makes sure any duplicate of the link's values duplicated in metadata are equal. /// </summary> /// <param name="associationLink">The association link for which to write the metadata.</param> /// <param name="owningType">The <see cref="IEdmEntityType"/> instance the association link is defined on.</param> /// <param name="duplicatePropertyNamesChecker">The checker instance for duplicate property names.</param> /// <param name="projectedProperties">Set of projected properties, or null if all properties should be written.</param> internal void WriteAssociationLink( ODataAssociationLink associationLink, IEdmEntityType owningType, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, ProjectedPropertiesAnnotation projectedProperties) { DebugUtils.CheckNoExternalCallers(); ValidationUtils.ValidateAssociationLinkNotNull(associationLink); string associationLinkName = associationLink.Name; if (projectedProperties.ShouldSkipProperty(associationLinkName)) { return; } this.ValidateAssociationLink(associationLink, owningType); duplicatePropertyNamesChecker.CheckForDuplicateAssociationLinkNames(associationLink); AtomLinkMetadata linkMetadata = associationLink.GetAnnotation <AtomLinkMetadata>(); string linkRelation = AtomUtils.ComputeODataAssociationLinkRelation(associationLink); AtomLinkMetadata mergedLinkMetadata = ODataAtomWriterMetadataUtils.MergeLinkMetadata(linkMetadata, linkRelation, associationLink.Url, associationLinkName, MimeConstants.MimeApplicationXml); this.atomEntryMetadataSerializer.WriteAtomLink(mergedLinkMetadata, null /* etag*/); }
/// <summary> /// Creates the value for the navigation property's association link relation attribute. /// </summary> /// <param name="associationLink">The link representing the navigation property's association for which the relation value is created.</param> /// <returns>The relation attribute value for the navigation property's association link relation.</returns> internal static string ComputeODataAssociationLinkRelation(ODataAssociationLink associationLink) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(associationLink != null, "link != null"); Debug.Assert(associationLink.Name != null, "link.Name != null"); return(string.Join("/", new string[] { AtomConstants.ODataNamespace, AtomConstants.ODataNavigationPropertiesAssociationRelatedSegmentName, associationLink.Name })); }
/// <summary> /// Creates the value for the navigation property's association link relation attribute. /// </summary> /// <param name="associationLink">The link representing the navigation property's association for which the relation value is created.</param> /// <returns>The relation attribute value for the navigation property's association link relation.</returns> internal static string ComputeODataAssociationLinkRelation(ODataAssociationLink associationLink) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(associationLink != null, "link != null"); Debug.Assert(associationLink.Name != null, "link.Name != null"); return string.Join("/", new string[] { AtomConstants.ODataNamespace, AtomConstants.ODataNavigationPropertiesAssociationRelatedSegmentName, associationLink.Name }); }
private void WriteAssociationLink(ODataAssociationLink associationLink, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker) { duplicatePropertyNamesChecker.CheckForDuplicatePropertyNames(associationLink); base.JsonWriter.WriteName(associationLink.Name); base.JsonWriter.StartObjectScope(); base.JsonWriter.WriteName("associationuri"); base.JsonWriter.WriteValue(base.UriToAbsoluteUriString(associationLink.Url)); base.JsonWriter.EndObjectScope(); }
public static AtomLinkMetadata Atom(this ODataAssociationLink associationLink) { ExceptionUtils.CheckArgumentNotNull <ODataAssociationLink>(associationLink, "associationLink"); AtomLinkMetadata annotation = associationLink.GetAnnotation <AtomLinkMetadata>(); if (annotation == null) { annotation = new AtomLinkMetadata(); associationLink.SetAnnotation <AtomLinkMetadata>(annotation); } return(annotation); }
internal void WriteAssociationLink(ODataAssociationLink associationLink, IEdmEntityType owningType, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, ProjectedPropertiesAnnotation projectedProperties) { ValidationUtils.ValidateAssociationLinkNotNull(associationLink); if (!projectedProperties.ShouldSkipProperty(associationLink.Name)) { base.ValidateAssociationLink(associationLink, owningType); duplicatePropertyNamesChecker.CheckForDuplicatePropertyNames(associationLink); AtomLinkMetadata annotation = associationLink.GetAnnotation <AtomLinkMetadata>(); string relation = AtomUtils.ComputeODataAssociationLinkRelation(associationLink); AtomLinkMetadata linkMetadata = ODataAtomWriterMetadataUtils.MergeLinkMetadata(annotation, relation, associationLink.Url, associationLink.Name, "application/xml"); this.atomEntryMetadataSerializer.WriteAtomLink(linkMetadata, null); } }
/// <summary> /// Extension method to get the <see cref="AtomLinkMetadata"/> for an association link. /// </summary> /// <param name="associationLink">The association link to get the annotation from.</param> /// <returns>An <see cref="AtomLinkMetadata" /> instance or null if no annotation of that type exists.</returns> public static AtomLinkMetadata Atom(this ODataAssociationLink associationLink) { ExceptionUtils.CheckArgumentNotNull(associationLink, "associationLink"); AtomLinkMetadata linkMetadata = associationLink.GetAnnotation <AtomLinkMetadata>(); if (linkMetadata == null) { linkMetadata = new AtomLinkMetadata(); associationLink.SetAnnotation(linkMetadata); } return(linkMetadata); }
/// <summary> /// Writes the metadata content for an association link /// </summary> /// <param name="associationLink">The association link to write.</param> /// <param name="duplicatePropertyNamesChecker">The checker instance for duplicate property names.</param> private void WriteAssociationLink( ODataAssociationLink associationLink, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker) { DebugUtils.CheckNoExternalCallers(); duplicatePropertyNamesChecker.CheckForDuplicatePropertyNames(associationLink); // Write the "LinkName": { this.JsonWriter.WriteName(associationLink.Name); this.JsonWriter.StartObjectScope(); // Write the "associationuri": "url" this.JsonWriter.WriteName(JsonConstants.ODataMetadataPropertiesAssociationUriName); this.JsonWriter.WriteValue(this.UriToAbsoluteUriString(associationLink.Url)); // Close the "LinkName" object this.JsonWriter.EndObjectScope(); }
private void ReadPropertiesMetadataProperty(IODataJsonReaderEntryState entryState, ref ODataJsonReaderUtils.MetadataPropertyBitMask metadataPropertiesFoundBitField) { if (!base.ReadingResponse || (base.MessageReaderSettings.MaxProtocolVersion < ODataVersion.V3)) { base.JsonReader.SkipValue(); } else { ODataJsonReaderUtils.VerifyMetadataPropertyNotFound(ref metadataPropertiesFoundBitField, ODataJsonReaderUtils.MetadataPropertyBitMask.Properties, "properties"); if (base.JsonReader.NodeType != JsonNodeType.StartObject) { throw new ODataException(Microsoft.Data.OData.Strings.ODataJsonEntryAndFeedDeserializer_PropertyInEntryMustHaveObjectValue("properties", base.JsonReader.NodeType)); } base.JsonReader.ReadStartObject(); while (base.JsonReader.NodeType == JsonNodeType.Property) { string associationLinkName = base.JsonReader.ReadPropertyName(); ValidationUtils.ValidateAssociationLinkName(associationLinkName); ReaderValidationUtils.ValidateNavigationPropertyDefined(associationLinkName, entryState.EntityType, base.MessageReaderSettings); base.JsonReader.ReadStartObject(); while (base.JsonReader.NodeType == JsonNodeType.Property) { if (string.CompareOrdinal(base.JsonReader.ReadPropertyName(), "associationuri") == 0) { string propertyValue = base.JsonReader.ReadStringValue("associationuri"); ODataJsonReaderUtils.ValidateMetadataStringProperty(propertyValue, "associationuri"); ODataAssociationLink associationLink = new ODataAssociationLink { Name = associationLinkName, Url = base.ProcessUriFromPayload(propertyValue) }; ValidationUtils.ValidateAssociationLink(associationLink); entryState.DuplicatePropertyNamesChecker.CheckForDuplicatePropertyNames(associationLink); ReaderUtils.AddAssociationLinkToEntry(entryState.Entry, associationLink); } else { base.JsonReader.SkipValue(); } } base.JsonReader.ReadEndObject(); } base.JsonReader.ReadEndObject(); } }
/// <summary> /// Validates an <see cref="ODataAssociationLink"/> to ensure all required information is specified and valid. /// </summary> /// <param name="associationLink">The association link to validate.</param> /// <param name="version">The version of the OData protocol used for checking.</param> internal static void ValidateAssociationLink(ODataAssociationLink associationLink, ODataVersion version) { DebugUtils.CheckNoExternalCallers(); ODataVersionChecker.CheckAssociationLinks(version); // null link can not appear in the enumeration if (associationLink == null) { throw new ODataException(Strings.ODataWriter_AssociationLinkMustNotBeNull); } // Association link must have a non-empty name if (string.IsNullOrEmpty(associationLink.Name)) { throw new ODataException(Strings.ODataWriter_AssociationLinkMustSpecifyName); } // Association link must specify the Url if (associationLink.Url == null) { throw new ODataException(Strings.ODataWriter_AssociationLinkMustSpecifyUrl); } }
/// <summary> /// Writes an association link. /// </summary> /// <param name="writer">The Xml writer to write to.</param> /// <param name="baseUri">The base Uri of the document or null if none was specified.</param> /// <param name="entry">The entry for which to write the association link.</param> /// <param name="associationLink">The association link to write.</param> internal static void WriteAssociationLink(XmlWriter writer, Uri baseUri, ODataEntry entry, ODataAssociationLink associationLink) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(writer != null, "writer != null"); Debug.Assert(entry != null, "entry != null"); Debug.Assert(associationLink != null, "associationLink != null"); // <atom:link ... writer.WriteStartElement( AtomConstants.AtomNamespacePrefix, AtomConstants.AtomLinkElementName, AtomConstants.AtomNamespace); ODataAtomWriterMetadataUtils.WriteODataAssociationLinkMetadata(writer, baseUri, entry, associationLink); // /> writer.WriteEndElement(); }
/// <summary> /// Write the metadata for an OData association link; makes sure any duplicate of the link's values duplicated in metadata are equal. /// </summary> /// <param name="writer">The Xml writer to write to.</param> /// <param name="baseUri">The base Uri of the document or null if none was specified.</param> /// <param name="entry">The entry for which to write the association link.</param> /// <param name="associationLink">The association link for which to write the metadata.</param> internal static void WriteODataAssociationLinkMetadata(XmlWriter writer, Uri baseUri, ODataEntry entry, ODataAssociationLink associationLink) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(writer != null, "writer != null"); Debug.Assert(entry != null, "entry != null"); Debug.Assert(associationLink != null, "link != null"); Debug.Assert(!string.IsNullOrEmpty(associationLink.Name), "The link name was not verified yet."); Debug.Assert(associationLink.Url != null, "The link Url was not verified yet."); string linkRelation = AtomUtils.ComputeODataAssociationLinkRelation(associationLink); string linkHref = AtomUtils.ToUrlAttributeValue(associationLink.Url, baseUri); string linkHrefLang = null; string linkType = MimeConstants.MimeApplicationXml; string linkTitle = associationLink.Name; int? linkLength = null; AtomLinkMetadata linkMetadata = null; AtomEntryMetadata entryMetadata = entry.Atom(); if (entryMetadata != null) { // TODO: Determine the link metadata from the entry } if (linkMetadata != null) { Uri metadataHref = linkMetadata.Href; if (metadataHref != null) { string metadataHrefString = AtomUtils.ToUrlAttributeValue(metadataHref, baseUri); if (metadataHrefString != linkHref) { throw new ODataException(Strings.ODataAtomWriter_LinkMetadataHrefMustBeEqualWithLinkUrl(metadataHrefString, linkHref)); } } string metadataRelation = linkMetadata.Relation; if (metadataRelation != null && metadataRelation != linkRelation) { throw new ODataException(Strings.ODataAtomWriter_LinkMetadataRelationMustBeEqualWithComputedRelation(metadataRelation, linkRelation)); } string metadataType = linkMetadata.MediaType; if (metadataType != null && metadataType != linkType) { throw new ODataException(Strings.ODataAtomWriter_LinkMetadataMediaTypeMustBeEqualWithComputedType(metadataRelation, linkType)); } string metadataTitle = linkMetadata.Title; if (metadataTitle != null && metadataTitle != linkTitle) { throw new ODataException(Strings.ODataAtomWriter_LinkMetadataTitleMustBeEqualWithLinkName(metadataTitle, linkTitle)); } linkHrefLang = linkMetadata.HrefLang; linkLength = linkMetadata.Length; } WriteAtomLinkMetadataAttributes(writer, linkRelation, linkHref, linkHrefLang, linkTitle, linkType, linkLength); }
internal static string ComputeODataAssociationLinkRelation(ODataAssociationLink associationLink) { return(string.Join("/", new string[] { "http://schemas.microsoft.com/ado/2007/08/dataservices", "relatedlinks", associationLink.Name })); }
/// <summary> /// Write the metadata for an OData association link; makes sure any duplicate of the link's values duplicated in metadata are equal. /// </summary> /// <param name="associationLink">The association link for which to write the metadata.</param> /// <param name="owningType">The <see cref="IEdmEntityType"/> instance the association link is defined on.</param> /// <param name="duplicatePropertyNamesChecker">The checker instance for duplicate property names.</param> /// <param name="projectedProperties">Set of projected properties, or null if all properties should be written.</param> internal void WriteAssociationLink( ODataAssociationLink associationLink, IEdmEntityType owningType, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, ProjectedPropertiesAnnotation projectedProperties) { DebugUtils.CheckNoExternalCallers(); ValidationUtils.ValidateAssociationLinkNotNull(associationLink); if (projectedProperties.ShouldSkipProperty(associationLink.Name)) { return; } this.ValidateAssociationLink(associationLink, owningType); duplicatePropertyNamesChecker.CheckForDuplicatePropertyNames(associationLink); AtomLinkMetadata linkMetadata = associationLink.GetAnnotation<AtomLinkMetadata>(); string linkRelation = AtomUtils.ComputeODataAssociationLinkRelation(associationLink); AtomLinkMetadata mergedLinkMetadata = ODataAtomWriterMetadataUtils.MergeLinkMetadata(linkMetadata, linkRelation, associationLink.Url, associationLink.Name, MimeConstants.MimeApplicationXml); this.atomEntryMetadataSerializer.WriteAtomLink(mergedLinkMetadata, null /* etag*/); }