From edae744d54e3bbb97fe1e1ef8df743e9ca33e862 Mon Sep 17 00:00:00 2001 From: emaclee Date: Wed, 27 Mar 2024 12:46:39 +0000 Subject: Cm Subscription: Remove subscription method - method to remove a subscription Id from leaflist - condition if subscription list is empty, remove subscription all together Issue-ID: CPS-2164 Change-Id: Id694f441f9675fa9a048e3b824e1f02fae73f87e Signed-off-by: emaclee --- ...NotificationSubscriptionPersistenceService.java | 39 ++++++---- ...ficationSubscriptionPersistenceServiceImpl.java | 89 +++++++++++++++------- 2 files changed, 86 insertions(+), 42 deletions(-) (limited to 'cps-ncmp-service/src/main/java') diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceService.java index 6b02adb654..3bb40c3b7e 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceService.java @@ -31,9 +31,9 @@ public interface CmNotificationSubscriptionPersistenceService { /** * Check if we have an ongoing cm subscription based on the parameters. * - * @param datastoreType valid datastore type - * @param cmHandleId cmhandle id - * @param xpath valid xpath + * @param datastoreType the susbcription target datastore type + * @param cmHandleId the id of the cm handle for the susbcription + * @param xpath the target xpath * @return true for ongoing cmsubscription , otherwise false */ boolean isOngoingCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandleId, @@ -50,22 +50,35 @@ public interface CmNotificationSubscriptionPersistenceService { /** * Get all ongoing cm notification subscription based on the parameters. * - * @param datastoreType valid datastore type - * @param cmHandleId cmhandle id - * @param xpath valid xpath + * @param datastoreType the susbcription target datastore type + * @param cmHandleId the id of the cm handle for the susbcription + * @param xpath the target xpath * @return collection of subscription ids of ongoing cm notification subscription */ Collection getOngoingCmNotificationSubscriptionIds(final DatastoreType datastoreType, final String cmHandleId, final String xpath); /** - * Add or update cm notification subscription. + * Add cm notification subscription. * - * @param datastoreType valid datastore type - * @param cmHandle cmhandle id - * @param xpath valid xpath - * @param newSubscriptionId subscription Id to be added + * @param datastoreType the susbcription target datastore type + * @param cmHandleId the id of the cm handle for the susbcription + * @param xpath the target xpath + * @param newSubscriptionId subscription id to be added */ - void addOrUpdateCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandle, - final String xpath, final String newSubscriptionId); + void addCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandleId, + final String xpath, final String newSubscriptionId); + + /** + * Remove cm notification Subscription. + * + * @param datastoreType the susbcription target datastore type + * @param cmHandleId the id of the cm handle for the susbcription + * @param xpath the target xpath + * @param subscriptionId subscription id to remove + */ + void removeCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandleId, + final String xpath, final String subscriptionId); + } + diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceServiceImpl.java index 2efd321b8d..92f3459187 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/service/CmNotificationSubscriptionPersistenceServiceImpl.java @@ -24,7 +24,6 @@ import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS; import java.io.Serializable; import java.time.OffsetDateTime; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -60,7 +59,7 @@ public class CmNotificationSubscriptionPersistenceServiceImpl implements CmNotif @Override public boolean isOngoingCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandleId, - final String xpath) { + final String xpath) { return !getOngoingCmNotificationSubscriptionIds(datastoreType, cmHandleId, xpath).isEmpty(); } @@ -73,7 +72,7 @@ public class CmNotificationSubscriptionPersistenceServiceImpl implements CmNotif @Override public Collection getOngoingCmNotificationSubscriptionIds(final DatastoreType datastoreType, - final String cmHandleId, final String xpath) { + final String cmHandleId, final String xpath) { final String isOngoingCmSubscriptionCpsPathQuery = CM_SUBSCRIPTION_CPS_PATH_QUERY.formatted(datastoreType.getDatastoreName(), cmHandleId, @@ -88,45 +87,77 @@ public class CmNotificationSubscriptionPersistenceServiceImpl implements CmNotif } @Override - public void addOrUpdateCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandleId, - final String xpath, final String newSubscriptionId) { - if (isOngoingCmNotificationSubscription(datastoreType, cmHandleId, xpath)) { - final DataNode existingFilterNode = - cpsQueryService.queryDataNodes(NCMP_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, - CM_SUBSCRIPTION_CPS_PATH_QUERY.formatted(datastoreType.getDatastoreName(), cmHandleId, - escapeQuotesByDoublingThem(xpath)), - OMIT_DESCENDANTS).iterator().next(); - final Collection existingSubscriptionIds = getOngoingCmNotificationSubscriptionIds(datastoreType, + public void addCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandleId, + final String xpath, final String subscriptionId) { + if (isOngoingCmNotificationSubscription(datastoreType, cmHandleId, xpath) + && (!getOngoingCmNotificationSubscriptionIds(datastoreType, cmHandleId, xpath) + .contains(subscriptionId))) { + final DataNode subscriptionAsDataNode = getSubscriptionAsDataNode(datastoreType, cmHandleId, xpath); + final Collection subscriptionIds = getOngoingCmNotificationSubscriptionIds(datastoreType, cmHandleId, xpath); - if (!existingSubscriptionIds.contains(newSubscriptionId)) { - updateListOfSubscribers(existingSubscriptionIds, newSubscriptionId, existingFilterNode); - } + subscriptionIds.add(subscriptionId); + saveSubscriptionDetails(subscriptionAsDataNode, subscriptionIds); + } else { + addNewSubscriptionViaDatastore(datastoreType, cmHandleId, xpath, subscriptionId); + } + } + + @Override + public void removeCmNotificationSubscription(final DatastoreType datastoreType, final String cmHandleId, + final String xpath, final String subscriptionId) { + final DataNode subscriptionAsDataNode = getSubscriptionAsDataNode(datastoreType, cmHandleId, xpath); + final Collection subscriptionIds = getOngoingCmNotificationSubscriptionIds(datastoreType, + cmHandleId, xpath); + subscriptionIds.remove(subscriptionId); + saveSubscriptionDetails(subscriptionAsDataNode, subscriptionIds); + if (isOngoingCmNotificationSubscription(datastoreType, cmHandleId, xpath)) { + log.info("There are subscribers left for the following cps path {} :", + CM_SUBSCRIPTION_CPS_PATH_QUERY.formatted(datastoreType.getDatastoreName(), cmHandleId, + escapeQuotesByDoublingThem(xpath))); } else { - addNewSubscriptionViaDatastore(datastoreType, cmHandleId, xpath, newSubscriptionId); + log.info("No subscribers left for the following cps path {} :", + CM_SUBSCRIPTION_CPS_PATH_QUERY.formatted(datastoreType.getDatastoreName(), cmHandleId, + escapeQuotesByDoublingThem(xpath))); + deleteListOfSubscriptionsFor(datastoreType, cmHandleId, xpath); } } + private void deleteListOfSubscriptionsFor(final DatastoreType datastoreType, final String cmHandleId, + final String xpath) { + cpsDataService.deleteDataNode(NCMP_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, + CM_SUBSCRIPTION_CPS_PATH_QUERY.formatted(datastoreType.getDatastoreName(), cmHandleId, + escapeQuotesByDoublingThem(xpath)), + OffsetDateTime.now()); + } + + private DataNode getSubscriptionAsDataNode(final DatastoreType datastoreType, final String cmHandleId, + final String xpath) { + return cpsQueryService.queryDataNodes(NCMP_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, + CM_SUBSCRIPTION_CPS_PATH_QUERY.formatted(datastoreType.getDatastoreName(), cmHandleId, + escapeQuotesByDoublingThem(xpath)), + OMIT_DESCENDANTS).iterator().next(); + } + private void addNewSubscriptionViaDatastore(final DatastoreType datastoreType, final String cmHandleId, final String xpath, final String newSubscriptionId) { final String parentXpath = "/datastores/datastore[@name='%s']/cm-handles" .formatted(datastoreType.getDatastoreName()); - final String updatedJson = String.format("{\"cm-handle\":[{\"id\":\"%s\",\"filters\":{\"filter\":" + final String subscriptionAsJson = String.format("{\"cm-handle\":[{\"id\":\"%s\",\"filters\":{\"filter\":" + "[{\"xpath\":\"%s\",\"subscriptionIds\":[\"%s\"]}]}}]}", cmHandleId, xpath, newSubscriptionId); - cpsDataService.saveData(NCMP_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, parentXpath, updatedJson, + cpsDataService.saveData(NCMP_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, parentXpath, subscriptionAsJson, OffsetDateTime.now(), ContentType.JSON); } - private void updateListOfSubscribers(final Collection existingSubscriptionIds, - final String newSubscriptionId, final DataNode existingFilterNode) { - final String parentXpath = CpsPathUtil.getNormalizedParentXpath(existingFilterNode.getXpath()); - final List updatedSubscribers = new ArrayList<>(existingSubscriptionIds); - updatedSubscribers.add(newSubscriptionId); - final Map updatedLeaves = new HashMap<>(); - updatedLeaves.put("xpath", existingFilterNode.getLeaves().get("xpath")); - updatedLeaves.put("subscriptionIds", (Serializable) updatedSubscribers); - final String updatedJson = "{\"filter\":[" + jsonObjectMapper.asJsonString(updatedLeaves) + "]}"; - cpsDataService.updateNodeLeaves(NCMP_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, parentXpath, updatedJson, - OffsetDateTime.now()); + private void saveSubscriptionDetails(final DataNode subscriptionDetailsAsDataNode, + final Collection subscriptionIds) { + final Map subscriptionDetailsAsMap = new HashMap<>(); + subscriptionDetailsAsMap.put("xpath", subscriptionDetailsAsDataNode.getLeaves().get("xpath")); + subscriptionDetailsAsMap.put("subscriptionIds", (Serializable) subscriptionIds); + final String parentXpath = CpsPathUtil.getNormalizedParentXpath(subscriptionDetailsAsDataNode.getXpath()); + final String subscriptionDetailsAsJson = "{\"filter\":[" + + jsonObjectMapper.asJsonString(subscriptionDetailsAsMap).replace("'", "\"") + "]}"; + cpsDataService.updateNodeLeaves(NCMP_DATASPACE_NAME, SUBSCRIPTION_ANCHOR_NAME, parentXpath, + subscriptionDetailsAsJson, OffsetDateTime.now()); } private static String escapeQuotesByDoublingThem(final String inputXpath) { -- cgit 1.2.3-korg