Sync Integ to Master
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / merge / input / ComponentInputsMergeBL.java
1 package org.openecomp.sdc.be.components.merge.input;
2
3 import fj.data.Either;
4 import org.openecomp.sdc.be.components.merge.instance.ComponentsMergeCommand;
5 import org.openecomp.sdc.be.dao.api.ActionStatus;
6 import org.openecomp.sdc.be.dao.utils.MapUtil;
7 import org.openecomp.sdc.be.impl.ComponentsUtils;
8 import org.openecomp.sdc.be.model.Component;
9 import org.openecomp.sdc.be.model.InputDefinition;
10 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
11 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
12
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.Map;
17
18 @org.springframework.stereotype.Component
19 public class ComponentInputsMergeBL implements ComponentsMergeCommand {
20
21     @javax.annotation.Resource
22     private InputsValuesMergingBusinessLogic inputsValuesMergingBusinessLogic;
23
24     @javax.annotation.Resource
25     private ToscaOperationFacade toscaOperationFacade;
26
27     @javax.annotation.Resource
28     private ComponentsUtils componentsUtils;
29
30     @Override
31     public ActionStatus mergeComponents(Component prevComponent, Component currentComponent) {
32         List<InputDefinition> inputsToMerge = currentComponent.getInputs() != null ? currentComponent.getInputs() : new ArrayList<>();
33         return this.mergeAndRedeclareComponentInputs(prevComponent, currentComponent, inputsToMerge);
34     }
35
36     @Override
37     public String description() {
38         return "merge component inputs";
39     }
40
41     public ActionStatus mergeAndRedeclareComponentInputs(Component prevComponent, Component newComponent, List<InputDefinition> inputsToMerge) {
42         mergeInputs(prevComponent, inputsToMerge);
43         List<InputDefinition> previouslyDeclaredInputs = inputsValuesMergingBusinessLogic.getPreviouslyDeclaredInputsToMerge(prevComponent, newComponent);
44         inputsToMerge.addAll(previouslyDeclaredInputs);
45         return updateInputs(newComponent.getUniqueId(), inputsToMerge);
46     }
47
48     public ActionStatus mergeComponentInputs(Component prevComponent, Component newComponent, List<InputDefinition> inputsToMerge) {
49         mergeInputs(prevComponent, inputsToMerge);
50         return updateInputs(newComponent.getUniqueId(), inputsToMerge);
51     }
52
53     public ActionStatus redeclareComponentInputsForInstance(List<InputDefinition> oldInputs, Component newComponent, String instanceId) {
54         List<InputDefinition> previouslyDeclaredInputs = inputsValuesMergingBusinessLogic.getPreviouslyDeclaredInputsToMerge(oldInputs, newComponent, instanceId);
55         return updateInputs(newComponent.getUniqueId(), previouslyDeclaredInputs);
56     }
57
58     private void mergeInputs(Component prevComponent, List<InputDefinition> inputsToMerge) {
59         Map<String, InputDefinition> oldInputsByName = prevComponent.getInputs() == null ? Collections.emptyMap() : MapUtil.toMap(prevComponent.getInputs(), InputDefinition::getName);
60         Map<String, InputDefinition> inputsToMergeByName = MapUtil.toMap(inputsToMerge, InputDefinition::getName);
61         inputsValuesMergingBusinessLogic.mergeComponentInputs(oldInputsByName, inputsToMergeByName);
62     }
63
64     private ActionStatus updateInputs(String containerId, List<InputDefinition> inputsToUpdate) {
65         Either<List<InputDefinition>, StorageOperationStatus> updateInputsEither = toscaOperationFacade.updateInputsToComponent(inputsToUpdate, containerId);
66         if (updateInputsEither.isRight()) {
67             return componentsUtils.convertFromStorageResponse(updateInputsEither.right().value());
68         }
69         return ActionStatus.OK;
70     }
71
72 }