2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.components.merge.capability;
23 import org.openecomp.sdc.be.components.merge.utils.MergeInstanceUtils;
24 import org.openecomp.sdc.be.dao.utils.MapUtil;
25 import org.openecomp.sdc.be.model.CapabilityDefinition;
26 import org.openecomp.sdc.be.model.Component;
27 import org.openecomp.sdc.be.model.ComponentInstance;
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.List;
33 import java.util.Objects;
35 import static java.util.stream.Collectors.toList;
36 import static org.openecomp.sdc.be.dao.utils.MapUtil.flattenMapValues;
37 @org.springframework.stereotype.Component
38 public class SimpleCapabilityResolver implements CapabilityResolver {
40 private MergeInstanceUtils mergeInstanceUtils;
42 public SimpleCapabilityResolver(MergeInstanceUtils mergeInstanceUtils) {
43 this.mergeInstanceUtils = mergeInstanceUtils;
47 public Map<CapabilityDefinition, CapabilityDefinition> resolvePrevCapToNewCapability(Component container, Component prevInstanceOrigNode, String cmptInstanceId, List<CapabilityDefinition> prevCapabilities) {
48 List<CapabilityDefinition> newCapabilities = resolveInstanceCapabilities(container, cmptInstanceId);
49 Map<String, String> oldCapOwnerToNewOwner = mapOldToNewCapabilitiesOwnerIds(container, prevInstanceOrigNode, cmptInstanceId, prevCapabilities);
50 return mapOldToNewCapabilities(prevCapabilities, newCapabilities, oldCapOwnerToNewOwner);
54 public Map<CapabilityDefinition, CapabilityDefinition> resolvePrevCapIdToNewCapability(ComponentInstance oldInstance, ComponentInstance currInstance) {
55 List<CapabilityDefinition> newCapabilities = flattenMapValues(currInstance.getCapabilities());
56 List<CapabilityDefinition> prevCapabilities = flattenMapValues(oldInstance.getCapabilities());
57 Map<String, String> oldCapOwnerToNewOwner = mergeInstanceUtils.mapOldToNewCapabilitiesOwnerIds(oldInstance, currInstance);
58 return mapOldToNewCapabilities(prevCapabilities, newCapabilities, oldCapOwnerToNewOwner);
61 private Map<CapabilityDefinition, CapabilityDefinition> mapOldToNewCapabilities(List<CapabilityDefinition> prevCapabilities, List<CapabilityDefinition> newCapabilities, Map<String, String> oldCapOwnerToNewOwner) {
62 Map<CapabilityDefinition, CapabilityDefinition> oldToNewCapability = findNewCapByPrevCapabilityNameTypeAndOwner(prevCapabilities, newCapabilities, oldCapOwnerToNewOwner);
63 removeNotFoundNewCapabilities(oldToNewCapability);
64 return oldToNewCapability;
67 private Map<CapabilityDefinition, CapabilityDefinition> findNewCapByPrevCapabilityNameTypeAndOwner(List<CapabilityDefinition> prevCapabilities, List<CapabilityDefinition> newCapabilities, Map<String, String> oldCapOwnerToNewOwner) {
68 Map<CapabilityDefinition, CapabilityDefinition> prevToNewCapabilityMapping = new HashMap<>();
69 prevCapabilities.forEach(prevCap -> {
70 CapabilityDefinition newCapability = mapOldToNewCapability(prevCap, newCapabilities, oldCapOwnerToNewOwner);
71 prevToNewCapabilityMapping.put(prevCap, newCapability);
73 return prevToNewCapabilityMapping;
76 private CapabilityDefinition mapOldToNewCapability(CapabilityDefinition prevCap, List<CapabilityDefinition> newCapabilities, Map<String, String> oldCapOwnerToNewOwner) {
77 String newOwnerId = oldCapOwnerToNewOwner.get(prevCap.getOwnerId());
78 return newCapabilities.stream()
79 .filter(newCap -> newCap.getName().equals(prevCap.getName()))
80 .filter(newCap -> newCap.getType().equals(prevCap.getType()))
81 .filter(newCap -> newCap.getOwnerId().equals(newOwnerId))
87 private Map<String, String> mapOldToNewCapabilitiesOwnerIds(Component container, Component origInstanceNode, String cmptInstanceId, List<CapabilityDefinition> prevCapabilities) {
88 List<String> prevCapOwnerIds = prevCapabilities.stream().map(CapabilityDefinition::getOwnerId).distinct().collect(toList());
89 return mergeInstanceUtils.mapOldToNewCapabilitiesOwnerIds(container, origInstanceNode, cmptInstanceId, prevCapOwnerIds);
92 private void removeNotFoundNewCapabilities(Map<CapabilityDefinition, CapabilityDefinition> oldToNewCapMap) {
93 oldToNewCapMap.values().removeIf(Objects::isNull);
96 private List<CapabilityDefinition> resolveInstanceCapabilities(Component capabilityOwnerContainer, String cmptInstanceId) {
97 return capabilityOwnerContainer.getComponentInstanceById(cmptInstanceId)
98 .map(ComponentInstance::getCapabilities)
99 .map(MapUtil::flattenMapValues)
100 .orElse(new ArrayList<>());