From 24c72db6b3674bde16eb5a7313d71f507a880de9 Mon Sep 17 00:00:00 2001 From: Ruslan Kashapov Date: Tue, 9 Feb 2021 17:25:18 +0200 Subject: Data fragment update by xpath #3 - rest and service layers Issue-ID: CPS-58 Change-Id: Ie224da95b07748b63648226df6484cebae91cdec Signed-off-by: Ruslan Kashapov --- .../main/java/org/onap/cps/api/CpsDataService.java | 21 +++++++++ .../org/onap/cps/api/impl/CpsDataServiceImpl.java | 50 ++++++++++++++++++---- 2 files changed, 62 insertions(+), 9 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 7960d12ef..54d925891 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 @@ -53,4 +53,25 @@ public interface CpsDataService { DataNode getDataNode(@NonNull String dataspaceName, @NonNull String anchorName, @NonNull String xpath, @NonNull FetchDescendantsOption fetchDescendantsOption); + /** + * Updates data node for given dataspace and anchor using xpath to parent node. + * + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param parentNodeXpath xpath to parent node + * @param jsonData json data + */ + void updateNodeLeaves(@NonNull String dataspaceName, @NonNull String anchorName, @NonNull String parentNodeXpath, + @NonNull String jsonData); + + /** + * Replaces existing data node content including descendants. + * + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param parentNodeXpath xpath to parent node + * @param jsonData json data + */ + void replaceNodeTree(@NonNull String dataspaceName, @NonNull String anchorName, @NonNull String parentNodeXpath, + @NonNull String jsonData); } 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 d7d25b98b..6f7d6439b 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 @@ -38,6 +38,8 @@ import org.springframework.stereotype.Service; @Service public class CpsDataServiceImpl implements CpsDataService { + private static final String ROOT_NODE_XPATH = "/"; + @Autowired private CpsDataPersistenceService cpsDataPersistenceService; @@ -52,15 +54,8 @@ public class CpsDataServiceImpl implements CpsDataService { @Override public void saveData(final String dataspaceName, final String anchorName, final String jsonData) { - final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); - final SchemaContext schemaContext = getSchemaContext(dataspaceName, anchor.getSchemaSetName()); - final NormalizedNode normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext); - final DataNode dataNode = new DataNodeBuilder().withNormalizedNodeTree(normalizedNode).build(); - cpsDataPersistenceService.storeDataNode(dataspaceName, anchor.getName(), dataNode); - } - - private SchemaContext getSchemaContext(final String dataspaceName, final String schemaSetName) { - return yangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName).getSchemaContext(); + final DataNode dataNode = buildDataNodeFromJson(dataspaceName, anchorName, ROOT_NODE_XPATH, jsonData); + cpsDataPersistenceService.storeDataNode(dataspaceName, anchorName, dataNode); } @Override @@ -68,4 +63,41 @@ public class CpsDataServiceImpl implements CpsDataService { final FetchDescendantsOption fetchDescendantsOption) { return cpsDataPersistenceService.getDataNode(dataspaceName, anchorName, xpath, fetchDescendantsOption); } + + @Override + public void updateNodeLeaves(final String dataspaceName, final String anchorName, final String parentNodeXpath, + final String jsonData) { + final DataNode dataNode = buildDataNodeFromJson(dataspaceName, anchorName, parentNodeXpath, jsonData); + cpsDataPersistenceService + .updateDataLeaves(dataspaceName, anchorName, dataNode.getXpath(), dataNode.getLeaves()); + } + + @Override + public void replaceNodeTree(final String dataspaceName, final String anchorName, final String parentNodeXpath, + final String jsonData) { + final DataNode dataNode = buildDataNodeFromJson(dataspaceName, anchorName, parentNodeXpath, jsonData); + cpsDataPersistenceService.replaceDataNodeTree(dataspaceName, anchorName, dataNode); + } + + private DataNode buildDataNodeFromJson(final String dataspaceName, final String anchorName, + final String parentNodeXpath, final String jsonData) { + + final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); + final SchemaContext schemaContext = getSchemaContext(dataspaceName, anchor.getSchemaSetName()); + + if (ROOT_NODE_XPATH.equals(parentNodeXpath)) { + final NormalizedNode normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext); + return new DataNodeBuilder().withNormalizedNodeTree(normalizedNode).build(); + } + + final NormalizedNode normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext, parentNodeXpath); + return new DataNodeBuilder() + .withParentNodeXpath(parentNodeXpath) + .withNormalizedNodeTree(normalizedNode) + .build(); + } + + private SchemaContext getSchemaContext(final String dataspaceName, final String schemaSetName) { + return yangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName).getSchemaContext(); + } } \ No newline at end of file -- cgit 1.2.3-korg