7f9bf1c3709369565002d098013b9c8d34eb3c4c
[sdc.git] /
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 class PropertyInstanceMergeDataBuilder {
14
15     private PropertyInstanceMergeDataBuilder() {
16     }
17
18     static <T extends PropertyDataDefinition> List<MergePropertyData> buildDataForMerging(List<T> oldProps,
19                                                                                           List<InputDefinition> oldInputs,
20                                                                                           List<T> newProps,
21                                                                                           List<InputDefinition> newInputs) {
22
23         Map<String, T> oldPropsByName = MapUtil.toMap(oldProps, T::getName);
24         Map<String, InputDefinition> oldInputsByName = MapUtil.toMap(oldInputs, InputDefinition::getName);
25         Map<String, T> newPropsByName = MapUtil.toMap(newProps, T::getName);
26         Map<String, InputDefinition> newInputsByName = MapUtil.toMap(newInputs, InputDefinition::getName);
27         return buildMergeData(oldPropsByName, oldInputsByName, newPropsByName, newInputsByName);
28
29     }
30
31     private static <T extends PropertyDataDefinition> List<MergePropertyData> buildMergeData(Map<String, T> oldPropsByName, Map<String, InputDefinition> oldInputsByName, Map<String, T> newPropsByName, Map<String, InputDefinition> newInputsByName) {
32         List<MergePropertyData> mergeData = new ArrayList<>();
33         newPropsByName.forEach((name, prop) -> {
34             if (oldPropsByName.containsKey(name)) {
35                 mergeData.add(buildMergePropertyData(oldPropsByName.get(name), oldInputsByName, prop, newInputsByName));
36             }
37         });
38         return mergeData;
39     }
40
41     private static MergePropertyData buildMergePropertyData(PropertyDataDefinition oldProp,
42                                                     Map<String, InputDefinition> oldInputsByName,
43                                                     PropertyDataDefinition newProp,
44                                                     Map<String, InputDefinition> newInputsByName) {
45         MergePropertyData mergePropertyData = new MergePropertyData();
46         mergePropertyData.setOldProp(oldProp)
47                          .setNewProp(newProp);
48         if (oldProp.isGetInputProperty()) {
49             setGetInputData(oldProp, oldInputsByName, newInputsByName, mergePropertyData);
50
51         }
52         return mergePropertyData;
53     }
54
55     private static void setGetInputData(PropertyDataDefinition oldProp, Map<String, InputDefinition> oldInputsByName, Map<String, InputDefinition> newInputsByName, MergePropertyData mergePropertyData) {
56         List<String> oldDeclaredByUserInputNames = getOldDeclaredInputsByUser(oldProp.getGetInputValues(), oldInputsByName);
57         List<String> oldGetInputNamesWhichExistInNewVersion = getOldGetInputNamesWhichExistInNewVersion(oldProp.getGetInputValues(), newInputsByName);
58         mergePropertyData.addAddGetInputNamesToMerge(oldDeclaredByUserInputNames);
59         mergePropertyData.addAddGetInputNamesToMerge(oldGetInputNamesWhichExistInNewVersion);
60     }
61
62     private static List<String> getOldGetInputNamesWhichExistInNewVersion(List<GetInputValueDataDefinition> getInputValues, Map<String, InputDefinition> newInputsByName) {
63         return getInputValues.stream().map(GetInputValueDataDefinition::getInputName).filter(newInputsByName::containsKey).collect(Collectors.toList());
64     }
65
66     private static List<String> getOldDeclaredInputsByUser(List<GetInputValueDataDefinition> getInputValues, Map<String, InputDefinition> oldInputsByName) {
67         return getInputValues.stream().map(GetInputValueDataDefinition::getInputName)
68                                       .map(oldInputsByName::get)
69                                       .filter(oldInput -> oldInput.getInstanceUniqueId() != null)
70                                       .map(PropertyDataDefinition::getName)
71                                       .collect(Collectors.toList());
72     }
73 }