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