2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2022-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 static org.onap.cps.ncmp.api.inventory.models.CmHandleState.DELETED;
24 import static org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventType.CREATE;
25 import static org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventType.DELETE;
26 import static org.onap.cps.ncmp.impl.inventory.sync.lcm.LcmEventType.UPDATE;
28 import com.google.common.collect.MapDifference;
29 import com.google.common.collect.Maps;
30 import java.util.HashMap;
31 import java.util.List;
33 import java.util.UUID;
35 import lombok.NoArgsConstructor;
36 import lombok.RequiredArgsConstructor;
38 import lombok.extern.slf4j.Slf4j;
39 import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle;
40 import org.onap.cps.ncmp.events.lcm.v1.Event;
41 import org.onap.cps.ncmp.events.lcm.v1.LcmEvent;
42 import org.onap.cps.ncmp.events.lcm.v1.LcmEventHeader;
43 import org.onap.cps.ncmp.events.lcm.v1.Values;
44 import org.onap.cps.ncmp.impl.utils.EventDateTimeFormatter;
45 import org.springframework.stereotype.Component;
48 * LcmEventsProducerHelper to create LcmEvent based on relevant operation.
52 @RequiredArgsConstructor
53 public class LcmEventsProducerHelper {
55 private final LcmEventHeaderMapper lcmEventHeaderMapper;
58 * Create Lifecycle Management Event.
60 * @param cmHandleId cm handle identifier
61 * @param currentNcmpServiceCmHandle current ncmp service cmhandle
62 * @param targetNcmpServiceCmHandle target ncmp service cmhandle
63 * @return Populated LcmEvent
65 public LcmEvent createLcmEvent(final String cmHandleId,
66 final NcmpServiceCmHandle currentNcmpServiceCmHandle,
67 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
68 final LcmEventType lcmEventType =
69 determineEventType(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle);
70 final LcmEvent lcmEvent = createLcmEventWithHeaderDetails(cmHandleId, lcmEventType);
71 final Event event = new Event();
72 event.setCmHandleId(cmHandleId);
73 event.setAlternateId(targetNcmpServiceCmHandle.getAlternateId());
74 event.setModuleSetTag(targetNcmpServiceCmHandle.getModuleSetTag());
75 event.setDataProducerIdentifier(targetNcmpServiceCmHandle.getDataProducerIdentifier());
76 final CmHandleValuesHolder cmHandleValuesHolder =
77 determineEventValues(lcmEventType, currentNcmpServiceCmHandle, targetNcmpServiceCmHandle);
78 event.setOldValues(cmHandleValuesHolder.getOldValues());
79 event.setNewValues(cmHandleValuesHolder.getNewValues());
80 lcmEvent.setEvent(event);
85 * Create Lifecycle Management Event Header.
87 * @param cmHandleId cm handle identifier
88 * @param currentNcmpServiceCmHandle current ncmp service cmhandle
89 * @param targetNcmpServiceCmHandle target ncmp service cmhandle
90 * @return Populated LcmEventHeader
92 public LcmEventHeader createLcmEventHeader(final String cmHandleId,
93 final NcmpServiceCmHandle currentNcmpServiceCmHandle,
94 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
95 final LcmEventType lcmEventType =
96 determineEventType(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle);
97 final LcmEvent lcmEventWithHeaderDetails = createLcmEventWithHeaderDetails(cmHandleId, lcmEventType);
98 return lcmEventHeaderMapper.toLcmEventHeader(lcmEventWithHeaderDetails);
101 private static LcmEventType determineEventType(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
102 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
104 if (currentNcmpServiceCmHandle.getCompositeState() == null) {
106 } else if (targetNcmpServiceCmHandle.getCompositeState().getCmHandleState() == DELETED) {
112 private static CmHandleValuesHolder determineEventValues(final LcmEventType lcmEventType,
113 final NcmpServiceCmHandle currentNcmpServiceCmHandle,
114 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
115 if (CREATE == lcmEventType) {
116 return determineCreateEventValues(targetNcmpServiceCmHandle);
117 } else if (UPDATE == lcmEventType) {
118 return determineUpdateEventValues(targetNcmpServiceCmHandle, currentNcmpServiceCmHandle);
120 return new CmHandleValuesHolder();
124 private LcmEvent createLcmEventWithHeaderDetails(final String eventCorrelationId, final LcmEventType lcmEventType) {
125 final LcmEvent lcmEvent = new LcmEvent();
126 lcmEvent.setEventId(UUID.randomUUID().toString());
127 lcmEvent.setEventCorrelationId(eventCorrelationId);
128 lcmEvent.setEventTime(EventDateTimeFormatter.getCurrentIsoFormattedDateTime());
129 lcmEvent.setEventSource("org.onap.ncmp");
130 lcmEvent.setEventType(lcmEventType.getEventType());
131 lcmEvent.setEventSchema("org.onap.ncmp:cmhandle-lcm-event");
132 lcmEvent.setEventSchemaVersion("1.0");
137 private static CmHandleValuesHolder determineCreateEventValues(final NcmpServiceCmHandle ncmpServiceCmHandle) {
138 final CmHandleValuesHolder cmHandleValuesHolder = new CmHandleValuesHolder();
139 cmHandleValuesHolder.setNewValues(new Values());
140 cmHandleValuesHolder.getNewValues().setDataSyncEnabled(getDataSyncEnabledFlag(ncmpServiceCmHandle));
141 cmHandleValuesHolder.getNewValues()
142 .setCmHandleState(mapCmHandleStateToLcmEventCmHandleState(ncmpServiceCmHandle));
143 cmHandleValuesHolder.getNewValues().setCmHandleProperties(List.of(ncmpServiceCmHandle.getPublicProperties()));
144 return cmHandleValuesHolder;
147 private static CmHandleValuesHolder determineUpdateEventValues(final NcmpServiceCmHandle targetNcmpServiceCmHandle,
148 final NcmpServiceCmHandle currentNcmpServiceCmHandle) {
149 final boolean hasDataSyncFlagEnabledChanged =
150 hasDataSyncEnabledFlagChanged(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle);
151 final boolean hasCmHandleStateChanged =
152 hasCmHandleStateChanged(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle);
153 final boolean arePublicCmHandlePropertiesEqual =
154 arePublicCmHandlePropertiesEqual(currentNcmpServiceCmHandle.getPublicProperties(),
155 targetNcmpServiceCmHandle.getPublicProperties()
158 final CmHandleValuesHolder cmHandleValuesHolder = new CmHandleValuesHolder();
160 if (hasDataSyncFlagEnabledChanged || hasCmHandleStateChanged || (!arePublicCmHandlePropertiesEqual)) {
161 cmHandleValuesHolder.setOldValues(new Values());
162 cmHandleValuesHolder.setNewValues(new Values());
164 return cmHandleValuesHolder;
167 if (hasDataSyncFlagEnabledChanged) {
168 setDataSyncEnabledFlag(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle, cmHandleValuesHolder);
171 if (hasCmHandleStateChanged) {
172 setCmHandleStateChange(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle, cmHandleValuesHolder);
175 if (!arePublicCmHandlePropertiesEqual) {
176 setPublicCmHandlePropertiesChange(currentNcmpServiceCmHandle, targetNcmpServiceCmHandle,
177 cmHandleValuesHolder);
180 return cmHandleValuesHolder;
184 private static void setDataSyncEnabledFlag(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
185 final NcmpServiceCmHandle targetNcmpServiceCmHandle,
186 final CmHandleValuesHolder cmHandleValuesHolder) {
187 cmHandleValuesHolder.getOldValues().setDataSyncEnabled(getDataSyncEnabledFlag(currentNcmpServiceCmHandle));
188 cmHandleValuesHolder.getNewValues().setDataSyncEnabled(getDataSyncEnabledFlag(targetNcmpServiceCmHandle));
192 private static void setCmHandleStateChange(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
193 final NcmpServiceCmHandle targetNcmpServiceCmHandle,
194 final CmHandleValuesHolder cmHandleValuesHolder) {
195 cmHandleValuesHolder.getOldValues()
196 .setCmHandleState(mapCmHandleStateToLcmEventCmHandleState(currentNcmpServiceCmHandle));
197 cmHandleValuesHolder.getNewValues()
198 .setCmHandleState(mapCmHandleStateToLcmEventCmHandleState(targetNcmpServiceCmHandle));
201 private static void setPublicCmHandlePropertiesChange(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
202 final NcmpServiceCmHandle targetNcmpServiceCmHandle,
203 final CmHandleValuesHolder cmHandleValuesHolder) {
205 final Map<String, Map<String, String>> publicCmHandlePropertiesDifference =
206 getPublicCmHandlePropertiesDifference(currentNcmpServiceCmHandle.getPublicProperties(),
207 targetNcmpServiceCmHandle.getPublicProperties()
209 cmHandleValuesHolder.getOldValues()
210 .setCmHandleProperties(List.of(publicCmHandlePropertiesDifference.get("oldValues")));
211 cmHandleValuesHolder.getNewValues()
212 .setCmHandleProperties(List.of(publicCmHandlePropertiesDifference.get("newValues")));
216 private static Values.CmHandleState mapCmHandleStateToLcmEventCmHandleState(
217 final NcmpServiceCmHandle ncmpServiceCmHandle) {
218 return Values.CmHandleState.fromValue(ncmpServiceCmHandle.getCompositeState().getCmHandleState().name());
221 private static Boolean getDataSyncEnabledFlag(final NcmpServiceCmHandle ncmpServiceCmHandle) {
222 return ncmpServiceCmHandle.getCompositeState().getDataSyncEnabled();
225 private static boolean hasDataSyncEnabledFlagChanged(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
226 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
227 final Boolean currentDataSyncFlag = currentNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled();
228 final Boolean targetDataSyncFlag = targetNcmpServiceCmHandle.getCompositeState().getDataSyncEnabled();
230 if (targetDataSyncFlag == null) {
231 return currentDataSyncFlag != null;
234 return !targetDataSyncFlag.equals(currentDataSyncFlag);
237 private static boolean hasCmHandleStateChanged(final NcmpServiceCmHandle currentNcmpServiceCmHandle,
238 final NcmpServiceCmHandle targetNcmpServiceCmHandle) {
239 return targetNcmpServiceCmHandle.getCompositeState().getCmHandleState()
240 != currentNcmpServiceCmHandle.getCompositeState().getCmHandleState();
243 private static boolean arePublicCmHandlePropertiesEqual(final Map<String, String> currentCmHandleProperties,
244 final Map<String, String> targetCmHandleProperties) {
245 if (targetCmHandleProperties.size() != currentCmHandleProperties.size()) {
248 return targetCmHandleProperties.equals(currentCmHandleProperties);
251 private static Map<String, Map<String, String>> getPublicCmHandlePropertiesDifference(
252 final Map<String, String> currentCmHandleProperties,
253 final Map<String, String> targetCmHandleProperties) {
254 final Map<String, Map<String, String>> oldAndNewPropertiesDifferenceMap = new HashMap<>(2);
256 final MapDifference<String, String> cmHandlePropertiesDifference =
257 Maps.difference(targetCmHandleProperties, currentCmHandleProperties);
259 final Map<String, String> oldValues = new HashMap<>(cmHandlePropertiesDifference.entriesOnlyOnRight());
260 final Map<String, String> newValues = new HashMap<>(cmHandlePropertiesDifference.entriesOnlyOnLeft());
262 cmHandlePropertiesDifference.entriesDiffering().keySet().forEach(cmHandlePropertyName -> {
263 oldValues.put(cmHandlePropertyName, currentCmHandleProperties.get(cmHandlePropertyName));
264 newValues.put(cmHandlePropertyName, targetCmHandleProperties.get(cmHandlePropertyName));
267 oldAndNewPropertiesDifferenceMap.put("oldValues", oldValues);
268 oldAndNewPropertiesDifferenceMap.put("newValues", newValues);
270 return oldAndNewPropertiesDifferenceMap;
276 static class CmHandleValuesHolder {
277 private Values oldValues;
278 private Values newValues;