7f11330bdfd0fb688b7a452b2f921452475ddfac
[sdc.git] /
1 package org.openecomp.sdc.be.model.tosca.converters;
2
3 import com.google.gson.Gson;
4 import com.google.gson.JsonElement;
5 import com.google.gson.JsonObject;
6 import com.google.gson.JsonParser;
7 import com.google.gson.stream.JsonReader;
8 import java.io.StringReader;
9 import java.util.HashMap;
10 import java.util.List;
11 import java.util.Map;
12 import org.openecomp.sdc.be.model.DataTypeDefinition;
13 import org.openecomp.sdc.be.model.PropertyDefinition;
14 import org.openecomp.sdc.common.util.JsonUtils;
15
16 public class DataTypePropertyConverter {
17
18     private static final DataTypePropertyConverter INSTANCE = new DataTypePropertyConverter();
19     private static final JsonParser jsonParser = new JsonParser();
20     private static final Gson gson = new Gson();
21
22     private DataTypePropertyConverter() {
23     }
24
25     public static DataTypePropertyConverter getInstance() {
26         return INSTANCE;
27     }
28
29     /**
30      *
31      * @param propertyDataType the data type
32      * @param dataTypes all data types in the system mapped by their name
33      * @return a json representation of all the given data type properties default values and recursively their data type properties
34      */
35     public String getDataTypePropertiesDefaultValuesRec(String propertyDataType, Map<String, DataTypeDefinition> dataTypes) {
36         JsonObject defaultValues = getDataTypePropsDefaultValuesRec(propertyDataType, dataTypes);
37         return !JsonUtils.isJsonNullOrEmpty(defaultValues) ? gson.toJson(defaultValues) : null;
38     }
39
40     /**
41      * Takes a json representation of a tosca property value and merges all the default values of the property data type
42      * @param value the json representation of a tosca property value
43      * @param propertyDataType data type from which to merge default values
44      * @param dataTypes all data types in the system mapped by their name
45      * for example: for value {a: {b: c}} we could have a default value {a: {d: e}} (property a has two sub properties but only b was overridden)
46      * so the complete value is {a: {b: c, d: e}}
47      */
48     public void mergeDataTypeDefaultValuesWithPropertyValue(JsonObject value, String propertyDataType, Map<String, DataTypeDefinition> dataTypes) {
49         JsonObject dataTypeDefaultValues = getDataTypePropsDefaultValuesRec(propertyDataType, dataTypes);
50         mergeDefaultValuesRec(dataTypeDefaultValues, value);
51     }
52
53     private void mergeDefaultValuesRec(JsonObject defaultValue, JsonObject value) {
54         if (ToscaConverterUtils.isGetInputValue(value) || ToscaConverterUtils.isGetPolicyValue(value)) {
55             return;
56         }
57         for (Map.Entry<String, JsonElement> defVal : defaultValue.entrySet()) {
58             mergeDefaultValue(value, defVal.getKey(), defVal.getValue());
59         }
60     }
61
62     private void mergeDefaultValue(JsonObject value, String propName, JsonElement defValue) {
63         if (defValueWasNotOverridden(value, propName)) {
64             value.add(propName, defValue);
65         } else if (notPrimitivePropValue(value, defValue, propName)) {
66             JsonElement propValue = value.get(propName);
67             mergeDefaultValuesRec(defValue.getAsJsonObject(), propValue.getAsJsonObject());
68         }
69     }
70
71     private boolean notPrimitivePropValue(JsonObject value, JsonElement defValue, String propName) {
72         return value.get(propName).isJsonObject() && defValue.isJsonObject();
73     }
74
75     private boolean defValueWasNotOverridden(JsonObject value, String propName) {
76         return !value.has(propName);
77     }
78
79     private JsonObject getDataTypePropsDefaultValuesRec(String propertyDataType, Map<String, DataTypeDefinition> dataTypes) {
80         Map<String, PropertyDefinition> allParentsProps = getAllDataTypeProperties(dataTypes.get(propertyDataType));
81         JsonObject dataTypeDefaultsJson = new JsonObject();
82         for (Map.Entry<String, PropertyDefinition> propertyEntry : allParentsProps.entrySet()) {
83             PropertyDefinition propertyDefinition = propertyEntry.getValue();
84             addDefaultValueToJson(dataTypes, dataTypeDefaultsJson, propertyDefinition);
85         }
86         return dataTypeDefaultsJson;
87     }
88
89     private void addDefaultValueToJson(Map<String, DataTypeDefinition> dataTypes, JsonObject dataTypePropsDefaults, PropertyDefinition propertyDefinition) {
90         String propName = propertyDefinition.getName();
91         JsonElement defVal = getDefaultValue(dataTypes, dataTypePropsDefaults, propertyDefinition);
92         if (!JsonUtils.isEmptyJson(defVal)) {
93             dataTypePropsDefaults.add(propName, defVal);
94         }
95     }
96
97     private JsonElement getDefaultValue(Map<String, DataTypeDefinition> dataTypes, JsonObject dataTypePropsDefaults, PropertyDefinition propertyDefinition) {
98         JsonElement defVal = new JsonObject();
99         String propName = propertyDefinition.getName();
100         String propDefaultVal = propertyDefinition.getDefaultValue();
101         if(!JsonUtils.containsEntry(dataTypePropsDefaults, propName) && propDefaultVal != null){
102             defVal = convertToJson(propDefaultVal);
103         } else if (!JsonUtils.containsEntry(dataTypePropsDefaults, propName)) {
104             defVal = getDataTypePropsDefaultValuesRec(propertyDefinition.getType(), dataTypes);
105         }
106         return defVal;
107     }
108
109     private JsonElement convertToJson(String propDefaultVal) {
110         JsonReader jsonReader = new JsonReader(new StringReader(propDefaultVal));
111         jsonReader.setLenient(true);
112         return jsonParser.parse(jsonReader);
113     }
114
115     private Map<String, PropertyDefinition> getAllDataTypeProperties(DataTypeDefinition dataTypeDefinition) {
116         Map<String, PropertyDefinition> allParentsProps = new HashMap<>();
117         while (dataTypeDefinition != null) {
118
119             List<PropertyDefinition> currentParentsProps = dataTypeDefinition.getProperties();
120             if (currentParentsProps != null) {
121                 currentParentsProps.stream().forEach(p -> allParentsProps.put(p.getName(), p));
122             }
123
124             dataTypeDefinition = dataTypeDefinition.getDerivedFrom();
125         }
126         return allParentsProps;
127     }
128
129 }