Sync Integ to Master
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / merge / property / PropertyInstanceMergeDataBuilder.java
1 package org.openecomp.sdc.be.components.merge.property;
2
3 import org.openecomp.sdc.be.dao.utils.MapUtil;
4 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
5 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
6 import org.openecomp.sdc.be.model.InputDefinition;
7
8 import java.util.ArrayList;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.stream.Collectors;
12
13 public class PropertyInstanceMergeDataBuilder {
14
15     private final static PropertyInstanceMergeDataBuilder INSTANCE = new PropertyInstanceMergeDataBuilder();
16
17     private PropertyInstanceMergeDataBuilder() {
18     }
19
20     public static PropertyInstanceMergeDataBuilder getInstance() {
21         return INSTANCE;
22     }
23
24     public <T extends PropertyDataDefinition> List<MergePropertyData> buildDataForMerging(List<T> oldProps,
25                                                                                           List<InputDefinition> oldInputs,
26                                                                                           List<T> newProps,
27                                                                                           List<InputDefinition> newInputs) {
28
29         Map<String, T> oldPropsByName = MapUtil.toMap(oldProps, T::getName);
30         Map<String, InputDefinition> oldInputsByName = MapUtil.toMap(oldInputs, InputDefinition::getName);
31         Map<String, T> newPropsByName = MapUtil.toMap(newProps, T::getName);
32         Map<String, InputDefinition> newInputsByName = MapUtil.toMap(newInputs, InputDefinition::getName);
33         return buildMergeData(oldPropsByName, oldInputsByName, newPropsByName, newInputsByName);
34
35     }
36
37     private <T extends PropertyDataDefinition> List<MergePropertyData> buildMergeData(Map<String, T> oldPropsByName, Map<String, InputDefinition> oldInputsByName, Map<String, T> newPropsByName, Map<String, InputDefinition> newInputsByName) {
38         List<MergePropertyData> mergeData = new ArrayList<>();
39         newPropsByName.forEach((name, prop) -> {
40             if (oldPropsByName.containsKey(name)) {
41                 mergeData.add(buildMergePropertyData(oldPropsByName.get(name), oldInputsByName, prop, newInputsByName));
42             }
43         });
44         return mergeData;
45     }
46
47     private MergePropertyData buildMergePropertyData(PropertyDataDefinition oldProp,
48                                                     Map<String, InputDefinition> oldInputsByName,
49                                                     PropertyDataDefinition newProp,
50                                                     Map<String, InputDefinition> newInputsByName) {
51         MergePropertyData mergePropertyData = new MergePropertyData();
52         mergePropertyData.setOldProp(oldProp)
53                          .setNewProp(newProp);
54         if (oldProp.isGetInputProperty()) {
55             setGetInputData(oldProp, oldInputsByName, newInputsByName, mergePropertyData);
56
57         }
58         return mergePropertyData;
59     }
60
61     private void setGetInputData(PropertyDataDefinition oldProp, Map<String, InputDefinition> oldInputsByName, Map<String, InputDefinition> newInputsByName, MergePropertyData mergePropertyData) {
62         List<String> oldDeclaredByUserInputNames = getOldDeclaredInputsByUser(oldProp.getGetInputValues(), oldInputsByName);
63         List<String> oldGetInputNamesWhichExistInNewVersion = getOldGetInputNamesWhichExistInNewVersion(oldProp.getGetInputValues(), newInputsByName);
64         mergePropertyData.addAddGetInputNamesToMerge(oldDeclaredByUserInputNames);
65         mergePropertyData.addAddGetInputNamesToMerge(oldGetInputNamesWhichExistInNewVersion);
66     }
67
68     private List<String> getOldGetInputNamesWhichExistInNewVersion(List<GetInputValueDataDefinition> getInputValues, Map<String, InputDefinition> newInputsByName) {
69         return getInputValues.stream().map(GetInputValueDataDefinition::getInputName).filter(newInputsByName::containsKey).collect(Collectors.toList());
70     }
71
72     private List<String> getOldDeclaredInputsByUser(List<GetInputValueDataDefinition> getInputValues, Map<String, InputDefinition> oldInputsByName) {
73         return getInputValues.stream().map(GetInputValueDataDefinition::getInputName)
74                                       .map(oldInputsByName::get)
75                                       .filter(oldInput -> oldInput.getInstanceUniqueId() != null)
76                                       .map(PropertyDataDefinition::getName)
77                                       .collect(Collectors.toList());
78     }
79 }