From 1b24c762f4fb5ce572529f41e66c9f1c605c84be Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 3 Oct 2023 17:40:38 +0300 Subject: [PATCH 1/3] Refactor method --- .../Common/EdmModelHelper.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs b/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs index 84955dfc..45e22c69 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Common/EdmModelHelper.cs @@ -393,25 +393,26 @@ internal static string StripOrAliasNamespacePrefix(IEdmSchemaElement element, Op return segmentName; } - + /// /// Checks whether an operation is allowed on a model element. /// /// The Edm model. /// The target operation. /// The model element. + /// Optional: Default is true. + /// The operation will be allowed by default if the annotation Org.OData.Core.V1.RequiresExplicitBinding is undefined for the given operation. /// true if the operation is allowed, otherwise false. - internal static bool IsOperationAllowed(IEdmModel model, IEdmOperation edmOperation, IEdmVocabularyAnnotatable annotatable) + internal static bool IsOperationAllowed(IEdmModel model, IEdmOperation edmOperation, IEdmVocabularyAnnotatable annotatable, bool operationAllowed = true) { Utils.CheckArgumentNull(model, nameof(model)); Utils.CheckArgumentNull(edmOperation, nameof(edmOperation)); Utils.CheckArgumentNull(annotatable, nameof(annotatable)); var requiresExplicitBinding = model.FindVocabularyAnnotations(edmOperation).FirstOrDefault(x => x.Term.Name == CapabilitiesConstants.RequiresExplicitBindingName); - if (requiresExplicitBinding == null) { - return true; + return operationAllowed; } var boundOperations = model.GetCollection(annotatable, CapabilitiesConstants.ExplicitOperationBindings)?.ToList(); From 6fa4bb7828faee9dde93bb7b56b5ce66fe297b7f Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 3 Oct 2023 17:50:35 +0300 Subject: [PATCH 2/3] Refactor use of containment when checking whether to append operation on path --- .../Edm/ODataPathProvider.cs | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs index c516f055..8c81f4b3 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs @@ -802,7 +802,7 @@ secondLastPathSegment is not ODataKeySegment && if (annotatable != null && !EdmModelHelper.IsOperationAllowed(_model, edmOperation, annotatable)) { continue; - } + } } ODataPath newPath = subPath.Clone(); @@ -824,13 +824,8 @@ private void AppendBoundOperationOnNavigationPropertyPath(IEdmOperation edmOpera foreach (var path in value.Where(x => !_pathKindToSkipForNavigationProperties.Contains(x.Kind))) { ODataNavigationPropertySegment npSegment = path.Segments.Last(s => s is ODataNavigationPropertySegment) as ODataNavigationPropertySegment; - - if (!npSegment.NavigationProperty.ContainsTarget) - { - continue; - } - if (!EdmModelHelper.IsOperationAllowed(_model, edmOperation, npSegment.NavigationProperty)) + if (!EdmModelHelper.IsOperationAllowed(_model, edmOperation, npSegment.NavigationProperty, npSegment.NavigationProperty.ContainsTarget)) { continue; } @@ -954,12 +949,7 @@ private void AppendBoundOperationOnDerivedNavigationPropertyPath( continue; } - if (!npSegment.NavigationProperty.ContainsTarget) - { - continue; - } - - if (!EdmModelHelper.IsOperationAllowed(_model, edmOperation, npSegment.NavigationProperty)) + if (!EdmModelHelper.IsOperationAllowed(_model, edmOperation, npSegment.NavigationProperty, npSegment.NavigationProperty.ContainsTarget)) { continue; } From 5c97ab135f3da8a6466821faac081de37cd22d15 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 4 Oct 2023 12:25:34 +0300 Subject: [PATCH 3/3] Update release notes --- .../Microsoft.OpenAPI.OData.Reader.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 036ea5a6..4c537ad9 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj +++ b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj @@ -15,7 +15,7 @@ netstandard2.0 Microsoft.OpenApi.OData true - 1.5.0-preview4 + 1.5.0-preview5 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 @@ -25,6 +25,7 @@ - Updates README #13, #253, #40 - Fixes casing in default propertyName for `innerError` in the `ErrorMainSchema` - Adds support for `x-ms-enum-flags` extension for flagged enums +- Use containment together with RequiresExplicitBinding annotation to check whether to append bound operations to navigation properties #430 Microsoft.OpenApi.OData.Reader ..\..\tool\Microsoft.OpenApi.OData.snk