Merge "Process data-updated event asynchronously"
[cps.git] / cps-service / src / main / java / org / onap / cps / api / impl / CpsDataServiceImpl.java
index a512f67..8989dc8 100755 (executable)
@@ -99,6 +99,18 @@ public class CpsDataServiceImpl implements CpsDataService {
         processDataUpdatedEventAsync(dataspaceName, anchorName);
     }
 
+    @Override
+    public void updateNodeLeavesAndExistingDescendantLeaves(final String dataspaceName, final String anchorName,
+                                                            final String parentNodeXpath,
+                                                            final String dataNodeUpdatesAsJson) {
+        final Collection<DataNode> dataNodeUpdates =
+            buildDataNodeCollectionFromJson(dataspaceName, anchorName, parentNodeXpath, dataNodeUpdatesAsJson);
+        for (final DataNode dataNodeUpdate : dataNodeUpdates) {
+            processDataNodeUpdate(dataspaceName, anchorName, dataNodeUpdate);
+        }
+        notificationService.processDataUpdatedEvent(dataspaceName, anchorName);
+    }
+
     @Override
     public void replaceNodeTree(final String dataspaceName, final String anchorName, final String parentNodeXpath,
         final String jsonData) {
@@ -170,4 +182,17 @@ public class CpsDataServiceImpl implements CpsDataService {
     private SchemaContext getSchemaContext(final String dataspaceName, final String schemaSetName) {
         return yangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName).getSchemaContext();
     }
+
+    private void processDataNodeUpdate(final String dataspaceName, final String anchorName,
+                                       final DataNode dataNodeUpdate) {
+        if (dataNodeUpdate == null) {
+            return;
+        }
+        cpsDataPersistenceService.updateDataLeaves(dataspaceName, anchorName, dataNodeUpdate.getXpath(),
+            dataNodeUpdate.getLeaves());
+        final Collection<DataNode> childDataNodeUpdates = dataNodeUpdate.getChildDataNodes();
+        for (final DataNode childDataNodeUpdate : childDataNodeUpdates) {
+            processDataNodeUpdate(dataspaceName, anchorName, childDataNodeUpdate);
+        }
+    }
 }