diff --git a/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs b/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs index caad2af4..1a3eefdb 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs @@ -6,7 +6,9 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime; using Microsoft.OData.Edm; +using Microsoft.OData.Edm.Csdl; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.OData.Edm; using Microsoft.OpenApi.OData.Vocabulary.Capabilities; @@ -341,5 +343,53 @@ internal static string GenerateODataTypeCastPathOperationIdPrefix(ODataPath path return operationId; } + + /// + /// Strips or aliases namespace prefixes from an element name. + /// + /// The target element. + /// Optional: The Edm model. Used for searching for the namespace alias. + /// The OpenAPI convert settings. + /// The element name, alias-prefixed or namespace-stripped if applicable. + internal static string StripOrAliasNamespacePrefix(IEdmSchemaElement element, OpenApiConvertSettings settings, IEdmModel model = null) + { + Utils.CheckArgumentNull(element, nameof(element)); + Utils.CheckArgumentNull(settings, nameof(settings)); + + string namespaceAlias = string.Empty; + string namespaceName = element.Namespace; + string segmentName = element.FullName(); + + if (!string.IsNullOrEmpty(namespaceName) && model != null) + { + namespaceAlias = model.GetNamespaceAlias(namespaceName); + } + + if (element is IEdmStructuredType && settings.EnableAliasForTypeCastSegments && !string.IsNullOrEmpty(namespaceAlias)) + { + // Alias type cast segment name + segmentName = namespaceAlias.TrimEnd('.') + "." + element.Name; + } + + if (element is IEdmOperation) + { + if (settings.EnableAliasForOperationSegments && !string.IsNullOrEmpty(namespaceAlias)) + { + // Alias operation segment name + segmentName = namespaceAlias.TrimEnd('.') + "." + element.Name; + } + + if (!string.IsNullOrEmpty(settings.NamespacePrefixToStripForInMethodPaths) && + element.Namespace.Equals(settings.NamespacePrefixToStripForInMethodPaths, StringComparison.OrdinalIgnoreCase)) + { + // Strip specified namespace from operation segment name. + // If the namespace prefix to strip matches the namespace name, + // and the alias has been appended, the alias will be stripped. + segmentName = element.Name; + } + } + + return segmentName; + } } } \ No newline at end of file diff --git a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataOperationSegment.cs b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataOperationSegment.cs index 44e7f0f0..6ad4a2b5 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataOperationSegment.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataOperationSegment.cs @@ -1,4 +1,5 @@ -// ------------------------------------------------------------ +// ----- +// private readonly IEdmModel _model;------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. // ------------------------------------------------------------ @@ -48,6 +49,31 @@ public ODataOperationSegment(IEdmOperation operation, IDictionary + /// Initializes a new instance of class. + /// + /// The operation. + /// The Edm model. + public ODataOperationSegment(IEdmOperation operation, IEdmModel model) + : this(operation, false, model) + { + } + + /// + /// Initializes a new instance of class. + /// + /// The operation. + /// A value indicating this operation is an escaped function. + /// The Edm model. + public ODataOperationSegment(IEdmOperation operation, bool isEscapedFunction, IEdmModel model) + { + Operation = operation ?? throw Error.ArgumentNull(nameof(operation)); + IsEscapedFunction = isEscapedFunction; + _model = model ?? throw Error.ArgumentNull(nameof(model)); + } + + private readonly IEdmModel _model; + /// /// Gets the parameter mappings. /// @@ -116,12 +142,13 @@ private string OperationName(IEdmOperation operation, OpenApiConvertSettings set { return operation.Name; } + else if (_model != null) + { + return EdmModelHelper.StripOrAliasNamespacePrefix(operation, settings, _model); + } else { - string selectedName = operation.FullName(); - return !string.IsNullOrEmpty(settings.NamespacePrefixToStripForInMethodPaths) - ? selectedName.StripNamespacePrefix(settings.NamespacePrefixToStripForInMethodPaths) - : selectedName; + return operation.FullName(); } } @@ -167,5 +194,5 @@ public override IEnumerable GetAnnotables() { return new IEdmVocabularyAnnotatable[] { Operation }; } - } + } } \ No newline at end of file diff --git a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs index 868fd881..aaf66cfa 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs @@ -781,7 +781,7 @@ secondLastPathSegment is not ODataKeySegment && if (lastPathSegment is ODataTypeCastSegment && !convertSettings.AppendBoundOperationsOnDerivedTypeCastSegments) continue; if (lastPathSegment is ODataKeySegment segment && segment.IsAlternateKey) continue; ODataPath newPath = subPath.Clone(); - newPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction)); + newPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction, _model)); AppendPath(newPath); } } @@ -828,7 +828,7 @@ private void AppendBoundOperationOnNavigationPropertyPath(IEdmOperation edmOpera } ODataPath newPath = path.Clone(); - newPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction)); + newPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction, _model)); AppendPath(newPath); } } @@ -861,7 +861,7 @@ private void AppendBoundOperationOnDerived( if (ns is IEdmEntitySet) { ODataPath newPath = new ODataPath(new ODataNavigationSourceSegment(ns), new ODataTypeCastSegment(bindingEntityType, _model), - new ODataOperationSegment(edmOperation, isEscapedFunction)); + new ODataOperationSegment(edmOperation, isEscapedFunction, _model)); AppendPath(newPath); } } @@ -870,14 +870,14 @@ private void AppendBoundOperationOnDerived( if (ns is IEdmSingleton) { ODataPath newPath = new ODataPath(new ODataNavigationSourceSegment(ns), new ODataTypeCastSegment(bindingEntityType, _model), - new ODataOperationSegment(edmOperation, isEscapedFunction)); + new ODataOperationSegment(edmOperation, isEscapedFunction, _model)); AppendPath(newPath); } else { ODataPath newPath = new ODataPath(new ODataNavigationSourceSegment(ns), new ODataKeySegment(ns.EntityType()), new ODataTypeCastSegment(bindingEntityType , _model), - new ODataOperationSegment(edmOperation, isEscapedFunction)); + new ODataOperationSegment(edmOperation, isEscapedFunction, _model)); AppendPath(newPath); } } @@ -957,7 +957,7 @@ private void AppendBoundOperationOnDerivedNavigationPropertyPath( ODataPath newPath = path.Clone(); newPath.Push(new ODataTypeCastSegment(bindingEntityType, _model)); - newPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction)); + newPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction, _model)); AppendPath(newPath); } } diff --git a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataTypeCastSegment.cs b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataTypeCastSegment.cs index 718fc1c9..6a7e660e 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataTypeCastSegment.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataTypeCastSegment.cs @@ -3,11 +3,8 @@ // Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. // ------------------------------------------------------------ -using System; using System.Collections.Generic; -using System.Linq; using Microsoft.OData.Edm; -using Microsoft.OData.Edm.Csdl; using Microsoft.OData.Edm.Vocabularies; using Microsoft.OpenApi.OData.Common; @@ -53,20 +50,10 @@ public override IEnumerable GetAnnotables() public override string GetPathItemName(OpenApiConvertSettings settings, HashSet parameters) { Utils.CheckArgumentNull(settings, nameof(settings)); - string namespaceName = string.Empty; - string namespaceAlias = string.Empty; + - if (StructuredType is IEdmSchemaElement element) - namespaceName = element.Namespace; - - if (!string.IsNullOrEmpty(namespaceName)) - namespaceAlias = _model.GetNamespaceAlias(namespaceName); - - if(settings.EnableAliasForTypeCastSegments && !string.IsNullOrEmpty(namespaceAlias)) - { - return namespaceAlias.TrimEnd('.') + "." + StructuredType.FullTypeName().Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last(); - } - - return StructuredType.FullTypeName(); + return StructuredType is IEdmSchemaElement element && _model != null + ? EdmModelHelper.StripOrAliasNamespacePrefix(element, settings, _model) + : StructuredType.FullTypeName(); } -} \ No newline at end of file +} diff --git a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj index 0a2524b2..2fbe8f44 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj +++ b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj @@ -15,13 +15,14 @@ netstandard2.0 Microsoft.OpenApi.OData true - 1.4.0-preview1 + 1.4.0-preview2 This package contains the codes you need to convert OData CSDL to Open API Document of Model. © Microsoft Corporation. All rights reserved. Microsoft OpenApi OData EDM https://github.com/Microsoft/OpenAPI.NET.OData -- DELETE methods should always return response status code 204 +- DELETE methods should always return response status code #204 +- Aliases or strips namespace prefixes from segment names when and where applicable #365 Microsoft.OpenApi.OData.Reader ..\..\tool\Microsoft.OpenApi.OData.snk diff --git a/src/Microsoft.OpenApi.OData.Reader/OpenApiConvertSettings.cs b/src/Microsoft.OpenApi.OData.Reader/OpenApiConvertSettings.cs index aa26aba4..59d44012 100644 --- a/src/Microsoft.OpenApi.OData.Reader/OpenApiConvertSettings.cs +++ b/src/Microsoft.OpenApi.OData.Reader/OpenApiConvertSettings.cs @@ -336,6 +336,11 @@ public string PathPrefix /// public bool EnableAliasForTypeCastSegments { get; set; } = false; + /// + /// Enables the use of aliases for operation segments to shorten the url path. + /// + public bool EnableAliasForOperationSegments { get; set; } = false; + internal OpenApiConvertSettings Clone() { var newSettings = new OpenApiConvertSettings @@ -387,7 +392,8 @@ internal OpenApiConvertSettings Clone() AddAlternateKeyPaths = this.AddAlternateKeyPaths, NamespacePrefixToStripForInMethodPaths = this.NamespacePrefixToStripForInMethodPaths, EnableAliasForTypeCastSegments = this.EnableAliasForTypeCastSegments, - SemVerVersion = this.SemVerVersion + SemVerVersion = this.SemVerVersion, + EnableAliasForOperationSegments = this.EnableAliasForOperationSegments }; return newSettings; diff --git a/src/Microsoft.OpenApi.OData.Reader/PublicAPI.Unshipped.txt b/src/Microsoft.OpenApi.OData.Reader/PublicAPI.Unshipped.txt index 581b498a..a40f45f6 100644 --- a/src/Microsoft.OpenApi.OData.Reader/PublicAPI.Unshipped.txt +++ b/src/Microsoft.OpenApi.OData.Reader/PublicAPI.Unshipped.txt @@ -7,6 +7,13 @@ Microsoft.OpenApi.OData.Edm.EdmModelExtensions Microsoft.OpenApi.OData.Edm.EdmTypeExtensions Microsoft.OpenApi.OData.Edm.ODataKeySegment.IsAlternateKey.get -> bool Microsoft.OpenApi.OData.Edm.ODataKeySegment.IsAlternateKey.set -> void +Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation) -> void +Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation, bool isEscapedFunction) -> void +Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation, bool isEscapedFunction, Microsoft.OData.Edm.IEdmModel model) -> void +Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation, Microsoft.OData.Edm.IEdmModel model) -> void +Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation, System.Collections.Generic.IDictionary parameterMappings) -> void +Microsoft.OpenApi.OData.Edm.ODataPath.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings) -> string +Microsoft.OpenApi.OData.Edm.ODataSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings) -> string Microsoft.OpenApi.OData.Edm.ODataTypeCastSegment.ODataTypeCastSegment(Microsoft.OData.Edm.IEdmStructuredType structuredType, Microsoft.OData.Edm.IEdmModel model) -> void Microsoft.OpenApi.OData.OpenApiConvertSettings.AddAlternateKeyPaths.get -> bool Microsoft.OpenApi.OData.OpenApiConvertSettings.AddAlternateKeyPaths.set -> void @@ -14,6 +21,8 @@ Microsoft.OpenApi.OData.OpenApiConvertSettings.AppendBoundOperationsOnDerivedTyp Microsoft.OpenApi.OData.OpenApiConvertSettings.AppendBoundOperationsOnDerivedTypeCastSegments.set -> void Microsoft.OpenApi.OData.OpenApiConvertSettings.CustomHttpMethodLinkRelMapping.get -> System.Collections.Generic.Dictionary Microsoft.OpenApi.OData.OpenApiConvertSettings.CustomHttpMethodLinkRelMapping.set -> void +Microsoft.OpenApi.OData.OpenApiConvertSettings.EnableAliasForOperationSegments.get -> bool +Microsoft.OpenApi.OData.OpenApiConvertSettings.EnableAliasForOperationSegments.set -> void Microsoft.OpenApi.OData.OpenApiConvertSettings.EnableAliasForTypeCastSegments.get -> bool Microsoft.OpenApi.OData.OpenApiConvertSettings.EnableAliasForTypeCastSegments.set -> void Microsoft.OpenApi.OData.OpenApiConvertSettings.EnableCount.get -> bool @@ -47,6 +56,15 @@ Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey.Function = 5 -> Microsoft.Ope Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey.List = 1 -> Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey.ReadByKey = 0 -> Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey.Update = 3 -> Microsoft.OpenApi.OData.Vocabulary.Core.LinkRelKey +override Microsoft.OpenApi.OData.Edm.ODataComplexPropertySegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataMetadataSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataNavigationPropertySegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataOperationSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataRefSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataStreamContentSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataStreamPropertySegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string +override Microsoft.OpenApi.OData.Edm.ODataTypeCastSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string static Microsoft.OpenApi.OData.Common.OpenApiOperationExtensions.AddErrorResponses(this Microsoft.OpenApi.Models.OpenApiOperation operation, Microsoft.OpenApi.OData.OpenApiConvertSettings settings, bool addNoContent = false, Microsoft.OpenApi.Models.OpenApiSchema schema = null) -> void static Microsoft.OpenApi.OData.Edm.EdmModelExtensions.OperationTargetsMultiplePaths(this Microsoft.OData.Edm.IEdmModel model, Microsoft.OData.Edm.IEdmOperation operation) -> bool static Microsoft.OpenApi.OData.Edm.EdmTypeExtensions.ShouldPathParameterBeQuoted(this Microsoft.OData.Edm.IEdmType edmType, Microsoft.OpenApi.OData.OpenApiConvertSettings settings) -> bool @@ -74,9 +92,6 @@ Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.OperationImport.get -> M Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.ParameterMappings.get -> System.Collections.Generic.IDictionary Microsoft.OpenApi.OData.Edm.ODataOperationSegment Microsoft.OpenApi.OData.Edm.ODataOperationSegment.IsEscapedFunction.get -> bool -Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation) -> void -Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation, bool isEscapedFunction) -> void -Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ODataOperationSegment(Microsoft.OData.Edm.IEdmOperation operation, System.Collections.Generic.IDictionary parameterMappings) -> void Microsoft.OpenApi.OData.Edm.ODataOperationSegment.Operation.get -> Microsoft.OData.Edm.IEdmOperation Microsoft.OpenApi.OData.Edm.ODataOperationSegment.ParameterMappings.get -> System.Collections.Generic.IDictionary Microsoft.OpenApi.OData.Edm.ODataPath @@ -88,7 +103,6 @@ Microsoft.OpenApi.OData.Edm.ODataPath.FirstSegment.get -> Microsoft.OpenApi.ODat Microsoft.OpenApi.OData.Edm.ODataPath.GetCount(bool keySegmentAsDepth) -> int Microsoft.OpenApi.OData.Edm.ODataPath.GetEnumerator() -> System.Collections.Generic.IEnumerator Microsoft.OpenApi.OData.Edm.ODataPath.GetPathItemName() -> string -Microsoft.OpenApi.OData.Edm.ODataPath.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings) -> string Microsoft.OpenApi.OData.Edm.ODataPath.HttpMethods.get -> System.Collections.Generic.ISet Microsoft.OpenApi.OData.Edm.ODataPath.LastSegment.get -> Microsoft.OpenApi.OData.Edm.ODataSegment Microsoft.OpenApi.OData.Edm.ODataPath.ODataPath(params Microsoft.OpenApi.OData.Edm.ODataSegment[] segments) -> void @@ -114,7 +128,6 @@ Microsoft.OpenApi.OData.Edm.ODataPathProvider Microsoft.OpenApi.OData.Edm.ODataPathProvider.ODataPathProvider() -> void Microsoft.OpenApi.OData.Edm.ODataRefSegment Microsoft.OpenApi.OData.Edm.ODataSegment -Microsoft.OpenApi.OData.Edm.ODataSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings) -> string Microsoft.OpenApi.OData.Edm.ODataSegment.GetPathHash(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, Microsoft.OpenApi.OData.Edm.ODataPath path = null) -> string Microsoft.OpenApi.OData.Edm.ODataSegment.ODataSegment() -> void Microsoft.OpenApi.OData.Edm.ODataSegmentKind @@ -143,7 +156,6 @@ override Microsoft.OpenApi.OData.Edm.ODataComplexPropertySegment.Kind.get -> Mic override Microsoft.OpenApi.OData.Edm.ODataComplexPropertySegment.Identifier.get -> string Microsoft.OpenApi.OData.Edm.ODataComplexPropertySegment.ComplexType.get -> Microsoft.OData.Edm.IEdmComplexType override Microsoft.OpenApi.OData.Edm.ODataComplexPropertySegment.GetAnnotables() -> System.Collections.Generic.IEnumerable -override Microsoft.OpenApi.OData.Edm.ODataComplexPropertySegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string Microsoft.OpenApi.OData.EdmModelOpenApiExtensions Microsoft.OpenApi.OData.Extensions.IODataRoutePathPrefixProvider Microsoft.OpenApi.OData.Extensions.IODataRoutePathPrefixProvider.Parameters.get -> System.Collections.Generic.IEnumerable @@ -240,13 +252,11 @@ override Microsoft.OpenApi.OData.Edm.ODataKeySegment.GetPathItemName(Microsoft.O override Microsoft.OpenApi.OData.Edm.ODataKeySegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataKeySegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataKeySegment.GetAnnotables() -> System.Collections.Generic.IEnumerable -override Microsoft.OpenApi.OData.Edm.ODataMetadataSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataMetadataSegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataMetadataSegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType override Microsoft.OpenApi.OData.Edm.ODataMetadataSegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataMetadataSegment.GetAnnotables() -> System.Collections.Generic.IEnumerable override Microsoft.OpenApi.OData.Edm.ODataNavigationPropertySegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType -override Microsoft.OpenApi.OData.Edm.ODataNavigationPropertySegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataNavigationPropertySegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataNavigationPropertySegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataNavigationPropertySegment.GetAnnotables() -> System.Collections.Generic.IEnumerable @@ -255,34 +265,28 @@ override Microsoft.OpenApi.OData.Edm.ODataNavigationSourceSegment.GetPathItemNam override Microsoft.OpenApi.OData.Edm.ODataNavigationSourceSegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataNavigationSourceSegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataNavigationSourceSegment.GetAnnotables() -> System.Collections.Generic.IEnumerable -override Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType override Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataOperationImportSegment.GetAnnotables() -> System.Collections.Generic.IEnumerable -override Microsoft.OpenApi.OData.Edm.ODataOperationSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataOperationSegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataOperationSegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType override Microsoft.OpenApi.OData.Edm.ODataOperationSegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataOperationSegment.GetAnnotables() -> System.Collections.Generic.IEnumerable override Microsoft.OpenApi.OData.Edm.ODataPath.ToString() -> string -override Microsoft.OpenApi.OData.Edm.ODataRefSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataRefSegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataRefSegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType override Microsoft.OpenApi.OData.Edm.ODataRefSegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataRefSegment.GetAnnotables() -> System.Collections.Generic.IEnumerable -override Microsoft.OpenApi.OData.Edm.ODataStreamContentSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataStreamContentSegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataStreamContentSegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType override Microsoft.OpenApi.OData.Edm.ODataStreamContentSegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataStreamContentSegment.GetAnnotables() -> System.Collections.Generic.IEnumerable -override Microsoft.OpenApi.OData.Edm.ODataStreamPropertySegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataStreamPropertySegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataStreamPropertySegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType override Microsoft.OpenApi.OData.Edm.ODataStreamPropertySegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind override Microsoft.OpenApi.OData.Edm.ODataStreamPropertySegment.GetAnnotables() -> System.Collections.Generic.IEnumerable Microsoft.OpenApi.OData.Edm.ODataTypeCastSegment.StructuredType.get -> Microsoft.OData.Edm.IEdmStructuredType -override Microsoft.OpenApi.OData.Edm.ODataTypeCastSegment.GetPathItemName(Microsoft.OpenApi.OData.OpenApiConvertSettings settings, System.Collections.Generic.HashSet parameters) -> string override Microsoft.OpenApi.OData.Edm.ODataTypeCastSegment.Identifier.get -> string override Microsoft.OpenApi.OData.Edm.ODataTypeCastSegment.EntityType.get -> Microsoft.OData.Edm.IEdmEntityType override Microsoft.OpenApi.OData.Edm.ODataTypeCastSegment.Kind.get -> Microsoft.OpenApi.OData.Edm.ODataSegmentKind diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataOperationSegmentTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataOperationSegmentTests.cs index f65a5dd0..70d8a152 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataOperationSegmentTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataOperationSegmentTests.cs @@ -4,7 +4,9 @@ // ------------------------------------------------------------ using System; +using System.Runtime.CompilerServices; using Microsoft.OData.Edm; +using Microsoft.OData.Edm.Csdl; using Xunit; namespace Microsoft.OpenApi.OData.Edm.Tests @@ -73,24 +75,52 @@ public void GetPathItemNameReturnsCorrectActionLiteral(bool unqualifiedCall, boo } [Theory] - [InlineData(true, true, "MyFunction(param={param},param2=@param2)", null)] - [InlineData(true, false, "MyFunction(entity={entity},param={param},param2=@param2)", null)] - [InlineData(false, true, "XY.MyFunction(param={param},param2=@param2)", "NS")] - [InlineData(false, false, "XY.MyFunction(entity={entity},param={param},param2=@param2)", "NS")] - public void GetPathItemNameReturnsCorrectFunctionLiteral(bool unqualifiedCall, bool isBound, string expected, string namespacePrefixToStrip) + [InlineData(true, true, "MyFunction(param={param},param2=@param2)")] + [InlineData(true, false, "MyFunction(entity={entity},param={param},param2=@param2)")] + [InlineData(false, true, "NS.MyFunction(param={param},param2=@param2)")] + [InlineData(false, false, "NS.MyFunction(entity={entity},param={param},param2=@param2)")] + public void GetPathItemNameReturnsCorrectFunctionLiteral(bool unqualifiedCall, bool isBound, string expected) { // Arrange & Act - IEdmEntityTypeReference entityTypeReference = new EdmEntityTypeReference(new EdmEntityType("NS.XY", "Entity"), false); + IEdmEntityTypeReference entityTypeReference = new EdmEntityTypeReference(new EdmEntityType("NS", "Entity"), false); IEdmTypeReference parameterType = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Boolean, isNullable: false); - EdmFunction boundFunction = BoundFunction("MyFunction", isBound, entityTypeReference, namespaceIdentifier: "NS.XY"); + EdmFunction boundFunction = BoundFunction("MyFunction", isBound, entityTypeReference, namespaceIdentifier: "NS"); boundFunction.AddParameter("param", parameterType); boundFunction.AddOptionalParameter("param2", parameterType); var segment = new ODataOperationSegment(boundFunction); OpenApiConvertSettings settings = new OpenApiConvertSettings { - EnableUnqualifiedCall = unqualifiedCall, + EnableUnqualifiedCall = unqualifiedCall + }; + + // Assert + Assert.Equal(expected, segment.GetPathItemName(settings)); + } + + [Theory] + [InlineData("NS.XY.MyFunction(param={param},param2=@param2)", "NS", "NS.XY", false)] + [InlineData("MyFunction(param={param},param2=@param2)", "NS.XY", "NS.XY", false)] + [InlineData("N.MyFunction(param={param},param2=@param2)", "NS", "NS.XY", true)] + [InlineData("MyFunction(param={param},param2=@param2)", "NS.XY", "NS.XY", true)] + public void GetPathItemNameReturnsCorrectFunctionLiteralWhenSegmentAliasedOrNamespacePrefixStripped( + string expected, string namespacePrefixToStrip, string namespaceName, bool enableAlias) + { + // Arrange & Act + IEdmEntityTypeReference entityTypeReference = new EdmEntityTypeReference(new EdmEntityType(namespaceName, "Entity"), false); + IEdmTypeReference parameterType = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Boolean, isNullable: false); + EdmFunction boundFunction = BoundFunction("MyFunction", true, entityTypeReference, namespaceIdentifier: namespaceName); + boundFunction.AddParameter("param", parameterType); + boundFunction.AddOptionalParameter("param2", parameterType); + EdmModel model = new(); + model.AddElement(boundFunction); + model.SetNamespaceAlias(namespaceName, "N"); + + var segment = new ODataOperationSegment(boundFunction, model); + OpenApiConvertSettings settings = new() + { NamespacePrefixToStripForInMethodPaths = namespacePrefixToStrip, + EnableAliasForOperationSegments = enableAlias }; // Assert @@ -111,7 +141,7 @@ public void GetPathItemNameReturnsCorrectFunctionLiteralForEscapedFunction(bool boundFunction.AddParameter("param", parameterType); boundFunction.AddOptionalParameter("param2", parameterType); - var segment = new ODataOperationSegment(boundFunction, isEscapedFunction); + var segment = new ODataOperationSegment(boundFunction, isEscapedFunction, EdmCoreModel.Instance); OpenApiConvertSettings settings = new OpenApiConvertSettings { EnableUriEscapeFunctionCall = enableEscapeFunctionCall, @@ -136,7 +166,7 @@ public void GetPathItemNameReturnsCorrectFunctionLiteralForEscapedComposableFunc boundFunction.AddParameter("param", parameterType); boundFunction.AddOptionalParameter("param2", parameterType); - var segment = new ODataOperationSegment(boundFunction, isEscapedFunction); + var segment = new ODataOperationSegment(boundFunction, isEscapedFunction, EdmCoreModel.Instance); OpenApiConvertSettings settings = new OpenApiConvertSettings { EnableUriEscapeFunctionCall = enableEscapeFunctionCall,