From 885980d8ebf6bc8be9efad7ce9094deeb602a076 Mon Sep 17 00:00:00 2001 From: Arpit Singh Date: Tue, 21 Nov 2023 21:01:43 +0530 Subject: CPS Delta API: Update action for delta service - Added code for Update action in Delta service - added method to get updated Leaf data: getUpdatedLeavesBetweenSourceAndTargetDataNode - added method to compare Leaf data common in source and target data node - added method to process leaves unique to target data node - added method to compare leaves: compareLeaves - added method to store updated data to a DeltaReport: addUpdatedLeavesToDeltaReport - Added corresponding testware Issue-ID: CPS-1824 Signed-off-by: Arpit Singh Change-Id: I3de07ea3227988784a0892f6a92c238ecf00a7fa --- .../org/onap/cps/api/impl/CpsDeltaServiceImpl.java | 121 ++++++++++++++++++--- .../java/org/onap/cps/spi/model/DeltaReport.java | 1 + .../org/onap/cps/spi/model/DeltaReportBuilder.java | 5 + 3 files changed, 114 insertions(+), 13 deletions(-) (limited to 'cps-service/src/main/java') diff --git a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java index 683ddce3d..1e1fe819a 100644 --- a/cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java +++ b/cps-service/src/main/java/org/onap/cps/api/impl/CpsDeltaServiceImpl.java @@ -28,7 +28,7 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import lombok.NoArgsConstructor; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.onap.cps.api.CpsDeltaService; import org.onap.cps.spi.model.DataNode; @@ -38,7 +38,6 @@ import org.springframework.stereotype.Service; @Slf4j @Service -@NoArgsConstructor public class CpsDeltaServiceImpl implements CpsDeltaService { @Override @@ -50,7 +49,7 @@ public class CpsDeltaServiceImpl implements CpsDeltaService { final Map xpathToSourceDataNodes = convertToXPathToDataNodesMap(sourceDataNodes); final Map xpathToTargetDataNodes = convertToXPathToDataNodesMap(targetDataNodes); - deltaReport.addAll(getRemovedDeltaReports(xpathToSourceDataNodes, xpathToTargetDataNodes)); + deltaReport.addAll(getRemovedAndUpdatedDeltaReports(xpathToSourceDataNodes, xpathToTargetDataNodes)); deltaReport.addAll(getAddedDeltaReports(xpathToSourceDataNodes, xpathToTargetDataNodes)); @@ -70,26 +69,122 @@ public class CpsDeltaServiceImpl implements CpsDeltaService { return xpathToDataNode; } - private static List getRemovedDeltaReports( - final Map xpathToSourceDataNodes, - final Map xpathToTargetDataNodes) { - - final List removedDeltaReportEntries = new ArrayList<>(); + private static List getRemovedAndUpdatedDeltaReports( + final Map xpathToSourceDataNodes, + final Map xpathToTargetDataNodes) { + final List removedAndUpdatedDeltaReportEntries = new ArrayList<>(); for (final Map.Entry entry: xpathToSourceDataNodes.entrySet()) { final String xpath = entry.getKey(); final DataNode sourceDataNode = entry.getValue(); final DataNode targetDataNode = xpathToTargetDataNodes.get(xpath); - + final List deltaReports; if (targetDataNode == null) { - final Map sourceDataNodeLeaves = sourceDataNode.getLeaves(); - final DeltaReport removedData = new DeltaReportBuilder().actionRemove().withXpath(xpath) - .withSourceData(sourceDataNodeLeaves).build(); - removedDeltaReportEntries.add(removedData); + deltaReports = getRemovedDeltaReports(xpath, sourceDataNode); + } else { + deltaReports = getUpdatedDeltaReports(xpath, sourceDataNode, targetDataNode); } + removedAndUpdatedDeltaReportEntries.addAll(deltaReports); } + return removedAndUpdatedDeltaReportEntries; + } + + private static List getRemovedDeltaReports(final String xpath, final DataNode sourceDataNode) { + final List removedDeltaReportEntries = new ArrayList<>(); + final Map sourceDataNodeLeaves = sourceDataNode.getLeaves(); + final DeltaReport removedDeltaReportEntry = new DeltaReportBuilder().actionRemove().withXpath(xpath) + .withSourceData(sourceDataNodeLeaves).build(); + removedDeltaReportEntries.add(removedDeltaReportEntry); return removedDeltaReportEntries; } + private static List getUpdatedDeltaReports(final String xpath, final DataNode sourceDataNode, + final DataNode targetDataNode) { + final List updatedDeltaReportEntries = new ArrayList<>(); + final Map, Map> updatedLeavesAsSourceDataToTargetData = + getUpdatedLeavesBetweenSourceAndTargetDataNode(sourceDataNode.getLeaves(), targetDataNode.getLeaves()); + addUpdatedLeavesToDeltaReport(xpath, updatedLeavesAsSourceDataToTargetData, updatedDeltaReportEntries); + return updatedDeltaReportEntries; + } + + private static Map, + Map> getUpdatedLeavesBetweenSourceAndTargetDataNode( + final Map leavesOfSourceDataNode, + final Map leavesOfTargetDataNode) { + final Map, Map> updatedLeavesAsSourceDataToTargetData = + new LinkedHashMap<>(); + final Map sourceDataInDeltaReport = new LinkedHashMap<>(); + final Map targetDataInDeltaReport = new LinkedHashMap<>(); + processLeavesPresentInSourceAndTargetDataNode(leavesOfSourceDataNode, leavesOfTargetDataNode, + sourceDataInDeltaReport, targetDataInDeltaReport); + processLeavesUniqueInTargetDataNode(leavesOfSourceDataNode, leavesOfTargetDataNode, + sourceDataInDeltaReport, targetDataInDeltaReport); + final boolean isUpdatedDataInDeltaReport = + !sourceDataInDeltaReport.isEmpty() || !targetDataInDeltaReport.isEmpty(); + if (isUpdatedDataInDeltaReport) { + updatedLeavesAsSourceDataToTargetData.put(sourceDataInDeltaReport, targetDataInDeltaReport); + } + return updatedLeavesAsSourceDataToTargetData; + } + + private static void processLeavesPresentInSourceAndTargetDataNode( + final Map leavesOfSourceDataNode, + final Map leavesOfTargetDataNode, + final Map sourceDataInDeltaReport, + final Map targetDataInDeltaReport) { + for (final Map.Entry entry: leavesOfSourceDataNode.entrySet()) { + final String key = entry.getKey(); + final Serializable sourceLeaf = entry.getValue(); + final Serializable targetLeaf = leavesOfTargetDataNode.get(key); + compareLeaves(key, sourceLeaf, targetLeaf, sourceDataInDeltaReport, targetDataInDeltaReport); + } + } + + private static void processLeavesUniqueInTargetDataNode( + final Map leavesOfSourceDataNode, + final Map leavesOfTargetDataNode, + final Map sourceDataInDeltaReport, + final Map targetDataInDeltaReport) { + final Map uniqueLeavesOfTargetDataNode = + new LinkedHashMap<>(leavesOfTargetDataNode); + uniqueLeavesOfTargetDataNode.keySet().removeAll(leavesOfSourceDataNode.keySet()); + for (final Map.Entry entry: uniqueLeavesOfTargetDataNode.entrySet()) { + final String key = entry.getKey(); + final Serializable targetLeaf = entry.getValue(); + final Serializable sourceLeaf = leavesOfSourceDataNode.get(key); + compareLeaves(key, sourceLeaf, targetLeaf, sourceDataInDeltaReport, targetDataInDeltaReport); + } + } + + private static void compareLeaves(final String key, + final Serializable sourceLeaf, + final Serializable targetLeaf, + final Map sourceDataInDeltaReport, + final Map targetDataInDeltaReport) { + if (sourceLeaf != null && targetLeaf != null) { + if (!Objects.equals(sourceLeaf, targetLeaf)) { + sourceDataInDeltaReport.put(key, sourceLeaf); + targetDataInDeltaReport.put(key, targetLeaf); + } + } else if (sourceLeaf != null) { + sourceDataInDeltaReport.put(key, sourceLeaf); + } else if (targetLeaf != null) { + targetDataInDeltaReport.put(key, targetLeaf); + } + } + + private static void addUpdatedLeavesToDeltaReport(final String xpath, + final Map, Map> updatedLeavesAsSourceDataToTargetData, + final List updatedDeltaReportEntries) { + for (final Map.Entry, Map> entry: + updatedLeavesAsSourceDataToTargetData.entrySet()) { + final DeltaReport updatedDataForDeltaReport = new DeltaReportBuilder().actionUpdate() + .withXpath(xpath).withSourceData(entry.getKey()).withTargetData(entry.getValue()).build(); + updatedDeltaReportEntries.add(updatedDataForDeltaReport); + } + + } + private static List getAddedDeltaReports(final Map xpathToSourceDataNodes, final Map xpathToTargetDataNodes) { diff --git a/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReport.java b/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReport.java index b9c05dcf0..fb9c1971b 100644 --- a/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReport.java +++ b/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReport.java @@ -32,6 +32,7 @@ public class DeltaReport { public static final String ADD_ACTION = "add"; public static final String REMOVE_ACTION = "remove"; + public static final String UPDATE_ACTION = "update"; DeltaReport() {} diff --git a/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReportBuilder.java b/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReportBuilder.java index cef6ca3fa..1e151eeb2 100644 --- a/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReportBuilder.java +++ b/cps-service/src/main/java/org/onap/cps/spi/model/DeltaReportBuilder.java @@ -58,6 +58,11 @@ public class DeltaReportBuilder { return this; } + public DeltaReportBuilder actionUpdate() { + this.action = DeltaReport.UPDATE_ACTION; + return this; + } + /** * To create a single entry of {@link DeltaReport}. * -- cgit 1.2.3-korg