2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2025 OpenInfra Foundation Europe. All rights reserved.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.cps.ncmp.impl.inventory.sync.lcm;
23 import com.google.common.collect.MapDifference;
24 import com.google.common.collect.Maps;
25 import java.util.HashMap;
26 import java.util.List;
28 import lombok.AccessLevel;
29 import lombok.NoArgsConstructor;
30 import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle;
31 import org.onap.cps.ncmp.events.lcm.v1.Values;
34 * Utility class for examining and determining changes in CM handle properties.
36 @NoArgsConstructor(access = AccessLevel.PRIVATE)
37 public class CmHandlePropertyChangeDetector {
40 * Determines property (update) values for creating a new CM handle.
42 * @param ncmpServiceCmHandle the CM handle being created
43 * @return CmHandlePropertyUpdates containing new values for the created CM handle
45 static CmHandlePropertyUpdates determineUpdatesForCreate(final NcmpServiceCmHandle ncmpServiceCmHandle) {
46 final CmHandlePropertyUpdates cmHandlePropertyUpdates = new CmHandlePropertyUpdates();
47 cmHandlePropertyUpdates.setNewValues(new Values());
48 cmHandlePropertyUpdates.getNewValues().setDataSyncEnabled(getDataSyncEnabledFlag(ncmpServiceCmHandle));
49 cmHandlePropertyUpdates.getNewValues()
50 .setCmHandleState(mapCmHandleStateToLcmEventCmHandleState(ncmpServiceCmHandle));
51 cmHandlePropertyUpdates.getNewValues()
52 .setCmHandleProperties(List.of(ncmpServiceCmHandle.getPublicProperties()));
53 return cmHandlePropertyUpdates;
57 * Determines property updates between current and target CM handle states.
59 * @param currentNcmpServiceCmHandle the current CM handle state
60 * @param targetNcmpServiceCmHandle the target CM handle state
61 * @return CmHandlePropertyUpdates containing old and new values for changed properties
63 static CmHandlePropertyUpdates determineUpdates(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
64 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
65 final boolean hasDataSyncFlagEnabledChanged =
66 hasDataSyncEnabledFlagChanged(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle);
67 final boolean hasCmHandleStateChanged =
68 hasCmHandleStateChanged(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle);
69 final boolean arePublicCmHandlePropertiesEqual =
70 arePublicCmHandlePropertiesEqual(currentNcmpServiceCmHandle.getPublicProperties(),
71 targetNcmpServiceCmHandle.getPublicProperties()
74 final CmHandlePropertyUpdates cmHandlePropertyUpdates = new CmHandlePropertyUpdates();
76 if (hasDataSyncFlagEnabledChanged || hasCmHandleStateChanged || (!arePublicCmHandlePropertiesEqual)) {
77 cmHandlePropertyUpdates.setOldValues(new Values());
78 cmHandlePropertyUpdates.setNewValues(new Values());
80 return cmHandlePropertyUpdates;
83 if (hasDataSyncFlagEnabledChanged) {
84 setDataSyncEnabledFlag(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle, cmHandlePropertyUpdates);
87 if (hasCmHandleStateChanged) {
88 setCmHandleStateChange(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle, cmHandlePropertyUpdates);
91 if (!arePublicCmHandlePropertiesEqual) {
92 setPublicCmHandlePropertiesChange(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle,
93 cmHandlePropertyUpdates);
96 return cmHandlePropertyUpdates;
100 private static void setDataSyncEnabledFlag(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
101 final NcmpServiceCmHandle targetNcmpServiceCmHandle,
102 final CmHandlePropertyUpdates cmHandlePropertyUpdates) {
103 cmHandlePropertyUpdates.getOldValues().setDataSyncEnabled(getDataSyncEnabledFlag(currentNcmpServiceCmHandle));
104 cmHandlePropertyUpdates.getNewValues().setDataSyncEnabled(getDataSyncEnabledFlag(targetNcmpServiceCmHandle));
108 private static void setCmHandleStateChange(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
109 final NcmpServiceCmHandle targetNcmpServiceCmHandle,
110 final CmHandlePropertyUpdates cmHandlePropertyUpdates) {
111 cmHandlePropertyUpdates.getOldValues()
112 .setCmHandleState(mapCmHandleStateToLcmEventCmHandleState(currentNcmpServiceCmHandle));
113 cmHandlePropertyUpdates.getNewValues()
114 .setCmHandleState(mapCmHandleStateToLcmEventCmHandleState(targetNcmpServiceCmHandle));
117 private static void setPublicCmHandlePropertiesChange(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
118 final NcmpServiceCmHandle targetNcmpServiceCmHandle,
119 final CmHandlePropertyUpdates cmHandlePropertyUpdates) {
121 final Map<String, Map<String, String>> publicCmHandlePropertiesDifference =
122 getPublicCmHandlePropertiesDifference(currentNcmpServiceCmHandle.getPublicProperties(),
123 targetNcmpServiceCmHandle.getPublicProperties()
125 cmHandlePropertyUpdates.getOldValues()
126 .setCmHandleProperties(List.of(publicCmHandlePropertiesDifference.get("oldValues")));
127 cmHandlePropertyUpdates.getNewValues()
128 .setCmHandleProperties(List.of(publicCmHandlePropertiesDifference.get("newValues")));
132 private static Values.CmHandleState mapCmHandleStateToLcmEventCmHandleState(
133 final NcmpServiceCmHandle ncmpServiceCmHandle) {
134 return Values.CmHandleState.fromValue(ncmpServiceCmHandle.getCompositeState().getCmHandleState().name());
137 private static Boolean getDataSyncEnabledFlag(final NcmpServiceCmHandle ncmpServiceCmHandle) {
138 return ncmpServiceCmHandle.getCompositeState().getDataSyncEnabled();
141 private static boolean hasDataSyncEnabledFlagChanged(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
142 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
143 final Boolean currentDataSyncFlag = currentNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled();
144 final Boolean targetDataSyncFlag = targetNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled();
146 if (targetDataSyncFlag == null) {
147 return currentDataSyncFlag != null;
150 return !targetDataSyncFlag.equals(currentDataSyncFlag);
153 private static boolean hasCmHandleStateChanged(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
154 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
155 return targetNcmpServiceCmHandle.getCompositeState().getCmHandleState()
156 != currentNcmpServiceCmHandle.getCompositeState().getCmHandleState();
159 private static boolean arePublicCmHandlePropertiesEqual(final Map<String, String> currentCmHandleProperties,
160 final Map<String, String> targetCmHandleProperties) {
161 if (targetCmHandleProperties.size() != currentCmHandleProperties.size()) {
164 return targetCmHandleProperties.equals(currentCmHandleProperties);
167 private static Map<String, Map<String, String>> getPublicCmHandlePropertiesDifference(
168 final Map<String, String> currentCmHandleProperties,
169 final Map<String, String> targetCmHandleProperties) {
170 final Map<String, Map<String, String>> oldAndNewPropertiesDifferenceMap = new HashMap<>(2);
172 final MapDifference<String, String> cmHandlePropertiesDifference =
173 Maps.difference(targetCmHandleProperties, currentCmHandleProperties);
175 final Map<String, String> oldValues = new HashMap<>(cmHandlePropertiesDifference.entriesOnlyOnRight());
176 final Map<String, String> newValues = new HashMap<>(cmHandlePropertiesDifference.entriesOnlyOnLeft());
178 cmHandlePropertiesDifference.entriesDiffering().keySet().forEach(cmHandlePropertyName -> {
179 oldValues.put(cmHandlePropertyName, currentCmHandleProperties.get(cmHandlePropertyName));
180 newValues.put(cmHandlePropertyName, targetCmHandleProperties.get(cmHandlePropertyName));
183 oldAndNewPropertiesDifferenceMap.put("oldValues", oldValues);
184 oldAndNewPropertiesDifferenceMap.put("newValues", newValues);
186 return oldAndNewPropertiesDifferenceMap;