2 * ============LICENSE_START=======================================================
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
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.asdctool.impl.migration.v1707.jsonmodel.relations;
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;
29 import javax.annotation.Resource;
30 import java.util.ArrayList;
31 import java.util.List;
33 import java.util.function.Function;
34 import java.util.stream.Collectors;
36 public class RequirementsCapabilitiesMigrationService<T extends Component> {
38 @Resource(name = "fulfilled-capabilities-mig-service")
39 FulfilledCapabilitiesMigrationService fulfilledCapabilityUpdate;
41 @Resource(name = "fulfilled-requirements-mig-service")
42 FulfilledRequirementsMigrationService fulfilledRequirementUpdate;
44 public boolean associateFulfilledCapabilities(T component, NodeTypeEnum nodeType) {
45 return fulfilledCapabilityUpdate.associateToscaDefinitions(component, nodeType);
48 public boolean associateFulfilledRequirements(T component, NodeTypeEnum nodeType) {
49 return fulfilledRequirementUpdate.associateToscaDefinitions(component, nodeType);
52 public void overrideInstanceCapabilitiesRequirements(T element) {
53 if (element.getComponentInstances() != null) {
54 clearInstancesCapabilitiesRequirements(element);
55 setInstancesRequirementsFromComponent(element);
56 setInstancesCapabilitiesFromComponent(element);
60 private void clearInstancesCapabilitiesRequirements(T element) {
61 element.getComponentInstances().forEach(componentInstance -> {
62 if (componentInstance.getCapabilities() != null) {
63 componentInstance.getCapabilities().clear();
65 if (componentInstance.getRequirements() != null) {
66 componentInstance.getRequirements().clear();
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);});
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);});
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); });
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);});
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);
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);
105 private Map<String, ComponentInstance> groupInstancesById(T element) {
106 return element.getComponentInstances()
108 .collect(Collectors.toMap(ComponentInstance::getUniqueId, Function.identity()));