2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2023 Nordix Foundation
 
   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.api.impl.events.deprecated.cmsubscription;
 
  23 import static org.onap.cps.ncmp.api.NcmpResponseStatus.PARTIALLY_APPLIED_SUBSCRIPTION;
 
  24 import static org.onap.cps.ncmp.api.NcmpResponseStatus.SUBSCRIPTION_NOT_APPLICABLE;
 
  25 import static org.onap.cps.ncmp.api.NcmpResponseStatus.SUBSCRIPTION_PENDING;
 
  26 import static org.onap.cps.ncmp.api.NcmpResponseStatus.SUCCESSFULLY_APPLIED_SUBSCRIPTION;
 
  27 import static org.onap.cps.ncmp.api.impl.deprecated.subscriptions.SubscriptionStatus.ACCEPTED;
 
  28 import static org.onap.cps.ncmp.api.impl.deprecated.subscriptions.SubscriptionStatus.PENDING;
 
  29 import static org.onap.cps.ncmp.api.impl.deprecated.subscriptions.SubscriptionStatus.REJECTED;
 
  31 import io.cloudevents.CloudEvent;
 
  32 import java.util.List;
 
  34 import lombok.RequiredArgsConstructor;
 
  35 import lombok.extern.slf4j.Slf4j;
 
  36 import org.onap.cps.ncmp.api.NcmpResponseStatus;
 
  37 import org.onap.cps.ncmp.api.impl.deprecated.subscriptions.SubscriptionPersistence;
 
  38 import org.onap.cps.ncmp.api.impl.deprecated.subscriptions.SubscriptionStatus;
 
  39 import org.onap.cps.ncmp.api.impl.events.EventsPublisher;
 
  40 import org.onap.cps.ncmp.api.impl.utils.DataNodeHelper;
 
  41 import org.onap.cps.ncmp.api.impl.utils.SubscriptionOutcomeCloudMapper;
 
  42 import org.onap.cps.ncmp.api.models.CmSubscriptionEvent;
 
  43 import org.onap.cps.ncmp.api.models.CmSubscriptionStatus;
 
  44 import org.onap.cps.ncmp.events.cmsubscription1_0_0.ncmp_to_client.CmSubscriptionNcmpOutEvent;
 
  45 import org.springframework.beans.factory.annotation.Value;
 
  46 import org.springframework.stereotype.Component;
 
  50 @RequiredArgsConstructor
 
  51 public class CmSubscriptionNcmpOutEventPublisher {
 
  53     private final SubscriptionPersistence subscriptionPersistence;
 
  55     private final EventsPublisher<CloudEvent> outcomeEventsPublisher;
 
  57     private final CmSubscriptionEventToCmSubscriptionNcmpOutEventMapper
 
  58             cmSubscriptionEventToCmSubscriptionNcmpOutEventMapper;
 
  60     private final SubscriptionOutcomeCloudMapper subscriptionOutcomeCloudMapper;
 
  62     @Value("${app.ncmp.avc.subscription-outcome-topic:subscription-response}")
 
  63     private String subscriptionOutcomeEventTopic;
 
  66      * This is for construction of outcome message to be published for client apps.
 
  68      * @param cmSubscriptionEvent event produced by Dmi Plugin
 
  70     public void sendResponse(final CmSubscriptionEvent cmSubscriptionEvent, final String eventType) {
 
  71         final CmSubscriptionNcmpOutEvent cmSubscriptionNcmpOutEvent =
 
  72                 formCmSubscriptionNcmpOutEvent(cmSubscriptionEvent);
 
  73         final String subscriptionClientId = cmSubscriptionEvent.getClientId();
 
  74         final String subscriptionName = cmSubscriptionEvent.getSubscriptionName();
 
  75         final String subscriptionEventId = subscriptionClientId + subscriptionName;
 
  76         final CloudEvent subscriptionOutcomeCloudEvent =
 
  77                 subscriptionOutcomeCloudMapper.toCloudEvent(cmSubscriptionNcmpOutEvent,
 
  78                 subscriptionEventId, eventType);
 
  79         outcomeEventsPublisher.publishCloudEvent(subscriptionOutcomeEventTopic,
 
  80                 subscriptionEventId, subscriptionOutcomeCloudEvent);
 
  83     private CmSubscriptionNcmpOutEvent formCmSubscriptionNcmpOutEvent(
 
  84             final CmSubscriptionEvent cmSubscriptionEvent) {
 
  85         final Map<String, Map<String, String>> cmHandleIdToStatusAndDetailsAsMap =
 
  86                 DataNodeHelper.cmHandleIdToStatusAndDetailsAsMapFromDataNode(
 
  87                         subscriptionPersistence.getCmHandlesForSubscriptionEvent(
 
  88                                 cmSubscriptionEvent.getClientId(),
 
  89                                 cmSubscriptionEvent.getSubscriptionName()));
 
  90         final List<CmSubscriptionStatus> cmSubscriptionStatusList =
 
  91                 mapCmHandleIdStatusDetailsMapToSubscriptionStatusList(cmHandleIdToStatusAndDetailsAsMap);
 
  92         cmSubscriptionEvent.setCmSubscriptionStatus(cmSubscriptionStatusList);
 
  93         return fromCmSubscriptionEvent(cmSubscriptionEvent,
 
  94                 decideOnNcmpEventResponseCodeForSubscription(cmHandleIdToStatusAndDetailsAsMap));
 
  97     private static List<CmSubscriptionStatus> mapCmHandleIdStatusDetailsMapToSubscriptionStatusList(
 
  98             final Map<String, Map<String, String>> cmHandleIdToStatusAndDetailsAsMap) {
 
  99         return cmHandleIdToStatusAndDetailsAsMap.entrySet()
 
 100                 .stream().map(entryset -> {
 
 101                     final CmSubscriptionStatus cmSubscriptionStatus = new CmSubscriptionStatus();
 
 102                     final String cmHandleId = entryset.getKey();
 
 103                     final Map<String, String> statusAndDetailsMap = entryset.getValue();
 
 104                     final String status = statusAndDetailsMap.get("status");
 
 105                     final String details = statusAndDetailsMap.get("details");
 
 106                     cmSubscriptionStatus.setId(cmHandleId);
 
 107                     cmSubscriptionStatus.setStatus(SubscriptionStatus.fromString(status));
 
 108                     cmSubscriptionStatus.setDetails(details);
 
 109                     return cmSubscriptionStatus;
 
 113     private NcmpResponseStatus decideOnNcmpEventResponseCodeForSubscription(
 
 114             final Map<String, Map<String, String>> cmHandleIdToStatusAndDetailsAsMap) {
 
 116         if (allTargetsHaveStatus(cmHandleIdToStatusAndDetailsAsMap, ACCEPTED)) {
 
 117             return SUCCESSFULLY_APPLIED_SUBSCRIPTION;
 
 119         if (allTargetsHaveStatus(cmHandleIdToStatusAndDetailsAsMap, REJECTED)) {
 
 120             return SUBSCRIPTION_NOT_APPLICABLE;
 
 122         if (allTargetsHaveStatus(cmHandleIdToStatusAndDetailsAsMap, PENDING)) {
 
 123             return SUBSCRIPTION_PENDING;
 
 125         return PARTIALLY_APPLIED_SUBSCRIPTION;
 
 128     private boolean allTargetsHaveStatus(final Map<String, Map<String, String>> cmHandleIdToStatusAndDetailsAsMap,
 
 129                                          final SubscriptionStatus subscriptionStatus) {
 
 130         return cmHandleIdToStatusAndDetailsAsMap.values().stream()
 
 131                 .allMatch(entryset -> entryset.containsValue(subscriptionStatus.toString()));
 
 134     private CmSubscriptionNcmpOutEvent fromCmSubscriptionEvent(
 
 135             final CmSubscriptionEvent cmSubscriptionEvent,
 
 136             final NcmpResponseStatus ncmpResponseStatus) {
 
 138         final CmSubscriptionNcmpOutEvent cmSubscriptionNcmpOutEvent =
 
 139                 cmSubscriptionEventToCmSubscriptionNcmpOutEventMapper.toCmSubscriptionNcmpOutEvent(
 
 140                         cmSubscriptionEvent);
 
 141         cmSubscriptionNcmpOutEvent.getData().setStatusCode(Integer.parseInt(ncmpResponseStatus.getCode()));
 
 142         cmSubscriptionNcmpOutEvent.getData().setStatusMessage(ncmpResponseStatus.getMessage());
 
 144         return cmSubscriptionNcmpOutEvent;