1 package org.openecomp.sdc.be.components.merge.property;
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;
8 import java.util.ArrayList;
11 import java.util.stream.Collectors;
13 public class PropertyInstanceMergeDataBuilder {
15 private final static PropertyInstanceMergeDataBuilder INSTANCE = new PropertyInstanceMergeDataBuilder();
17 private PropertyInstanceMergeDataBuilder() {
20 public static PropertyInstanceMergeDataBuilder getInstance() {
24 public <T extends PropertyDataDefinition> List<MergePropertyData> buildDataForMerging(List<T> oldProps,
25 List<InputDefinition> oldInputs,
27 List<InputDefinition> newInputs) {
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);
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));
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)
54 if (oldProp.isGetInputProperty()) {
55 setGetInputData(oldProp, oldInputsByName, newInputsByName, mergePropertyData);
58 return mergePropertyData;
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);
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());
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());