From 0bd192ca12ac2f768e44d0d3482785c79a881904 Mon Sep 17 00:00:00 2001 From: arpitsingh Date: Mon, 9 Jan 2023 19:53:10 +0530 Subject: CPS-1401 Implement V2 of GET Data Node API - Modified the GET Data Node API so it returns all the data nodes when xpath set to root "/" - Fragment Repository now returns a collection of Fragment Entities - Instead of returning only the first Fragment Entity now all fragment entities are returned when xpath is set to root - The Fragemnt Entities are further processed to a Collection of Data Nodes. As opposed to singular Data Node in current implementation. - Finally the DataRestController also returns a Collection of Data Nodes when xpath is set to root and valid data is present - Response body changed from JSON object to JSON Array. - Exception handling for invalid xpath and non-existing xpath is now done separately at persistence layer. - Refactored code against CPS-1422 - Deprecated getDataNode method from Service and Persistence layer - Modified V1 of Get Data Node API to use the getDataNodes method and get the first data node from the collection returned. - Modified NCMP to use getDataNodes method - NCMP still does not support multiple data nodes. It retrieves the first data node from the collection returned by getDataNodes Signed-off-by: arpitsingh Change-Id: I494a5740a53f65376d135fcb9f1e2e8900a2803e --- .../main/java/org/onap/cps/api/CpsDataService.java | 38 ++++++++++++---------- .../org/onap/cps/api/impl/CpsDataServiceImpl.java | 20 +++++++----- .../notification/CpsDataUpdatedEventFactory.java | 5 +-- .../onap/cps/spi/CpsDataPersistenceService.java | 35 +++++++++++--------- 4 files changed, 53 insertions(+), 45 deletions(-) (limited to 'cps-service/src/main') diff --git a/cps-service/src/main/java/org/onap/cps/api/CpsDataService.java b/cps-service/src/main/java/org/onap/cps/api/CpsDataService.java index 174d71f64d..9f96df2e4d 100644 --- a/cps-service/src/main/java/org/onap/cps/api/CpsDataService.java +++ b/cps-service/src/main/java/org/onap/cps/api/CpsDataService.java @@ -4,6 +4,7 @@ * Modifications Copyright (C) 2021 Pantheon.tech * Modifications Copyright (C) 2021-2022 Bell Canada * Modifications Copyright (C) 2022 Deutsche Telekom AG + * Modifications Copyright (C) 2023 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -110,30 +111,31 @@ public interface CpsDataService { Collection jsonDataList, OffsetDateTime observedTimestamp); /** - * Retrieves datanode by XPath for given dataspace and anchor. + * Retrieves all the datanodes by XPath for given dataspace and anchor. * - * @param dataspaceName dataspace name - * @param anchorName anchor name - * @param xpath xpath - * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes - * (recursively) as well - * @return data node object + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param xpath xpath + * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes + * (recursively) as well + * @return collection of data node objects */ - DataNode getDataNode(String dataspaceName, String anchorName, String xpath, - FetchDescendantsOption fetchDescendantsOption); + Collection getDataNodes(String dataspaceName, String anchorName, String xpath, + FetchDescendantsOption fetchDescendantsOption); /** - * Retrieves datanodes by XPath for given dataspace and anchor. + * Retrieves all the datanodes for multiple XPaths for given dataspace and anchor. * - * @param dataspaceName dataspace name - * @param anchorName anchor name - * @param xpaths collection of xpath - * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes - * (recursively) as well - * @return data node object + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param xpaths collection of xpaths + * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes + * (recursively) as well + * @return collection of data node objects */ - Collection getDataNodes(String dataspaceName, String anchorName, Collection xpaths, - FetchDescendantsOption fetchDescendantsOption); + Collection getDataNodesForMultipleXpaths(String dataspaceName, String anchorName, + Collection xpaths, + FetchDescendantsOption fetchDescendantsOption); /** * Updates data node for given dataspace and anchor using xpath to parent node. diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java index 06a0845385..b149d426e1 100755 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDataServiceImpl.java @@ -3,7 +3,7 @@ * Copyright (C) 2021-2023 Nordix Foundation * Modifications Copyright (C) 2020-2022 Bell Canada. * Modifications Copyright (C) 2021 Pantheon.tech - * Modifications Copyright (C) 2022 TechMahindra Ltd. + * Modifications Copyright (C) 2022-2023 TechMahindra Ltd. * Modifications Copyright (C) 2022 Deutsche Telekom AG * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -134,21 +134,23 @@ public class CpsDataServiceImpl implements CpsDataService { @Override @Timed(value = "cps.data.service.datanode.get", - description = "Time taken to get a data node") - public DataNode getDataNode(final String dataspaceName, final String anchorName, final String xpath, - final FetchDescendantsOption fetchDescendantsOption) { + description = "Time taken to get data nodes for an xpath") + public Collection getDataNodes(final String dataspaceName, final String anchorName, + final String xpath, + final FetchDescendantsOption fetchDescendantsOption) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - return cpsDataPersistenceService.getDataNode(dataspaceName, anchorName, xpath, fetchDescendantsOption); + return cpsDataPersistenceService.getDataNodes(dataspaceName, anchorName, xpath, fetchDescendantsOption); } @Override @Timed(value = "cps.data.service.datanode.batch.get", description = "Time taken to get a batch of data nodes") - public Collection getDataNodes(final String dataspaceName, final String anchorName, - final Collection xpaths, - final FetchDescendantsOption fetchDescendantsOption) { + public Collection getDataNodesForMultipleXpaths(final String dataspaceName, final String anchorName, + final Collection xpaths, + final FetchDescendantsOption fetchDescendantsOption) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); - return cpsDataPersistenceService.getDataNodes(dataspaceName, anchorName, xpaths, fetchDescendantsOption); + return cpsDataPersistenceService.getDataNodesForMultipleXpaths(dataspaceName, anchorName, xpaths, + fetchDescendantsOption); } @Override diff --git a/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java b/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java index f0cdaee8d6..38f8988279 100644 --- a/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java +++ b/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (c) 2021-2022 Bell Canada. * Modifications Copyright (c) 2022 Nordix Foundation + * Modifications Copyright (C) 2023 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -76,8 +77,8 @@ public class CpsDataUpdatedEventFactory { public CpsDataUpdatedEvent createCpsDataUpdatedEvent(final Anchor anchor, final OffsetDateTime observedTimestamp, final Operation operation) { final var dataNode = (operation == Operation.DELETE) ? null : - cpsDataService.getDataNode(anchor.getDataspaceName(), anchor.getName(), - "/", FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS); + cpsDataService.getDataNodes(anchor.getDataspaceName(), anchor.getName(), + "/", FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS).iterator().next(); return toCpsDataUpdatedEvent(anchor, dataNode, observedTimestamp, operation); } diff --git a/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java b/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java index 3e0b4475e8..0b2cef9bd9 100644 --- a/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java +++ b/cps-service/src/main/java/org/onap/cps/spi/CpsDataPersistenceService.java @@ -3,7 +3,7 @@ * Copyright (C) 2020-2023 Nordix Foundation. * Modifications Copyright (C) 2021 Pantheon.tech * Modifications Copyright (C) 2022 Bell Canada - * Modifications Copyright (C) 2022 TechMahindra Ltd. + * Modifications Copyright (C) 2022-2023 TechMahindra Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -99,30 +99,33 @@ public interface CpsDataPersistenceService { Collection> newLists); /** - * Retrieves datanode by XPath for given dataspace and anchor. + * Retrieves multiple datanodes for a single XPath for given dataspace and anchor. + * Multiple data nodes are returned when xPath is set to root '/', otherwise single data node + * is returned when a specific xpath is used (Example: /bookstore). * * @param dataspaceName dataspace name * @param anchorName anchor name - * @param xpath xpath + * @param xpath one xpath * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes * (recursively) as well - * @return data node object + * @return collection of data node object */ - DataNode getDataNode(String dataspaceName, String anchorName, String xpath, - FetchDescendantsOption fetchDescendantsOption); + Collection getDataNodes(String dataspaceName, String anchorName, String xpath, + FetchDescendantsOption fetchDescendantsOption); /** - * Retrieves datanode by XPath for given dataspace and anchor. + * Retrieves multiple datanodes for multiple XPaths, given a dataspace and anchor. * - * @param dataspaceName dataspace name - * @param anchorName anchor name - * @param xpaths collection of xpaths - * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes - * (recursively) as well - * @return data node object - */ - Collection getDataNodes(String dataspaceName, String anchorName, Collection xpaths, - FetchDescendantsOption fetchDescendantsOption); + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param xpaths collection of xpaths + * @param fetchDescendantsOption defines the scope of data to fetch: either single node or all the descendant nodes + * (recursively) as well + * @return collection of data node object + */ + Collection getDataNodesForMultipleXpaths(String dataspaceName, String anchorName, + Collection xpaths, + FetchDescendantsOption fetchDescendantsOption); /** * Updates leaves for existing data node. -- cgit 1.2.3-korg