e468dd2fc532b561c9ebe92dbf650d529c93a2c3
[sdc.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 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.asdctool.impl.migration.v1707.jsonmodel.relations;
22
23 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
24 import org.openecomp.sdc.be.model.CapabilityDefinition;
25 import org.openecomp.sdc.be.model.Component;
26 import org.openecomp.sdc.be.model.ComponentInstance;
27 import org.openecomp.sdc.be.model.RequirementDefinition;
28
29 import javax.annotation.Resource;
30 import java.util.ArrayList;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.function.Function;
34 import java.util.stream.Collectors;
35
36 public class RequirementsCapabilitiesMigrationService<T extends Component> {
37
38     @Resource(name = "fulfilled-capabilities-mig-service")
39     FulfilledCapabilitiesMigrationService fulfilledCapabilityUpdate;
40
41     @Resource(name = "fulfilled-requirements-mig-service")
42     FulfilledRequirementsMigrationService fulfilledRequirementUpdate;
43
44     public boolean associateFulfilledCapabilities(T component, NodeTypeEnum nodeType) {
45         return fulfilledCapabilityUpdate.associateToscaDefinitions(component, nodeType);
46     }
47
48     public boolean associateFulfilledRequirements(T component, NodeTypeEnum nodeType) {
49         return fulfilledRequirementUpdate.associateToscaDefinitions(component, nodeType);
50     }
51
52     public void overrideInstanceCapabilitiesRequirements(T element) {
53         if (element.getComponentInstances() != null) {
54             clearInstancesCapabilitiesRequirements(element);
55             setInstancesRequirementsFromComponent(element);
56             setInstancesCapabilitiesFromComponent(element);
57         }
58     }
59
60     private void clearInstancesCapabilitiesRequirements(T element) {
61         element.getComponentInstances().forEach(componentInstance -> {
62             if (componentInstance.getCapabilities() != null) {
63                 componentInstance.getCapabilities().clear();
64             }
65             if (componentInstance.getRequirements() != null) {
66                 componentInstance.getRequirements().clear();
67             }
68         });
69     }
70
71     private void setInstancesCapabilitiesFromComponent(T element) {
72         if (element.getCapabilities() != null) {
73             Map<String, ComponentInstance> instancesById = groupInstancesById(element);
74             element.getCapabilities().forEach((type, definitions) -> { setCapabilitiesOnInstance(instancesById, type, definitions);});
75         }
76     }
77
78     private void setInstancesRequirementsFromComponent(T element) {
79         if (element.getRequirements() != null) {
80             Map<String, ComponentInstance> instancesById = groupInstancesById(element);
81             element.getRequirements().forEach((type, requirements) -> { setRequirementsOnInstance(instancesById, type, requirements);});
82         }
83     }
84
85     private void setCapabilitiesOnInstance(Map<String, ComponentInstance> instances, String capabilityType, List<CapabilityDefinition> definitions) {
86         Map<String, List<CapabilityDefinition>> capByInstance = definitions.stream().collect(Collectors.groupingBy(CapabilityDefinition::getOwnerId));
87         capByInstance.forEach((instanceId, capabilityDefinitions) -> { setCapabilitiesOnInstanceByType(instances.get(instanceId), capabilityType, capabilityDefinitions); });
88     }
89
90     private void setRequirementsOnInstance(Map<String, ComponentInstance> instances, String requirementType, List<RequirementDefinition> requirements) {
91         Map<String, List<RequirementDefinition>> reqByInstance = requirements.stream().collect(Collectors.groupingBy(RequirementDefinition::getOwnerId));
92         reqByInstance.forEach((instanceId, reqDefinitions) -> { setRequirementsOnInstanceByType(instances.get(instanceId), requirementType, reqDefinitions);});
93     }
94
95     private void setCapabilitiesOnInstanceByType(ComponentInstance instance, String capabilityType, List<CapabilityDefinition> capabilityDefinitions) {
96         instance.getCapabilities().putIfAbsent(capabilityType, new ArrayList<>());
97         instance.getCapabilities().get(capabilityType).addAll(capabilityDefinitions);
98     }
99
100     private void setRequirementsOnInstanceByType(ComponentInstance instance, String requirementType, List<RequirementDefinition> reqDefinitions) {
101         instance.getRequirements().putIfAbsent(requirementType, new ArrayList<>());
102         instance.getRequirements().get(requirementType).addAll(reqDefinitions);
103     }
104
105     private Map<String, ComponentInstance> groupInstancesById(T element) {
106         return element.getComponentInstances()
107                 .stream()
108                 .collect(Collectors.toMap(ComponentInstance::getUniqueId, Function.identity()));
109     }
110
111 }