From: Sourabh Verma Date: Mon, 5 Jan 2026 11:53:43 +0000 (+0530) Subject: Handling null source and target data in CloudEventData. X-Git-Tag: 3.7.4~7^2 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=97c43ae6083fa16f2cac321c466a630884c6ead6;p=cps.git Handling null source and target data in CloudEventData. -A delta report with null or empty source/target would generate a cloud event with null source and target data. -The patch fixed the issue and the source and target data in cloud event are populated only when they are present in delta report. Issue-ID: CPS-3105 Change-Id: Ic76004fdcf4e2f63cdf415f2fc7645203ba17258 Signed-off-by: Sourabh Verma --- diff --git a/cps-service/src/main/java/org/onap/cps/events/CpsDataUpdateEventsProducer.java b/cps-service/src/main/java/org/onap/cps/events/CpsDataUpdateEventsProducer.java index 2e8dcb8ddd..74a8b254ae 100644 --- a/cps-service/src/main/java/org/onap/cps/events/CpsDataUpdateEventsProducer.java +++ b/cps-service/src/main/java/org/onap/cps/events/CpsDataUpdateEventsProducer.java @@ -22,9 +22,11 @@ package org.onap.cps.events; import static org.onap.cps.events.model.EventPayload.Action.fromValue; +import static org.onap.cps.utils.DataMapUtils.hasEntries; import io.cloudevents.CloudEvent; import io.micrometer.core.annotation.Timed; +import java.io.Serializable; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Collection; @@ -133,8 +135,14 @@ public class CpsDataUpdateEventsProducer { private CpsDataUpdatedEvent toCpsDataUpdatedEvent(final Anchor anchor, final OffsetDateTime observedTimestamp, final DeltaReport deltaReport) { final CloudEventData cloudEventData = new CloudEventData(); - cloudEventData.setSourceData(jsonObjectMapper.asJsonString(deltaReport.getSourceData())); - cloudEventData.setTargetData(jsonObjectMapper.asJsonString(deltaReport.getTargetData())); + final Map sourceData = deltaReport.getSourceData(); + final Map targetData = deltaReport.getTargetData(); + if (hasEntries(sourceData)) { + cloudEventData.setSourceData(jsonObjectMapper.asJsonString(sourceData)); + } + if (hasEntries(targetData)) { + cloudEventData.setTargetData(jsonObjectMapper.asJsonString(targetData)); + } final EventPayload updateEventData = new EventPayload(); updateEventData.setObservedTimestamp(DateTimeUtility.toString(observedTimestamp)); updateEventData.setDataspaceName(anchor.getDataspaceName()); diff --git a/cps-service/src/main/java/org/onap/cps/utils/DataMapUtils.java b/cps-service/src/main/java/org/onap/cps/utils/DataMapUtils.java index fabae6dc51..b1cc2a5673 100644 --- a/cps-service/src/main/java/org/onap/cps/utils/DataMapUtils.java +++ b/cps-service/src/main/java/org/onap/cps/utils/DataMapUtils.java @@ -67,6 +67,10 @@ public class DataMapUtils { .put("dataNodes", dataMaps).build(); } + public static boolean hasEntries(final Map map) { + return map != null && !map.isEmpty(); + } + private static List> toDataNodesWithIdentifier(final List dataNodeList, final String prefix) { final List> dataMaps = new ArrayList<>(dataNodeList.size()); diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/DataMapUtilsSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/DataMapUtilsSpec.groovy index 6ff41c128f..1f6868c9e9 100644 --- a/cps-service/src/test/groovy/org/onap/cps/utils/DataMapUtilsSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/utils/DataMapUtilsSpec.groovy @@ -98,6 +98,20 @@ class DataMapUtilsSpec extends Specification { result.isEmpty() } + def 'Check if a map is populated with #scenario.'() { + given: 'a map' + Map testMap = inputMap + when: 'checking if the map is populated' + boolean result = DataMapUtils.hasEntries(testMap) + then: 'the result contains expected value' + result == expectedResult + where: 'the following maps are checked' + scenario | inputMap || expectedResult + 'a null map' | null || false + 'an empty map' | [:] || false + 'a populated map' | [key: 'value'] || true + } + def dataNode = buildDataNode( "/parent",[parentLeaf:'parentLeafValue', parentLeafList:['parentLeafListEntry1','parentLeafListEntry2']],[ buildDataNode('/parent/child-list[@id="1/2"]',[listElementLeaf:'listElement1leafValue'],noChildren),