diff options
Diffstat (limited to 'cps-service/src/main/java/org')
3 files changed, 19 insertions, 23 deletions
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 fc008685c1..6a2cac4679 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 @@ -138,9 +138,7 @@ public interface CpsDataService { FetchDescendantsOption fetchDescendantsOption); /** - * Updates data node for given dataspace and anchor using xpath to parent node. This method can currently - * update only one top level data node. The method will throw DataValidationException when more than one top level - * data nodes are provided in jsonData + * Updates multiple data nodes for given dataspace and anchor using xpath to parent node. * * @param dataspaceName dataspace name * @param anchorName anchor name @@ -154,10 +152,10 @@ public interface CpsDataService { /** * Replaces an existing data node's content including descendants. * - * @param dataspaceName dataspace name - * @param anchorName anchor name - * @param parentNodeXpath xpath to parent node - * @param jsonData json data + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param parentNodeXpath xpath to parent node + * @param jsonData json data * @param observedTimestamp observedTimestamp */ void updateDataNodeAndDescendants(String dataspaceName, String anchorName, String parentNodeXpath, 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 51e31f08c8..99cda229db 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 @@ -29,8 +29,10 @@ import static org.onap.cps.notification.Operation.DELETE; import static org.onap.cps.notification.Operation.UPDATE; import io.micrometer.core.annotation.Timed; +import java.io.Serializable; import java.time.OffsetDateTime; import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -155,20 +157,16 @@ public class CpsDataServiceImpl implements CpsDataService { @Override @Timed(value = "cps.data.service.datanode.leaves.update", - description = "Time taken to get a batch of data nodes") + description = "Time taken to update a batch of leaf data nodes") public void updateNodeLeaves(final String dataspaceName, final String anchorName, final String parentNodeXpath, final String jsonData, final OffsetDateTime observedTimestamp) { cpsValidator.validateNameCharacters(dataspaceName, anchorName); final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName); final Collection<DataNode> dataNodesInPatch = buildDataNodes(anchor, parentNodeXpath, jsonData, ContentType.JSON); - if (dataNodesInPatch.size() > 1) { - throw new DataValidationException("Operation is not supported for multiple data nodes", - "Number of data nodes present: " + dataNodesInPatch.size()); - } - cpsDataPersistenceService.updateDataLeaves(dataspaceName, anchorName, - dataNodesInPatch.iterator().next().getXpath(), - dataNodesInPatch.iterator().next().getLeaves()); + final Map<String, Map<String, Serializable>> xpathToUpdatedLeaves = dataNodesInPatch.stream() + .collect(Collectors.toMap(DataNode::getXpath, DataNode::getLeaves)); + cpsDataPersistenceService.batchUpdateDataLeaves(dataspaceName, anchorName, xpathToUpdatedLeaves); processDataUpdatedEventAsync(anchor, parentNodeXpath, UPDATE, observedTimestamp); } @@ -395,8 +393,8 @@ public class CpsDataServiceImpl implements CpsDataService { if (dataNodeUpdate == null) { return; } - cpsDataPersistenceService.updateDataLeaves(anchor.getDataspaceName(), anchor.getName(), - dataNodeUpdate.getXpath(), dataNodeUpdate.getLeaves()); + cpsDataPersistenceService.batchUpdateDataLeaves(anchor.getDataspaceName(), anchor.getName(), + Collections.singletonMap(dataNodeUpdate.getXpath(), dataNodeUpdate.getLeaves())); final Collection<DataNode> childDataNodeUpdates = dataNodeUpdate.getChildDataNodes(); for (final DataNode childDataNodeUpdate : childDataNodeUpdates) { processDataNodeUpdate(anchor, childDataNodeUpdate); 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 d28a3339fe..4fb25e949a 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 @@ -116,14 +116,14 @@ public interface CpsDataPersistenceService { FetchDescendantsOption fetchDescendantsOption); /** - * Updates leaves for existing data node. + * Updates data leaves for multiple data nodes. * - * @param dataspaceName dataspace name - * @param anchorName anchor name - * @param xpath xpath - * @param leaves the leaves as a map where key is a leaf name and a value is a leaf value + * @param dataspaceName dataspace name + * @param anchorName anchor name + * @param updatedLeavesPerXPath Map of xPaths to updated leaf nodes */ - void updateDataLeaves(String dataspaceName, String anchorName, String xpath, Map<String, Serializable> leaves); + void batchUpdateDataLeaves(String dataspaceName, String anchorName, + Map<String, Map<String, Serializable>> updatedLeavesPerXPath); /** * Replaces multiple existing data nodes' content including descendants in a batch operation. |