Catalog alignment
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / merge / capability / SimpleCapabilityResolver.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.be.components.merge.capability;
22
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;
28
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.Objects;
34
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 {
39
40     private MergeInstanceUtils mergeInstanceUtils;
41
42     public SimpleCapabilityResolver(MergeInstanceUtils mergeInstanceUtils) {
43         this.mergeInstanceUtils = mergeInstanceUtils;
44     }
45
46     @Override
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);
51     }
52
53     @Override
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);
59     }
60
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;
65     }
66
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);
72         });
73         return prevToNewCapabilityMapping;
74     }
75
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))
82                        .findFirst()
83                        .orElse(null);
84     }
85
86
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);
90     }
91
92     private void removeNotFoundNewCapabilities(Map<CapabilityDefinition, CapabilityDefinition> oldToNewCapMap) {
93         oldToNewCapMap.values().removeIf(Objects::isNull);
94     }
95
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<>());
101     }
102
103
104
105
106
107 }