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