Get Subscription Delta 72/137172/10
authorseanbeirne <sean.beirne@est.tech>
Tue, 6 Feb 2024 10:37:02 +0000 (10:37 +0000)
committerseanbeirne <sean.beirne@est.tech>
Fri, 23 Feb 2024 11:21:49 +0000 (11:21 +0000)
-Added @AllArgsConstructor to improve readability

Issue-ID: CPS-1953
Change-Id: Id457561edb8ce8c00c9c93a1453ec37da5174b38
Signed-off-by: seanbeirne <sean.beirne@est.tech>
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionDelta.java [new file with mode: 0644]
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/mapper/CmNotificationSubscriptionDmiInEventMapper.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/model/DmiCmNotificationSubscriptionPredicate.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/config/embeddedcache/CmNotificationSubscriptionCacheConfigSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionDeltaSpec.groovy [new file with mode: 0644]
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/events/cmsubscription/mapper/CmNotificationSubscriptionDmiInEventMapperSpec.groovy

diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionDelta.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionDelta.java
new file mode 100644 (file)
index 0000000..8a4beb9
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.api.impl.events.cmsubscription;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.onap.cps.ncmp.api.impl.events.cmsubscription.model.DmiCmNotificationSubscriptionPredicate;
+import org.onap.cps.ncmp.api.impl.events.cmsubscription.service.CmNotificationSubscriptionPersistenceService;
+import org.onap.cps.ncmp.api.impl.operations.DatastoreType;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class CmNotificationSubscriptionDelta {
+
+    private final CmNotificationSubscriptionPersistenceService cmNotificationSubscriptionPersistenceService;
+
+    /**
+     * Get the delta for a given predicates list.
+     *
+     * @param dmiCmNotificationSubscriptionPredicates list of DmiCmNotificationSubscriptionPredicates
+     * @return delta list of DmiCmNotificationSubscriptionPredicates
+     */
+    public List<DmiCmNotificationSubscriptionPredicate> getDelta(
+        final List<DmiCmNotificationSubscriptionPredicate> dmiCmNotificationSubscriptionPredicates) {
+        final List<DmiCmNotificationSubscriptionPredicate> delta = new ArrayList<>();
+
+        for (final DmiCmNotificationSubscriptionPredicate cmNotificationSubscriptionPredicate:
+            dmiCmNotificationSubscriptionPredicates) {
+
+            final Set<String> targetCmHandleIds = new HashSet<>();
+            final Set<String> xpaths = new HashSet<>();
+            final DatastoreType datastoreType = cmNotificationSubscriptionPredicate.getDatastoreType();
+
+            for (final String cmHandleId : cmNotificationSubscriptionPredicate.getTargetCmHandleIds()) {
+                for (final String xpath : cmNotificationSubscriptionPredicate.getXpaths()) {
+                    if (!cmNotificationSubscriptionPersistenceService.isOngoingCmNotificationSubscription(datastoreType,
+                            cmHandleId, xpath)) {
+                        xpaths.add(xpath);
+                        targetCmHandleIds.add(cmHandleId);
+
+                    }
+                }
+            }
+
+            final DmiCmNotificationSubscriptionPredicate predicateDelta =
+                new DmiCmNotificationSubscriptionPredicate(targetCmHandleIds, datastoreType, xpaths);
+
+            delta.add(predicateDelta);
+        }
+        return delta;
+    }
+
+}
index 2aa2716..489401f 100644 (file)
@@ -71,9 +71,9 @@ public class CmNotificationSubscriptionDmiInEventMapper {
             final ScopeFilter scopeFilter = new ScopeFilter();
             scopeFilter.setDatastore(ScopeFilter.Datastore.fromValue(
                     dmiCmNotificationSubscriptionPredicate.getDatastoreType().getDatastoreName()));
-            scopeFilter.setXpathFilter(dmiCmNotificationSubscriptionPredicate.getXpaths());
+            scopeFilter.setXpathFilter(dmiCmNotificationSubscriptionPredicate.getXpaths().stream().toList());
             predicate.setScopeFilter(scopeFilter);
-            predicate.setTargetFilter(dmiCmNotificationSubscriptionPredicate.getTargetCmHandleIds());
+            predicate.setTargetFilter(dmiCmNotificationSubscriptionPredicate.getTargetCmHandleIds().stream().toList());
             predicates.add(predicate);
         });
 
index 6536580..9c4c3f6 100644 (file)
 
 package org.onap.cps.ncmp.api.impl.events.cmsubscription.model;
 
-import java.util.List;
+import java.util.Set;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Setter;
 import org.onap.cps.ncmp.api.impl.operations.DatastoreType;
 
 @Getter
 @Setter
+@AllArgsConstructor
 public class DmiCmNotificationSubscriptionPredicate {
 
-    private List<String> targetCmHandleIds;
+    private Set<String> targetCmHandleIds;
     private DatastoreType datastoreType;
-    private List<String> xpaths;
+    private Set<String> xpaths;
 
 }
index a3f41c8..86273bb 100644 (file)
@@ -49,7 +49,7 @@ class CmNotificationSubscriptionCacheConfigSpec extends Specification {
         given: 'a cm subscription properties'
             def subscriptionId = 'sub123'
             def dmiPluginName = 'dummydmi'
-            def cmSubscriptionPredicate = new DmiCmNotificationSubscriptionPredicate(targetCmHandleIds: ['cmhandle1', 'cmhandle2'], datastoreType: DatastoreType.PASSTHROUGH_RUNNING, xpaths: ['/a/b/c'])
+            def cmSubscriptionPredicate = new DmiCmNotificationSubscriptionPredicate(['cmhandle1', 'cmhandle2'].toSet(), DatastoreType.PASSTHROUGH_RUNNING, ['/a/b/c'].toSet())
             def cmSubscriptionCacheObject = new DmiCmNotificationSubscriptionDetails(dmiCmNotificationSubscriptionPredicates: [cmSubscriptionPredicate], cmNotificationSubscriptionStatus: CmNotificationSubscriptionStatus.PENDING)
         when: 'the cache is populated'
             cmNotificationSubscriptionCache.put(subscriptionId, [(dmiPluginName): cmSubscriptionCacheObject])
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionDeltaSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/events/cmsubscription/CmNotificationSubscriptionDeltaSpec.groovy
new file mode 100644 (file)
index 0000000..e506526
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (c) 2024 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an 'AS IS' BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.onap.cps.ncmp.api.impl.events.cmsubscription
+
+import org.onap.cps.ncmp.api.impl.events.cmsubscription.model.DmiCmNotificationSubscriptionPredicate
+import org.onap.cps.ncmp.api.impl.events.cmsubscription.service.CmNotificationSubscriptionPersistenceService
+import org.onap.cps.ncmp.api.impl.operations.DatastoreType
+import spock.lang.Specification
+
+class CmNotificationSubscriptionDeltaSpec extends Specification {
+
+    def mockCmNotificationSubscriptionPersistenceService = Mock(CmNotificationSubscriptionPersistenceService)
+    def objectUnderTest = new CmNotificationSubscriptionDelta(mockCmNotificationSubscriptionPersistenceService)
+
+    def 'Find Delta of given list of predicates'() {
+        given: 'A list of predicates'
+            def predicateList = [new DmiCmNotificationSubscriptionPredicate(['ch-1','ch-2'].toSet(), DatastoreType.PASSTHROUGH_OPERATIONAL, ['a/1/','b/2'].toSet())]
+        and: '3 positive responses and 1 negative.'
+            mockCmNotificationSubscriptionPersistenceService.isOngoingCmNotificationSubscription(DatastoreType.PASSTHROUGH_OPERATIONAL, 'ch-1', 'a/1/') >>> true
+            mockCmNotificationSubscriptionPersistenceService.isOngoingCmNotificationSubscription(DatastoreType.PASSTHROUGH_OPERATIONAL, 'ch-1', 'b/2') >>> true
+            mockCmNotificationSubscriptionPersistenceService.isOngoingCmNotificationSubscription(DatastoreType.PASSTHROUGH_OPERATIONAL, 'ch-2', 'a/1/') >>> true
+            mockCmNotificationSubscriptionPersistenceService.isOngoingCmNotificationSubscription(DatastoreType.PASSTHROUGH_OPERATIONAL, 'ch-2', 'b/2') >>> false
+        when: 'getDelta is called'
+            def result = objectUnderTest.getDelta(predicateList)
+        then: 'verify correct delta is returned'
+            assert result.size() == 1
+            assert result[0].targetCmHandleIds[0] == 'ch-2'
+            assert result[0].xpaths[0] == 'b/2'
+
+    }
+
+}
index 44a7470..763aeda 100644 (file)
@@ -43,8 +43,8 @@ class CmNotificationSubscriptionDmiInEventMapperSpec extends Specification {
 
     def 'Check for Cm Notification Subscription DMI In Event mapping'() {
         given: 'a collection of cm subscription predicates'
-            def dmiCmNotificationSubscriptionPredicates = [new DmiCmNotificationSubscriptionPredicate(targetCmHandleIds: ['ch-1'], datastoreType: PASSTHROUGH_RUNNING, xpaths: ['/ch-1']),
-                                                           new DmiCmNotificationSubscriptionPredicate(targetCmHandleIds: ['ch-2'], datastoreType: PASSTHROUGH_OPERATIONAL, xpaths: ['/ch-2'])]
+            def dmiCmNotificationSubscriptionPredicates = [new DmiCmNotificationSubscriptionPredicate(['ch-1'].toSet(), PASSTHROUGH_RUNNING, ['/ch-1'].toSet()),
+                                                           new DmiCmNotificationSubscriptionPredicate(['ch-2'].toSet(), PASSTHROUGH_OPERATIONAL, ['/ch-2'].toSet())]
         when: 'we try to map the values'
             def result = objectUnderTest.toCmNotificationSubscriptionDmiInEvent(dmiCmNotificationSubscriptionPredicates)
         then: 'it contains correct cm notification subscription cmhandle object'