e3cf1fb24dca7a7a38fa775f83a5345981040d2c
[cps.git] /
1 /*
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
8  *
9  *       http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.cps.ncmp.impl.inventory.sync.lcm;
22
23 import com.google.common.collect.MapDifference;
24 import com.google.common.collect.Maps;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
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;
32
33 /**
34  * Utility class for examining and determining changes in CM handle properties.
35  */
36 @NoArgsConstructor(access = AccessLevel.PRIVATE)
37 public class CmHandlePropertyChangeDetector {
38
39     /**
40      * Determines property (update) values for creating a new CM handle.
41      *
42      * @param ncmpServiceCmHandle the CM handle being created
43      * @return CmHandlePropertyUpdates containing new values for the created CM handle
44      */
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;
54     }
55
56     /**
57      * Determines property updates between current and target CM handle states.
58      *
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
62      */
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()
72             );
73
74         final CmHandlePropertyUpdates cmHandlePropertyUpdates = new CmHandlePropertyUpdates();
75
76         if (hasDataSyncFlagEnabledChanged || hasCmHandleStateChanged || (!arePublicCmHandlePropertiesEqual)) {
77             cmHandlePropertyUpdates.setOldValues(new Values());
78             cmHandlePropertyUpdates.setNewValues(new Values());
79         } else {
80             return cmHandlePropertyUpdates;
81         }
82
83         if (hasDataSyncFlagEnabledChanged) {
84             setDataSyncEnabledFlag(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle, cmHandlePropertyUpdates);
85         }
86
87         if (hasCmHandleStateChanged) {
88             setCmHandleStateChange(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle, cmHandlePropertyUpdates);
89         }
90
91         if (!arePublicCmHandlePropertiesEqual) {
92             setPublicCmHandlePropertiesChange(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle,
93                 cmHandlePropertyUpdates);
94         }
95
96         return cmHandlePropertyUpdates;
97
98     }
99
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));
105
106     }
107
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));
115     }
116
117     private static void setPublicCmHandlePropertiesChange(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
118                                                           final NcmpServiceCmHandle targetNcmpServiceCmHandle,
119                                                           final CmHandlePropertyUpdates cmHandlePropertyUpdates) {
120
121         final Map<String, Map<String, String>> publicCmHandlePropertiesDifference =
122             getPublicCmHandlePropertiesDifference(currentNcmpServiceCmHandle.getPublicProperties(),
123                 targetNcmpServiceCmHandle.getPublicProperties()
124             );
125         cmHandlePropertyUpdates.getOldValues()
126             .setCmHandleProperties(List.of(publicCmHandlePropertiesDifference.get("oldValues")));
127         cmHandlePropertyUpdates.getNewValues()
128             .setCmHandleProperties(List.of(publicCmHandlePropertiesDifference.get("newValues")));
129
130     }
131
132     private static Values.CmHandleState mapCmHandleStateToLcmEventCmHandleState(
133         final NcmpServiceCmHandle ncmpServiceCmHandle) {
134         return Values.CmHandleState.fromValue(ncmpServiceCmHandle.getCompositeState().getCmHandleState().name());
135     }
136
137     private static Boolean getDataSyncEnabledFlag(final NcmpServiceCmHandle ncmpServiceCmHandle) {
138         return ncmpServiceCmHandle.getCompositeState().getDataSyncEnabled();
139     }
140
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();
145
146         if (targetDataSyncFlag == null) {
147             return currentDataSyncFlag != null;
148         }
149
150         return !targetDataSyncFlag.equals(currentDataSyncFlag);
151     }
152
153     private static boolean hasCmHandleStateChanged(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
154                                                    final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
155         return targetNcmpServiceCmHandle.getCompositeState().getCmHandleState()
156             != currentNcmpServiceCmHandle.getCompositeState().getCmHandleState();
157     }
158
159     private static boolean arePublicCmHandlePropertiesEqual(final Map<String, String> currentCmHandleProperties,
160                                                             final Map<String, String> targetCmHandleProperties) {
161         if (targetCmHandleProperties.size() != currentCmHandleProperties.size()) {
162             return false;
163         }
164         return targetCmHandleProperties.equals(currentCmHandleProperties);
165     }
166
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);
171
172         final MapDifference<String, String> cmHandlePropertiesDifference =
173             Maps.difference(targetCmHandleProperties, currentCmHandleProperties);
174
175         final Map<String, String> oldValues = new HashMap<>(cmHandlePropertiesDifference.entriesOnlyOnRight());
176         final Map<String, String> newValues = new HashMap<>(cmHandlePropertiesDifference.entriesOnlyOnLeft());
177
178         cmHandlePropertiesDifference.entriesDiffering().keySet().forEach(cmHandlePropertyName -> {
179             oldValues.put(cmHandlePropertyName, currentCmHandleProperties.get(cmHandlePropertyName));
180             newValues.put(cmHandlePropertyName, targetCmHandleProperties.get(cmHandlePropertyName));
181         });
182
183         oldAndNewPropertiesDifferenceMap.put("oldValues", oldValues);
184         oldAndNewPropertiesDifferenceMap.put("newValues", newValues);
185
186         return oldAndNewPropertiesDifferenceMap;
187     }
188
189 }