diff options
Diffstat (limited to 'cps-rest/src/main')
-rwxr-xr-x | cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java | 43 | ||||
-rw-r--r-- | cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java | 96 |
2 files changed, 34 insertions, 105 deletions
diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java index be552ecc6a..b6a2e42a14 100755 --- a/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java +++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2020-2022 Bell Canada. * Modifications Copyright (C) 2021 Pantheon.tech - * Modifications Copyright (C) 2021-2024 Nordix Foundation + * Modifications Copyright (C) 2021-2025 Nordix Foundation * Modifications Copyright (C) 2022-2024 TechMahindra Ltd. * Modifications Copyright (C) 2022 Deutsche Telekom AG * ================================================================================ @@ -30,24 +30,19 @@ import io.micrometer.core.annotation.Timed; import jakarta.validation.ValidationException; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; -import org.onap.cps.api.model.Anchor; -import org.onap.cps.api.model.DataNode; +import org.onap.cps.api.CpsFacade; import org.onap.cps.api.model.DeltaReport; import org.onap.cps.api.parameters.FetchDescendantsOption; import org.onap.cps.rest.api.CpsDataApi; import org.onap.cps.utils.ContentType; -import org.onap.cps.utils.DataMapUtils; import org.onap.cps.utils.JsonObjectMapper; -import org.onap.cps.utils.PrefixResolver; import org.onap.cps.utils.XmlFileUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -64,10 +59,9 @@ public class DataRestController implements CpsDataApi { private static final String ISO_TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; private static final DateTimeFormatter ISO_TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern(ISO_TIMESTAMP_FORMAT); + private final CpsFacade cpsFacade; private final CpsDataService cpsDataService; - private final CpsAnchorService cpsAnchorService; private final JsonObjectMapper jsonObjectMapper; - private final PrefixResolver prefixResolver; @Override public ResponseEntity<String> createNode(final String apiVersion, @@ -116,24 +110,20 @@ public class DataRestController implements CpsDataApi { } @Override - @Timed(value = "cps.data.controller.datanode.get.v1", - description = "Time taken to get data node") + @Timed(value = "cps.data.controller.datanode.get.v1", description = "Time taken to get data node") public ResponseEntity<Object> getNodeByDataspaceAndAnchor(final String dataspaceName, final String anchorName, final String xpath, final Boolean includeDescendants) { - final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants) - ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS; - final DataNode dataNode = cpsDataService.getDataNodes(dataspaceName, anchorName, xpath, - fetchDescendantsOption).iterator().next(); - final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); - final String prefix = prefixResolver.getPrefix(anchor, dataNode.getXpath()); - return new ResponseEntity<>(DataMapUtils.toDataMapWithIdentifier(dataNode, prefix), HttpStatus.OK); + final FetchDescendantsOption fetchDescendantsOption = + FetchDescendantsOption.getFetchDescendantsOption(includeDescendants); + final Map<String, Object> dataNodeAsMap = + cpsFacade.getFirstDataNodeByAnchor(dataspaceName, anchorName, xpath, fetchDescendantsOption); + return new ResponseEntity<>(dataNodeAsMap, HttpStatus.OK); } @Override - @Timed(value = "cps.data.controller.datanode.get.v2", - description = "Time taken to get data node") + @Timed(value = "cps.data.controller.datanode.get.v2", description = "Time taken to get data node") public ResponseEntity<Object> getNodeByDataspaceAndAnchorV2(final String dataspaceName, final String anchorName, final String xpath, final String fetchDescendantsOptionAsString, @@ -141,16 +131,9 @@ public class DataRestController implements CpsDataApi { final ContentType contentType = ContentType.fromString(contentTypeInHeader); final FetchDescendantsOption fetchDescendantsOption = FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString); - final Collection<DataNode> dataNodes = cpsDataService.getDataNodes(dataspaceName, anchorName, xpath, - fetchDescendantsOption); - final List<Map<String, Object>> dataMaps = new ArrayList<>(dataNodes.size()); - final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); - for (final DataNode dataNode: dataNodes) { - final String prefix = prefixResolver.getPrefix(anchor, dataNode.getXpath()); - final Map<String, Object> dataMap = DataMapUtils.toDataMapWithIdentifier(dataNode, prefix); - dataMaps.add(dataMap); - } - return buildResponseEntity(dataMaps, contentType); + final List<Map<String, Object>> dataNodesAsMaps = + cpsFacade.getDataNodesByAnchor(dataspaceName, anchorName, xpath, fetchDescendantsOption); + return buildResponseEntity(dataNodesAsMaps, contentType); } @Override diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java index f8833094cf..11713ad5e7 100644 --- a/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java +++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2021-2024 Nordix Foundation + * Copyright (C) 2021-2025 Nordix Foundation * Modifications Copyright (C) 2022 Bell Canada. * Modifications Copyright (C) 2022-2024 TechMahindra Ltd. * ================================================================================ @@ -23,23 +23,15 @@ package org.onap.cps.rest.controller; import io.micrometer.core.annotation.Timed; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; -import org.onap.cps.api.CpsAnchorService; -import org.onap.cps.api.CpsQueryService; -import org.onap.cps.api.model.Anchor; -import org.onap.cps.api.model.DataNode; +import org.onap.cps.api.CpsFacade; import org.onap.cps.api.parameters.FetchDescendantsOption; import org.onap.cps.api.parameters.PaginationOption; import org.onap.cps.rest.api.CpsQueryApi; import org.onap.cps.utils.ContentType; -import org.onap.cps.utils.DataMapUtils; import org.onap.cps.utils.JsonObjectMapper; -import org.onap.cps.utils.PrefixResolver; import org.onap.cps.utils.XmlFileUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -51,27 +43,24 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class QueryRestController implements CpsQueryApi { - private final CpsQueryService cpsQueryService; - private final CpsAnchorService cpsAnchorService; + private final CpsFacade cpsFacade; private final JsonObjectMapper jsonObjectMapper; - private final PrefixResolver prefixResolver; @Override - @Timed(value = "cps.data.controller.datanode.query.v1", - description = "Time taken to query data nodes") + @Timed(value = "cps.data.controller.datanode.query.v1", description = "Time taken to query data nodes") public ResponseEntity<Object> getNodesByDataspaceAndAnchorAndCpsPath(final String dataspaceName, final String anchorName, final String cpsPath, final Boolean includeDescendants) { - final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants) - ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS; - return executeNodesByDataspaceQueryAndCreateResponse(dataspaceName, anchorName, cpsPath, - fetchDescendantsOption, ContentType.JSON); + final FetchDescendantsOption fetchDescendantsOption = + FetchDescendantsOption.getFetchDescendantsOption(includeDescendants); + final List<Map<String, Object>> dataNodesAsMaps + = cpsFacade.executeAnchorQuery(dataspaceName, anchorName, cpsPath, fetchDescendantsOption); + return buildResponseEntity(dataNodesAsMaps, ContentType.JSON); } @Override - @Timed(value = "cps.data.controller.datanode.query.v2", - description = "Time taken to query data nodes") + @Timed(value = "cps.data.controller.datanode.query.v2", description = "Time taken to query data nodes") public ResponseEntity<Object> getNodesByDataspaceAndAnchorAndCpsPathV2(final String dataspaceName, final String anchorName, final String cpsPath, @@ -80,8 +69,9 @@ public class QueryRestController implements CpsQueryApi { final ContentType contentType = ContentType.fromString(contentTypeInHeader); final FetchDescendantsOption fetchDescendantsOption = FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString); - return executeNodesByDataspaceQueryAndCreateResponse(dataspaceName, anchorName, cpsPath, - fetchDescendantsOption, contentType); + final List<Map<String, Object>> dataNodesAsMaps + = cpsFacade.executeAnchorQuery(dataspaceName, anchorName, cpsPath, fetchDescendantsOption); + return buildResponseEntity(dataNodesAsMaps, contentType); } @Override @@ -96,65 +86,21 @@ public class QueryRestController implements CpsQueryApi { FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString); final PaginationOption paginationOption = (pageIndex == null || pageSize == null) ? PaginationOption.NO_PAGINATION : new PaginationOption(pageIndex, pageSize); - final Collection<DataNode> dataNodes = cpsQueryService.queryDataNodesAcrossAnchors(dataspaceName, - cpsPath, fetchDescendantsOption, paginationOption); - final List<Map<String, Object>> dataNodesAsListOfMaps = new ArrayList<>(dataNodes.size()); - String prefix = null; - final Map<String, List<DataNode>> dataNodesPerAnchor = groupDataNodesPerAnchor(dataNodes); - for (final Map.Entry<String, List<DataNode>> dataNodesPerAnchorEntry : dataNodesPerAnchor.entrySet()) { - final String anchorName = dataNodesPerAnchorEntry.getKey(); - if (prefix == null) { - final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); - prefix = prefixResolver.getPrefix(anchor, dataNodesPerAnchorEntry.getValue().get(0).getXpath()); - } - final Map<String, Object> dataMap = DataMapUtils.toDataMapWithIdentifierAndAnchor( - dataNodesPerAnchorEntry.getValue(), anchorName, prefix); - dataNodesAsListOfMaps.add(dataMap); - } - final Integer totalPages = getTotalPages(dataspaceName, cpsPath, paginationOption); - return ResponseEntity.ok().header("total-pages", - totalPages.toString()).body(jsonObjectMapper.asJsonString(dataNodesAsListOfMaps)); - } + final List<Map<String, Object>> dataNodesAsMaps + = cpsFacade.executeDataspaceQuery(dataspaceName, cpsPath, fetchDescendantsOption, paginationOption); - private Integer getTotalPages(final String dataspaceName, final String cpsPath, - final PaginationOption paginationOption) { - if (paginationOption == PaginationOption.NO_PAGINATION) { - return 1; - } - final int totalAnchors = cpsQueryService.countAnchorsForDataspaceAndCpsPath(dataspaceName, cpsPath); - return totalAnchors <= paginationOption.getPageSize() ? 1 - : (int) Math.ceil((double) totalAnchors / paginationOption.getPageSize()); - } - - private static Map<String, List<DataNode>> groupDataNodesPerAnchor(final Collection<DataNode> dataNodes) { - return dataNodes.stream().collect(Collectors.groupingBy(DataNode::getAnchorName)); - } - - private ResponseEntity<Object> executeNodesByDataspaceQueryAndCreateResponse(final String dataspaceName, - final String anchorName, final String cpsPath, final FetchDescendantsOption fetchDescendantsOption, - final ContentType contentType) { - final Collection<DataNode> dataNodes = - cpsQueryService.queryDataNodes(dataspaceName, anchorName, cpsPath, fetchDescendantsOption); - final List<Map<String, Object>> dataNodesAsListOfMaps = new ArrayList<>(dataNodes.size()); - final Anchor anchor = cpsAnchorService.getAnchor(dataspaceName, anchorName); - String prefix = null; - for (final DataNode dataNode : dataNodes) { - if (prefix == null) { - prefix = prefixResolver.getPrefix(anchor, dataNode.getXpath()); - } - final Map<String, Object> dataMap = DataMapUtils.toDataMapWithIdentifier(dataNode, prefix); - dataNodesAsListOfMaps.add(dataMap); - } - return buildResponseEntity(dataNodesAsListOfMaps, contentType); + final int totalPages = cpsFacade.countAnchorsInDataspaceQuery(dataspaceName, cpsPath, paginationOption); + return ResponseEntity.ok().header("total-pages", String.valueOf(totalPages)) + .body(jsonObjectMapper.asJsonString(dataNodesAsMaps)); } - private ResponseEntity<Object> buildResponseEntity(final List<Map<String, Object>> dataNodesAsListOfMaps, + private ResponseEntity<Object> buildResponseEntity(final List<Map<String, Object>> dataNodesAsMaps, final ContentType contentType) { final String responseData; if (ContentType.XML.equals(contentType)) { - responseData = XmlFileUtils.convertDataMapsToXml(dataNodesAsListOfMaps); + responseData = XmlFileUtils.convertDataMapsToXml(dataNodesAsMaps); } else { - responseData = jsonObjectMapper.asJsonString(dataNodesAsListOfMaps); + responseData = jsonObjectMapper.asJsonString(dataNodesAsMaps); } return new ResponseEntity<>(responseData, HttpStatus.OK); } |