re base code
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / merge / input / InputsMergeCommand.java
1 package org.openecomp.sdc.be.components.merge.input;
2
3 import org.openecomp.sdc.be.dao.api.ActionStatus;
4 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
5 import org.openecomp.sdc.be.impl.ComponentsUtils;
6 import org.openecomp.sdc.be.model.Component;
7 import org.openecomp.sdc.be.model.InputDefinition;
8 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
9 import org.openecomp.sdc.common.log.wrappers.Logger;
10
11 import java.util.List;
12 import java.util.Map;
13
14 import static java.util.Collections.emptyList;
15 import static org.apache.commons.collections.CollectionUtils.isEmpty;
16
17 public abstract class InputsMergeCommand {
18
19     private static final Logger log = Logger.getLogger(InputsMergeCommand.class);
20
21     private InputsValuesMergingBusinessLogic inputsValuesMergingBusinessLogic;
22     private DeclaredInputsResolver declaredInputsResolver;
23     private ToscaOperationFacade toscaOperationFacade;
24     private ComponentsUtils componentsUtils;
25
26     public InputsMergeCommand(InputsValuesMergingBusinessLogic inputsValuesMergingBusinessLogic, DeclaredInputsResolver declaredInputsResolver, ToscaOperationFacade toscaOperationFacade, ComponentsUtils componentsUtils) {
27         this.inputsValuesMergingBusinessLogic = inputsValuesMergingBusinessLogic;
28         this.declaredInputsResolver = declaredInputsResolver;
29         this.toscaOperationFacade = toscaOperationFacade;
30         this.componentsUtils = componentsUtils;
31     }
32
33     abstract List<InputDefinition> getInputsToMerge(Component component);
34
35     abstract Map<String, List<PropertyDataDefinition>> getProperties(Component component);
36
37     ActionStatus redeclareAndMergeInputsValues(Component prevComponent, Component currComponent) {
38         if (prevComponent == null || isEmpty(prevComponent.getInputs())) {
39             return ActionStatus.OK;
40         }
41         List<InputDefinition> mergedInputs = mergeInputsValues(prevComponent, currComponent);
42         List<InputDefinition> previouslyDeclaredInputsToMerge = getPreviouslyDeclaredInputsToMerge(prevComponent, currComponent);
43         mergedInputs.addAll(previouslyDeclaredInputsToMerge);
44         return updateInputs(currComponent.getUniqueId(), mergedInputs);
45     }
46
47     private List<InputDefinition> mergeInputsValues(Component prevComponent, Component currComponent) {
48         log.debug("#mergeInputsValues - merge inputs values from previous component {} to current component {}", prevComponent.getUniqueId(), currComponent.getUniqueId());
49         List<InputDefinition> inputsToMerge = getInputsToMerge(currComponent);
50         List<InputDefinition> prevInputs = prevComponent.safeGetInputs();
51         inputsValuesMergingBusinessLogic.mergeComponentInputs(prevInputs, inputsToMerge);
52         return inputsToMerge;
53     }
54
55     private List<InputDefinition> getPreviouslyDeclaredInputsToMerge(Component prevComponent, Component currComponent) {
56         log.debug("#getPreviouslyDeclaredInputsToMerge - getting inputs that were previously declared from previous component {} and setting on current component {}", prevComponent.getUniqueId(), currComponent.getUniqueId());
57         if (isEmpty(prevComponent.getInputs())) {
58             return emptyList();
59         }
60         Map<String, List<PropertyDataDefinition>> props = getProperties(currComponent);
61         return declaredInputsResolver.getPreviouslyDeclaredInputsToMerge(prevComponent, currComponent, props);
62     }
63
64     private ActionStatus updateInputs(String containerId, List<InputDefinition> inputsToUpdate) {
65         log.debug("#updateInputs - updating inputs for container {}", containerId);
66         return toscaOperationFacade.updateInputsToComponent(inputsToUpdate, containerId)
67                 .either(updatedInputs -> ActionStatus.OK,
68                         componentsUtils::convertFromStorageResponse);
69     }
70
71 }