f74e40a8fc41e0ccaf38bebaa1bad2432309be08
[sdc.git] /
1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel.relations;
2
3 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
4 import org.openecomp.sdc.be.model.CapabilityDefinition;
5 import org.openecomp.sdc.be.model.Component;
6 import org.openecomp.sdc.be.model.ComponentInstance;
7 import org.openecomp.sdc.be.model.RequirementDefinition;
8
9 import javax.annotation.Resource;
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.function.Function;
14 import java.util.stream.Collectors;
15
16 public class RequirementsCapabilitiesMigrationService<T extends Component> {
17
18     @Resource(name = "fulfilled-capabilities-mig-service")
19     FulfilledCapabilitiesMigrationService fulfilledCapabilityUpdate;
20
21     @Resource(name = "fulfilled-requirements-mig-service")
22     FulfilledRequirementsMigrationService fulfilledRequirementUpdate;
23
24     public boolean associateFulfilledCapabilities(T component, NodeTypeEnum nodeType) {
25         return fulfilledCapabilityUpdate.associateToscaDefinitions(component, nodeType);
26     }
27
28     public boolean associateFulfilledRequirements(T component, NodeTypeEnum nodeType) {
29         return fulfilledRequirementUpdate.associateToscaDefinitions(component, nodeType);
30     }
31
32     public void overrideInstanceCapabilitiesRequirements(T element) {
33         if (element.getComponentInstances() != null) {
34             clearInstancesCapabilitiesRequirements(element);
35             setInstancesRequirementsFromComponent(element);
36             setInstancesCapabilitiesFromComponent(element);
37         }
38     }
39
40     private void clearInstancesCapabilitiesRequirements(T element) {
41         element.getComponentInstances().forEach(componentInstance -> {
42             if (componentInstance.getCapabilities() != null) {
43                 componentInstance.getCapabilities().clear();
44             }
45             if (componentInstance.getRequirements() != null) {
46                 componentInstance.getRequirements().clear();
47             }
48         });
49     }
50
51     private void setInstancesCapabilitiesFromComponent(T element) {
52         if (element.getCapabilities() != null) {
53             Map<String, ComponentInstance> instancesById = groupInstancesById(element);
54             element.getCapabilities().forEach((type, definitions) -> { setCapabilitiesOnInstance(instancesById, type, definitions);});
55         }
56     }
57
58     private void setInstancesRequirementsFromComponent(T element) {
59         if (element.getRequirements() != null) {
60             Map<String, ComponentInstance> instancesById = groupInstancesById(element);
61             element.getRequirements().forEach((type, requirements) -> { setRequirementsOnInstance(instancesById, type, requirements);});
62         }
63     }
64
65     private void setCapabilitiesOnInstance(Map<String, ComponentInstance> instances, String capabilityType, List<CapabilityDefinition> definitions) {
66         Map<String, List<CapabilityDefinition>> capByInstance = definitions.stream().collect(Collectors.groupingBy(CapabilityDefinition::getOwnerId));
67         capByInstance.forEach((instanceId, capabilityDefinitions) -> { setCapabilitiesOnInstanceByType(instances.get(instanceId), capabilityType, capabilityDefinitions); });
68     }
69
70     private void setRequirementsOnInstance(Map<String, ComponentInstance> instances, String requirementType, List<RequirementDefinition> requirements) {
71         Map<String, List<RequirementDefinition>> reqByInstance = requirements.stream().collect(Collectors.groupingBy(RequirementDefinition::getOwnerId));
72         reqByInstance.forEach((instanceId, reqDefinitions) -> { setRequirementsOnInstanceByType(instances.get(instanceId), requirementType, reqDefinitions);});
73     }
74
75     private void setCapabilitiesOnInstanceByType(ComponentInstance instance, String capabilityType, List<CapabilityDefinition> capabilityDefinitions) {
76         instance.getCapabilities().putIfAbsent(capabilityType, new ArrayList<>());
77         instance.getCapabilities().get(capabilityType).addAll(capabilityDefinitions);
78     }
79
80     private void setRequirementsOnInstanceByType(ComponentInstance instance, String requirementType, List<RequirementDefinition> reqDefinitions) {
81         instance.getRequirements().putIfAbsent(requirementType, new ArrayList<>());
82         instance.getRequirements().get(requirementType).addAll(reqDefinitions);
83     }
84
85     private Map<String, ComponentInstance> groupInstancesById(T element) {
86         return element.getComponentInstances()
87                 .stream()
88                 .collect(Collectors.toMap(ComponentInstance::getUniqueId, Function.identity()));
89     }
90
91 }