From ebfa4077b2e462237301e93566fed6ef2f56674c Mon Sep 17 00:00:00 2001 From: "puthuparambil.aditya" Date: Mon, 14 Feb 2022 10:56:35 +0000 Subject: Align JSON DataNode for Get and Post/Put API in CPS Issue-ID: CPS-865 Signed-off-by: puthuparambil.aditya Change-Id: I60b1f9c94e79bdd66d60fe6a68f5fc4adc718d35 --- .../notification/CpsDataUpdatedEventFactory.java | 2 +- .../main/java/org/onap/cps/utils/DataMapUtils.java | 13 +++++++++- .../CpsDataUpdateEventFactorySpec.groovy | 6 ++--- .../org/onap/cps/utils/DataMapUtilsSpec.groovy | 30 ++++++++++++++++++---- 4 files changed, 41 insertions(+), 10 deletions(-) (limited to 'cps-service/src') diff --git a/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java b/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java index e7b639d48..1013c13b7 100644 --- a/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java +++ b/cps-service/src/main/java/org/onap/cps/notification/CpsDataUpdatedEventFactory.java @@ -89,7 +89,7 @@ public class CpsDataUpdatedEventFactory { private Data createData(final DataNode dataNode) { final var data = new Data(); - DataMapUtils.toDataMap(dataNode).forEach(data::setAdditionalProperty); + DataMapUtils.toDataMapWithIdentifier(dataNode).forEach(data::setAdditionalProperty); return data; } 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 71a95f1ca..42719d9b3 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 @@ -36,13 +36,24 @@ import org.onap.cps.spi.model.DataNode; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DataMapUtils { + /** + * Converts DataNode structure into a map including the root node identifier for a JSON response. + * + * @param dataNode data node object + * @return a map representing same data with the root node identifier + */ + public static Map toDataMapWithIdentifier(final DataNode dataNode) { + return ImmutableMap.builder() + .put(getNodeIdentifier(dataNode.getXpath()), toDataMap(dataNode)) + .build(); + } + /** * Converts DataNode structure into a map for a JSON response. * * @param dataNode data node object * @return a map representing same data */ - public static Map toDataMap(final DataNode dataNode) { return ImmutableMap.builder() .putAll(dataNode.getLeaves()) diff --git a/cps-service/src/test/groovy/org/onap/cps/notification/CpsDataUpdateEventFactorySpec.groovy b/cps-service/src/test/groovy/org/onap/cps/notification/CpsDataUpdateEventFactorySpec.groovy index 5b13fa516..682197d51 100644 --- a/cps-service/src/test/groovy/org/onap/cps/notification/CpsDataUpdateEventFactorySpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/notification/CpsDataUpdateEventFactorySpec.groovy @@ -45,10 +45,10 @@ class CpsDataUpdateEventFactorySpec extends Specification { given: 'an anchor which has been updated' def anchor = new Anchor('my-anchorname', 'my-dataspace', 'my-schemaset-name') and: 'cps data service returns the data node details' - def xpath = '/' + def xpath = '/xpath' def dataNode = new DataNodeBuilder().withXpath(xpath).withLeaves(['leafName': 'leafValue']).build() mockCpsDataService.getDataNode( - 'my-dataspace', 'my-anchorname', xpath, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode + 'my-dataspace', 'my-anchorname', '/', FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS) >> dataNode when: 'CPS data updated event is created' def cpsDataUpdatedEvent = objectUnderTest.createCpsDataUpdatedEvent(anchor, DateTimeUtility.toOffsetDateTime(inputObservedTimestamp), Operation.CREATE) @@ -72,7 +72,7 @@ class CpsDataUpdateEventFactorySpec extends Specification { assert dataspaceName == 'my-dataspace' assert schemaSetName == 'my-schemaset-name' assert operation == Content.Operation.CREATE - assert data == new Data().withAdditionalProperty('leafName', 'leafValue') + assert data == new Data().withAdditionalProperty('xpath', ['leafName': 'leafValue']) } where: scenario | inputObservedTimestamp 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 429ab40b9..90563c0c1 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 @@ -2,6 +2,7 @@ * ============LICENSE_START======================================================= * Copyright (C) 2021 Pantheon.tech * Modifications Copyright (C) 2020 Nordix Foundation + * Modifications Copyright (C) 2022 Bell Canada. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +43,10 @@ class DataMapUtilsSpec extends Specification { def 'Data node structure conversion to map.'() { when: 'data node structure is converted to a map' - Map result = DataMapUtils.toDataMap(dataNode) + def result = DataMapUtils.toDataMap(dataNode) + + then: 'root node identifier is null' + result.parent == null then: 'root node leaves are top level elements' result.parentLeaf == 'parentLeafValue' @@ -53,12 +57,28 @@ class DataMapUtilsSpec extends Specification { ['listElementLeaf': 'listElement2leafValue']) and: 'leaves for child element is populated under its node identifier' - Map childObjectData = result.'child-object' - childObjectData.childLeaf == 'childLeafValue' + result.'child-object'.childLeaf == 'childLeafValue' and: 'leaves for grandchild element is populated under its node identifier' - Map grandChildObjectData = childObjectData.'grand-child-object' - grandChildObjectData.grandChildLeaf == 'grandChildLeafValue' + result.'child-object'.'grand-child-object'.grandChildLeaf == 'grandChildLeafValue' } + def 'Data node structure conversion to map with root node identifier.'() { + when: 'data node structure is converted to a map with root node identifier' + def result = DataMapUtils.toDataMapWithIdentifier(dataNode) + + then: 'root node identifier is not null' + result.parent != null + + then: 'root node leaves are populated under its node identifier' + def parentNode = result.parent + parentNode.parentLeaf == 'parentLeafValue' + parentNode.parentLeafList == ['parentLeafListEntry1','parentLeafListEntry2'] + + and: 'leaves for child element is populated under its node identifier' + parentNode.'child-object'.childLeaf == 'childLeafValue' + + and: 'leaves for grandchild element is populated under its node identifier' + parentNode.'child-object'.'grand-child-object'.grandChildLeaf == 'grandChildLeafValue' + } } -- cgit 1.2.3-korg