summaryrefslogtreecommitdiffstats
path: root/asdctool/src/main/java/org/openecomp/sdc/asdctool/impl/migration/v1707/jsonmodel/relations/RequirementsCapabilitiesMigrationService.java
blob: f74e40a8fc41e0ccaf38bebaa1bad2432309be08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel.relations;

import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
import org.openecomp.sdc.be.model.CapabilityDefinition;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.RequirementDefinition;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class RequirementsCapabilitiesMigrationService<T extends Component> {

    @Resource(name = "fulfilled-capabilities-mig-service")
    FulfilledCapabilitiesMigrationService fulfilledCapabilityUpdate;

    @Resource(name = "fulfilled-requirements-mig-service")
    FulfilledRequirementsMigrationService fulfilledRequirementUpdate;

    public boolean associateFulfilledCapabilities(T component, NodeTypeEnum nodeType) {
        return fulfilledCapabilityUpdate.associateToscaDefinitions(component, nodeType);
    }

    public boolean associateFulfilledRequirements(T component, NodeTypeEnum nodeType) {
        return fulfilledRequirementUpdate.associateToscaDefinitions(component, nodeType);
    }

    public void overrideInstanceCapabilitiesRequirements(T element) {
        if (element.getComponentInstances() != null) {
            clearInstancesCapabilitiesRequirements(element);
            setInstancesRequirementsFromComponent(element);
            setInstancesCapabilitiesFromComponent(element);
        }
    }

    private void clearInstancesCapabilitiesRequirements(T element) {
        element.getComponentInstances().forEach(componentInstance -> {
            if (componentInstance.getCapabilities() != null) {
                componentInstance.getCapabilities().clear();
            }
            if (componentInstance.getRequirements() != null) {
                componentInstance.getRequirements().clear();
            }
        });
    }

    private void setInstancesCapabilitiesFromComponent(T element) {
        if (element.getCapabilities() != null) {
            Map<String, ComponentInstance> instancesById = groupInstancesById(element);
            element.getCapabilities().forEach((type, definitions) -> { setCapabilitiesOnInstance(instancesById, type, definitions);});
        }
    }

    private void setInstancesRequirementsFromComponent(T element) {
        if (element.getRequirements() != null) {
            Map<String, ComponentInstance> instancesById = groupInstancesById(element);
            element.getRequirements().forEach((type, requirements) -> { setRequirementsOnInstance(instancesById, type, requirements);});
        }
    }

    private void setCapabilitiesOnInstance(Map<String, ComponentInstance> instances, String capabilityType, List<CapabilityDefinition> definitions) {
        Map<String, List<CapabilityDefinition>> capByInstance = definitions.stream().collect(Collectors.groupingBy(CapabilityDefinition::getOwnerId));
        capByInstance.forEach((instanceId, capabilityDefinitions) -> { setCapabilitiesOnInstanceByType(instances.get(instanceId), capabilityType, capabilityDefinitions); });
    }

    private void setRequirementsOnInstance(Map<String, ComponentInstance> instances, String requirementType, List<RequirementDefinition> requirements) {
        Map<String, List<RequirementDefinition>> reqByInstance = requirements.stream().collect(Collectors.groupingBy(RequirementDefinition::getOwnerId));
        reqByInstance.forEach((instanceId, reqDefinitions) -> { setRequirementsOnInstanceByType(instances.get(instanceId), requirementType, reqDefinitions);});
    }

    private void setCapabilitiesOnInstanceByType(ComponentInstance instance, String capabilityType, List<CapabilityDefinition> capabilityDefinitions) {
        instance.getCapabilities().putIfAbsent(capabilityType, new ArrayList<>());
        instance.getCapabilities().get(capabilityType).addAll(capabilityDefinitions);
    }

    private void setRequirementsOnInstanceByType(ComponentInstance instance, String requirementType, List<RequirementDefinition> reqDefinitions) {
        instance.getRequirements().putIfAbsent(requirementType, new ArrayList<>());
        instance.getRequirements().get(requirementType).addAll(reqDefinitions);
    }

    private Map<String, ComponentInstance> groupInstancesById(T element) {
        return element.getComponentInstances()
                .stream()
                .collect(Collectors.toMap(ComponentInstance::getUniqueId, Function.identity()));
    }

}