/// <summary> /// Initializes a new instance of the <see cref="ODataMissingOperationGenerator"/> class. /// </summary> /// <param name="resourceMetadataContext">The metadata context of the resource to generate the missing operations for.</param> /// <param name="metadataContext">The current resource metadata context.</param> internal ODataMissingOperationGenerator(IODataResourceMetadataContext resourceMetadataContext, IODataMetadataContext metadataContext) { Debug.Assert(resourceMetadataContext != null, "resourceMetadataContext != null"); Debug.Assert(metadataContext != null, "metadataContext != null"); this.resourceMetadataContext = resourceMetadataContext; this.metadataContext = metadataContext; }
/// <summary> /// Constructor /// </summary> /// <param name="resourceMetadataContext">The context to answer basic metadata questions about the resource.</param> /// <param name="metadataContext">The metadata context.</param> /// <param name="uriBuilder">The uri builder to use.</param> internal ODataConventionalResourceMetadataBuilder(IODataResourceMetadataContext resourceMetadataContext, IODataMetadataContext metadataContext, ODataUriBuilder uriBuilder) { Debug.Assert(resourceMetadataContext != null, "resourceMetadataContext != null"); Debug.Assert(metadataContext != null, "metadataContext != null"); Debug.Assert(uriBuilder != null, "uriBuilder != null"); this.ResourceMetadataContext = resourceMetadataContext; this.UriBuilder = uriBuilder; this.MetadataContext = metadataContext; this.ProcessedNestedResourceInfos = new HashSet <string>(StringComparer.Ordinal); this.resource = resourceMetadataContext.Resource; }
/// <summary> /// Creates the metadata builder for the given resource. If such a builder is set, asking for payload /// metadata properties (like EditLink) of the resource may return a value computed by convention, /// depending on the metadata level and whether the user manually set an edit link or not. /// </summary> /// <param name="resource">The resource to create the metadata builder for.</param> /// <param name="typeContext">The context object to answer basic questions regarding the type of the resource or resource set.</param> /// <param name="serializationInfo">The serialization info for the resource.</param> /// <param name="actualResourceType">The structured type of the resource.</param> /// <param name="selectedProperties">The selected properties of this scope.</param> /// <param name="isResponse">true if the resource metadata builder to create should be for a response payload; false for a request.</param> /// <param name="keyAsSegment">true if keys should go in separate segments in auto-generated URIs, false if they should go in parentheses.</param> /// <param name="odataUri">The OData Uri.</param> /// <param name="settings">OData message writer settings.</param> /// <returns>The created metadata builder.</returns> internal override ODataResourceMetadataBuilder CreateResourceMetadataBuilder( ODataResourceBase resource, IODataResourceTypeContext typeContext, ODataResourceSerializationInfo serializationInfo, IEdmStructuredType actualResourceType, SelectedPropertiesNode selectedProperties, bool isResponse, bool keyAsSegment, ODataUri odataUri, ODataMessageWriterSettings settings) { Debug.Assert(resource != null, "resource != null"); Debug.Assert(typeContext != null, "typeContext != null"); Debug.Assert(selectedProperties != null, "selectedProperties != null"); IODataMetadataContext metadataContext = new ODataMetadataContext( isResponse, this.model, this.NonNullMetadataDocumentUri, odataUri); ODataConventionalUriBuilder uriBuilder = new ODataConventionalUriBuilder(metadataContext.ServiceBaseUri, keyAsSegment ? ODataUrlKeyDelimiter.Slash : ODataUrlKeyDelimiter.Parentheses); IODataResourceMetadataContext resourceMetadataContext = ODataResourceMetadataContext.Create(resource, typeContext, serializationInfo, actualResourceType, metadataContext, selectedProperties, settings != null ? settings.MetadataSelector : null); // Create ODataConventionalEntityMetadataBuilder if actualResourceType is entity type or typeContext.NavigationSourceKind is not none (complex type would be none) for no model scenario. if (actualResourceType != null && actualResourceType.TypeKind == EdmTypeKind.Entity || actualResourceType == null && typeContext.NavigationSourceKind != EdmNavigationSourceKind.None) { return(new ODataConventionalEntityMetadataBuilder(resourceMetadataContext, metadataContext, uriBuilder)); } else { return(new ODataConventionalResourceMetadataBuilder(resourceMetadataContext, metadataContext, uriBuilder)); } }
/// <summary> /// Gets a resource metadata builder for the given resource. /// </summary> /// <param name="resourceState">Resource state to use as reference for information needed by the builder.</param> /// <param name="useKeyAsSegment">true if keys should go in separate segments in auto-generated URIs, false if they should go in parentheses.</param> /// <param name="isDelta">true if the payload being read is a delta payload</param> /// <returns>A resource metadata builder.</returns> public ODataResourceMetadataBuilder GetResourceMetadataBuilderForReader(IODataJsonLightReaderResourceState resourceState, bool useKeyAsSegment, bool isDelta = false) { Debug.Assert(resourceState != null, "resource != null"); // Only apply the conventional template builder on response. On a request we would only report what's on the wire. if (resourceState.MetadataBuilder == null) { ODataResourceBase resource = resourceState.Resource; if (this.isResponse && !isDelta) { ODataTypeAnnotation typeAnnotation = resource.TypeAnnotation; IEdmStructuredType structuredType = null; if (typeAnnotation != null) { if (typeAnnotation.Type != null) { // First try ODataTypeAnnotation.Type (for perf improvement) structuredType = typeAnnotation.Type as IEdmStructuredType; } else if (typeAnnotation.TypeName != null) { // Then try ODataTypeAnnotation.TypeName structuredType = this.model.FindType(typeAnnotation.TypeName) as IEdmStructuredType; } } if (structuredType == null) { // No type name read from the payload. Use resource type from model. structuredType = resourceState.ResourceType; } IEdmNavigationSource navigationSource = resourceState.NavigationSource; IEdmEntityType navigationSourceElementType = this.edmTypeResolver.GetElementType(navigationSource); IODataResourceTypeContext typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/ null, navigationSource, navigationSourceElementType, resourceState.ResourceTypeFromMetadata ?? resourceState.ResourceType, /*throwIfMissingTypeInfo*/ true); IODataResourceMetadataContext resourceMetadataContext = ODataResourceMetadataContext.Create(resource, typeContext, /*serializationInfo*/ null, structuredType, this, resourceState.SelectedProperties); ODataConventionalUriBuilder uriBuilder = new ODataConventionalUriBuilder(this.ServiceBaseUri, useKeyAsSegment ? ODataUrlKeyDelimiter.Slash : ODataUrlKeyDelimiter.Parentheses); if (structuredType.IsODataEntityTypeKind()) { resourceState.MetadataBuilder = new ODataConventionalEntityMetadataBuilder(resourceMetadataContext, this, uriBuilder); } else { resourceState.MetadataBuilder = new ODataConventionalResourceMetadataBuilder(resourceMetadataContext, this, uriBuilder); } } else { resourceState.MetadataBuilder = new NoOpResourceMetadataBuilder(resource); } } return(resourceState.MetadataBuilder); }
/// <summary> /// Constructor /// </summary> /// <param name="resourceMetadataContext">The context to answer basic metadata questions about the resource.</param> /// <param name="metadataContext">The metadata context.</param> /// <param name="uriBuilder">The uri builder to use.</param> internal ODataConventionalEntityMetadataBuilder(IODataResourceMetadataContext resourceMetadataContext, IODataMetadataContext metadataContext, ODataUriBuilder uriBuilder) : base(resourceMetadataContext, metadataContext, uriBuilder) { this.isResourceEnd = true; // Keep default behavior }
/// <summary> /// Constructor /// </summary> /// <param name="resourceMetadataContext">The context to answer basic metadata questions about the resource.</param> /// <param name="metadataContext">The metadata context.</param> /// <param name="uriBuilder">The uri builder to use.</param> internal ODataConventionalIdMetadataBuilder(IODataResourceMetadataContext resourceMetadataContext, IODataMetadataContext metadataContext, ODataUriBuilder uriBuilder) : base(resourceMetadataContext, metadataContext, uriBuilder) { }