From d1fc8ac9e85cac38418bd2f049fbb9d4d36c4606 Mon Sep 17 00:00:00 2001 From: tharikaGitHub Date: Tue, 29 Sep 2020 11:49:40 +0530 Subject: [PATCH] Improve resource order in synpase artifact according to API payload --- .../wso2/carbon/apimgt/api/APIDefinition.java | 6 ++--- .../carbon/apimgt/api/model/SwaggerData.java | 3 ++- .../carbon/apimgt/impl/dao/ApiMgtDAO.java | 4 +-- .../impl/dao/constants/SQLConstants.java | 3 ++- .../apimgt/impl/definitions/OAS2Parser.java | 24 ++++++++++++++++++ .../apimgt/impl/definitions/OAS3Parser.java | 25 +++++++++++++++++++ 6 files changed, 58 insertions(+), 7 deletions(-) diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIDefinition.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIDefinition.java index 242168864d3c..543ffbe6c9bd 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIDefinition.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIDefinition.java @@ -24,7 +24,7 @@ import org.wso2.carbon.apimgt.api.model.URITemplate; import java.util.ArrayList; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -113,11 +113,11 @@ public List getPathParamNames(String uriTemplate) { * @return a structured uri template map using provided Swagger Data Resource Paths */ public Map> getResourceMap(SwaggerData swaggerData) { - Map> uriTemplateMap = new HashMap<>(); + Map> uriTemplateMap = new LinkedHashMap<>(); for (SwaggerData.Resource resource : swaggerData.getResources()) { Map resources = uriTemplateMap.get(resource.getPath()); if (resources == null) { - resources = new HashMap<>(); + resources = new LinkedHashMap<>(); uriTemplateMap.put(resource.getPath(), resources); } resources.put(resource.getVerb().toUpperCase(), resource); diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/SwaggerData.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/SwaggerData.java index 1a1f8f75f38e..278cb24fbed2 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/SwaggerData.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/SwaggerData.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -116,7 +117,7 @@ public void setScopes(List scopes) { private String transportType; private String security; private String apiLevelPolicy; - private Set resources = new HashSet<>(); + private Set resources = new LinkedHashSet<>(); private Set scopes = new HashSet<>(); public SwaggerData(API api) { diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/ApiMgtDAO.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/ApiMgtDAO.java index 79c45205084b..c3cc9f6a0b17 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/ApiMgtDAO.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/ApiMgtDAO.java @@ -7349,7 +7349,7 @@ public HashMap getURITemplatesPerAPIAsString(APIIdentifier ident public Set getURITemplatesOfAPI(APIIdentifier identifier) throws APIManagementException { - Map uriTemplates = new HashMap<>(); + Map uriTemplates = new LinkedHashMap<>(); Map> scopeToURITemplateId = new HashMap<>(); try (Connection conn = APIMgtDBUtil.getConnection(); @@ -7410,7 +7410,7 @@ public Set getURITemplatesOfAPI(APIIdentifier identifier) handleException("Failed to get URI Templates of API" + identifier, e); } - return new HashSet<>(uriTemplates.values()); + return new LinkedHashSet<>(uriTemplates.values()); } private void setAssociatedAPIProducts(APIIdentifier identifier, Map uriTemplates) diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/constants/SQLConstants.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/constants/SQLConstants.java index 76d99cfffe8a..984fdd03a22d 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/constants/SQLConstants.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dao/constants/SQLConstants.java @@ -2154,7 +2154,8 @@ public class SQLConstants { " WHERE " + " API.API_PROVIDER = ? AND " + " API.API_NAME = ? AND " + - " API.API_VERSION = ? "; + " API.API_VERSION = ? " + + " ORDER BY AUM.URL_MAPPING_ID ASC "; public static final String GET_API_PRODUCT_URI_TEMPLATE_ASSOCIATION_SQL = " SELECT " + diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS2Parser.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS2Parser.java index 3a88d3bee52b..a5d1ca0a3c05 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS2Parser.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS2Parser.java @@ -595,9 +595,33 @@ private String generateAPIDefinition(SwaggerData swaggerData, Swagger swaggerObj if (StringUtils.isEmpty(swaggerObj.getInfo().getVersion())) { swaggerObj.getInfo().setVersion(swaggerData.getVersion()); } + preserveResourcePathOrderFromAPI(swaggerData, swaggerObj); return getSwaggerJsonString(swaggerObj); } + /** + * Preserve and rearrange the Swagger definition according to the resource path order of the updating API payload. + * + * @param swaggerData Updating API swagger data + * @param swaggerObj Updated Swagger definition + */ + private void preserveResourcePathOrderFromAPI(SwaggerData swaggerData, Swagger swaggerObj) { + + Set orderedResourcePaths = new LinkedHashSet<>(); + Map orderedSwaggerPaths = new LinkedHashMap<>(); + // Iterate the URI template order given in the updating API payload (Swagger Data) and rearrange resource paths + // order in OpenAPI with relevance to the first matching resource path item from the swagger data path list. + for (SwaggerData.Resource resource : swaggerData.getResources()) { + String path = resource.getPath(); + if (!orderedResourcePaths.contains(path)) { + orderedResourcePaths.add(path); + // Get the resource path item for the path from existing Swagger + orderedSwaggerPaths.put(path, swaggerObj.getPath(path)); + } + } + swaggerObj.setPaths(orderedSwaggerPaths); + } + /** * This method validates the given OpenAPI definition by content * diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS3Parser.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS3Parser.java index 699d8f7f9c0c..23c542ff8879 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS3Parser.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/definitions/OAS3Parser.java @@ -605,9 +605,34 @@ private String generateAPIDefinition(SwaggerData swaggerData, OpenAPI openAPI) t if (StringUtils.isEmpty(openAPI.getInfo().getVersion())) { openAPI.getInfo().setVersion(swaggerData.getVersion()); } + preserveResourcePathOrderFromAPI(swaggerData, openAPI); return Json.pretty(openAPI); } + /** + * Preserve and rearrange the OpenAPI definition according to the resource path order of the updating API payload. + * + * @param swaggerData Updating API swagger data + * @param openAPI Updated OpenAPI definition + */ + private void preserveResourcePathOrderFromAPI(SwaggerData swaggerData, OpenAPI openAPI) { + + Set orderedResourcePaths = new LinkedHashSet<>(); + Paths orderedOpenAPIPaths = new Paths(); + // Iterate the URI template order given in the updating API payload (Swagger Data) and rearrange resource paths + // order in OpenAPI with relevance to the first matching resource path item from the swagger data path list. + for (SwaggerData.Resource resource : swaggerData.getResources()) { + String path = resource.getPath(); + if (!orderedResourcePaths.contains(path)) { + orderedResourcePaths.add(path); + // Get the resource path item for the path from existing OpenAPI + PathItem resourcePathItem = openAPI.getPaths().get(path); + orderedOpenAPIPaths.addPathItem(path, resourcePathItem); + } + } + openAPI.setPaths(orderedOpenAPIPaths); + } + /** * Construct path parameters to the Operation *