re base code
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / tosca / converters / ToscaMapValueConverter.java
index 5b565bf..04636d8 100644 (file)
 
 package org.openecomp.sdc.be.model.tosca.converters;
 
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
+import com.google.gson.*;
+import com.google.gson.stream.JsonReader;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParseException;
-import com.google.gson.JsonParser;
-import com.google.gson.JsonSyntaxException;
-import com.google.gson.stream.JsonReader;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+
+import java.io.StringReader;
+import java.util.*;
+import java.util.Map.Entry;
 
 public class ToscaMapValueConverter extends ToscaValueBaseConverter implements ToscaValueConverter {
-       private static ToscaMapValueConverter mapConverter = new ToscaMapValueConverter();
-
-       private JsonParser jsonParser = new JsonParser();
-       private static Logger log = LoggerFactory.getLogger(ToscaMapValueConverter.class.getName());
-
-       public static ToscaMapValueConverter getInstance() {
-               return mapConverter;
-       }
-
-       private ToscaMapValueConverter() {
-
-       }
-
-       @Override
-       public Object convertToToscaValue(String value, String innerType, Map<String, DataTypeDefinition> dataTypes) {
-               if (value == null) {
-                       return value;
-               }
-               try {
-                       ToscaPropertyType innerToscaType = ToscaPropertyType.isValidType(innerType);
-                       ToscaValueConverter innerConverter = null;
-                       boolean isScalar = true;
-                       List<PropertyDefinition> allPropertiesRecursive = new ArrayList<>();
-                       if (innerToscaType != null) {
-                               innerConverter = innerToscaType.getValueConverter();
-                       } else {
-
-                               DataTypeDefinition dataTypeDefinition = dataTypes.get(innerType);
-                               if (dataTypeDefinition != null) {
-                                       ToscaPropertyType toscaPropertyType = null;
-                                       if ((toscaPropertyType = isScalarType(dataTypeDefinition)) != null) {
-                                               innerConverter = toscaPropertyType.getValueConverter();
-                                       } else {
-                                               isScalar = false;
-                                               allPropertiesRecursive.addAll(dataTypeDefinition.getProperties());
-                                               DataTypeDefinition derivedFrom = dataTypeDefinition.getDerivedFrom();
-                                               while ( !derivedFrom.getName().equals("tosca.datatypes.Root") ){
-                                                       allPropertiesRecursive.addAll(derivedFrom.getProperties());
-                                                       derivedFrom = derivedFrom.getDerivedFrom();
-                                               }
-                                       }
-                               } else {
-                                       log.debug("inner Tosca Type is null");
-                                       return value;
-                               }
-
-                       }
-                       JsonElement jsonElement = null;
-                       try {
-                               StringReader reader = new StringReader(value);
-                               JsonReader jsonReader = new JsonReader(reader);
-                               jsonReader.setLenient(true);
-
-                               jsonElement = jsonParser.parse(jsonReader);
-
-                       } catch (JsonSyntaxException e) {
-                               log.debug("convertToToscaValue failed to parse json value :", e);
-                               return null;
-                       }
-                       if (jsonElement == null || true == jsonElement.isJsonNull()) {
-                               log.debug("convertToToscaValue json element is null");
-                               return null;
-                       }
-                       JsonObject asJsonObject = jsonElement.getAsJsonObject();
-                       Set<Entry<String, JsonElement>> entrySet = asJsonObject.entrySet();
-
-                       Map<String, Object> toscaMap = new HashMap<>();
-                       final boolean isScalarF = isScalar;
-                       final ToscaValueConverter innerConverterFinal = innerConverter;
-                       entrySet.forEach(e -> {
-                               convertEntry(innerType, dataTypes, allPropertiesRecursive, toscaMap, isScalarF, innerConverterFinal, e);
-                       });
-                       return toscaMap;
-               } catch (JsonParseException e) {
-                       log.debug("Failed to parse json : {}", value, e);
-                       BeEcompErrorManager.getInstance().logBeInvalidJsonInput("List Converter");
-                       return null;
-               }
-       }
-
-       private void convertEntry(String innerType, Map<String, DataTypeDefinition> dataTypes, List<PropertyDefinition> allPropertiesRecursive, Map<String, Object> toscaMap, final boolean isScalarF, final ToscaValueConverter innerConverterFinal,
-                       Entry<String, JsonElement> e) {
-               log.debug("try convert element {}", e.getValue());
-               boolean scalar = false;
-               String propType = null; 
-               ToscaValueConverter innerConverterProp = innerConverterFinal;
-               if ( isScalarF ){
-                       scalar = isScalarF;
-                       propType = innerType;
-               }else{
-                       for ( PropertyDefinition pd : allPropertiesRecursive ){
-                               if ( pd.getName().equals(e.getKey()) ){
-                                       propType = pd.getType();
-                                       DataTypeDefinition pdDataType = dataTypes.get(propType);
-                                       ToscaPropertyType toscaPropType = isScalarType(pdDataType);
-                                       if ( toscaPropType == null ){
-                                               scalar = false;
-                                       }else{
-                                               scalar = true;
-                                               propType = toscaPropType.getType();
-                                               innerConverterProp = toscaPropType.getValueConverter();
-                                       }
-                                       break;
-                               }
-                       }
-               }
-               Object convertedValue = convertDataTypeToToscaObject(propType, dataTypes, innerConverterProp, scalar, e.getValue());
-               toscaMap.put(e.getKey(), convertedValue);
-       }
-
-       public Object convertDataTypeToToscaObject(String innerType, Map<String, DataTypeDefinition> dataTypes, ToscaValueConverter innerConverter, final boolean isScalarF, JsonElement entryValue) {
-               Object convertedValue = null;
-               if (isScalarF && entryValue.isJsonPrimitive()) {
-                       log.debug("try convert scalar value {}", entryValue.getAsString());
-                       if (entryValue.getAsString() == null) {
-                               convertedValue = null;
-                       } else {
-                               convertedValue = innerConverter.convertToToscaValue(entryValue.getAsString(), innerType, dataTypes);
-                       }
-               } else {
-                       if ( entryValue.isJsonPrimitive() ){
-                               return handleComplexJsonValue(entryValue);
-                       }
-                       
-                       // ticket 228696523 created   / DE272734 / Bug 154492 Fix
-                       if(entryValue instanceof JsonArray) {
-                               ArrayList<Object> toscaObjectPresentationArray = new ArrayList<>();
-                               JsonArray jsonArray = entryValue.getAsJsonArray();
-                               
-                               for (JsonElement jsonElement : jsonArray) {
-                                       Object convertedDataTypeToToscaMap = convertDataTypeToToscaMap(innerType, dataTypes, isScalarF, jsonElement);
-                                       toscaObjectPresentationArray.add(convertedDataTypeToToscaMap);
-                               }
-                               convertedValue = toscaObjectPresentationArray;
-                       } else {
-                               convertedValue = convertDataTypeToToscaMap(innerType, dataTypes, isScalarF, entryValue);                                
-                       }
-               }
-               return convertedValue;
-       }
-
-       private Object convertDataTypeToToscaMap(String innerType, Map<String, DataTypeDefinition> dataTypes,
-                       final boolean isScalarF, JsonElement entryValue) {
-               Object convertedValue;
-               if (entryValue.isJsonPrimitive()) {
-                       return json2JavaPrimitive(entryValue.getAsJsonPrimitive());
-               } 
-               JsonObject asJsonObjectIn = entryValue.getAsJsonObject();
-
-               DataTypePropertyConverter.getInstance().mergeDataTypeDefaultValuesWithPropertyValue(asJsonObjectIn, innerType, dataTypes);
-               Map<String, Object> toscaObjectPresentation = new HashMap<>();
-               Set<Entry<String, JsonElement>> entrySetIn = asJsonObjectIn.entrySet();
-               
-               for (Entry<String, JsonElement> entry : entrySetIn) {
-                       String propName = entry.getKey();
-
-                       JsonElement elementValue = entry.getValue();
-                       Object convValue;
-                       if (isScalarF == false) {
-                               DataTypeDefinition dataTypeDefinition = dataTypes.get(innerType);
-                               Map<String, PropertyDefinition> allProperties = getAllProperties(dataTypeDefinition);
-                               PropertyDefinition propertyDefinition = allProperties.get(propName);
-                               if (propertyDefinition == null) {
-                                       log.trace("The property {} was not found under data type . Parse as map", propName);
-                                       if (elementValue.isJsonPrimitive()) {
-                                               convValue = elementValue.getAsString();
-                                       } else {
-                                               convValue = handleComplexJsonValue(elementValue);
-                                       }
-                               } else {
-                                       String type = propertyDefinition.getType();
-                                       ToscaPropertyType propertyType = ToscaPropertyType.isValidType(type);
-                                       if (propertyType != null) {
-                                               if (elementValue.isJsonPrimitive()) {
-                                                       ToscaValueConverter valueConverter = propertyType.getValueConverter();
-                                                       convValue = valueConverter.convertToToscaValue(elementValue.getAsString(), type, dataTypes);
-                                               } else {
-                                                       if (ToscaPropertyType.MAP.equals(type) || ToscaPropertyType.LIST.equals(propertyType)) {
-                                                               ToscaValueConverter valueConverter = propertyType.getValueConverter();
-                                                               String json = gson.toJson(elementValue);
-                                                               String innerTypeRecursive = propertyDefinition.getSchema().getProperty().getType();
-                                                               convValue = valueConverter.convertToToscaValue(json, innerTypeRecursive, dataTypes);
-                                                       } else {
-                                                               convValue = handleComplexJsonValue(elementValue);
-                                                       }
-                                               }
-                                       } else {
-                                               convValue = convertToToscaValue(elementValue.toString(), type, dataTypes);
-                                       }
-                               }
-                       } else {
-                               if (elementValue.isJsonPrimitive()) {
-                                       convValue = json2JavaPrimitive(elementValue.getAsJsonPrimitive());
-                               } else {
-                                       convValue = handleComplexJsonValue(elementValue);
-                               }
-                       }
-                       if(!isEmptyObjectValue(convValue)){
-                               toscaObjectPresentation.put(propName, convValue);
-                       }
-               }
-               convertedValue = toscaObjectPresentation;
-               return convertedValue;
-       }
+    private static ToscaMapValueConverter mapConverter = new ToscaMapValueConverter();
+
+    private JsonParser jsonParser = new JsonParser();
+    private static final Logger log = Logger.getLogger(ToscaMapValueConverter.class.getName());
+
+    public static ToscaMapValueConverter getInstance() {
+        return mapConverter;
+    }
+
+    private ToscaMapValueConverter() {
+
+    }
+
+    @Override
+    public Object convertToToscaValue(String value, String innerType, Map<String, DataTypeDefinition> dataTypes) {
+        if (value == null) {
+            return value;
+        }
+        try {
+            ToscaPropertyType innerToscaType = ToscaPropertyType.isValidType(innerType);
+            ToscaValueConverter innerConverter = null;
+            boolean isScalar = true;
+            List<PropertyDefinition> allPropertiesRecursive = new ArrayList<>();
+            if (innerToscaType != null) {
+                innerConverter = innerToscaType.getValueConverter();
+            } else {
+
+                DataTypeDefinition dataTypeDefinition = dataTypes.get(innerType);
+                if (dataTypeDefinition != null) {
+                    ToscaPropertyType toscaPropertyType = null;
+                    if ((toscaPropertyType = isScalarType(dataTypeDefinition)) != null) {
+                        innerConverter = toscaPropertyType.getValueConverter();
+                    } else {
+                        isScalar = false;
+                        allPropertiesRecursive.addAll(dataTypeDefinition.getProperties());
+                        DataTypeDefinition derivedFrom = dataTypeDefinition.getDerivedFrom();
+                        while ( !derivedFrom.getName().equals("tosca.datatypes.Root") ){
+                            allPropertiesRecursive.addAll(derivedFrom.getProperties());
+                            derivedFrom = derivedFrom.getDerivedFrom();
+                        }
+                    }
+                } else {
+                    log.debug("inner Tosca Type is null");
+                    return value;
+                }
+
+            }
+            JsonElement jsonElement = null;
+            try {
+                StringReader reader = new StringReader(value);
+                JsonReader jsonReader = new JsonReader(reader);
+                jsonReader.setLenient(true);
+
+                jsonElement = jsonParser.parse(jsonReader);
+
+            } catch (JsonSyntaxException e) {
+                log.debug("convertToToscaValue failed to parse json value :", e);
+                return null;
+            }
+            if (jsonElement == null || jsonElement.isJsonNull()) {
+                log.debug("convertToToscaValue json element is null");
+                return null;
+            }
+            JsonObject asJsonObject = jsonElement.getAsJsonObject();
+            Set<Entry<String, JsonElement>> entrySet = asJsonObject.entrySet();
+
+            Map<String, Object> toscaMap = new HashMap<>();
+            final boolean isScalarF = isScalar;
+            final ToscaValueConverter innerConverterFinal = innerConverter;
+            entrySet.forEach(e -> {
+                convertEntry(innerType, dataTypes, allPropertiesRecursive, toscaMap, isScalarF, innerConverterFinal, e);
+            });
+            return toscaMap;
+        } catch (JsonParseException e) {
+            log.debug("Failed to parse json : {}", value, e);
+            BeEcompErrorManager.getInstance().logBeInvalidJsonInput("List Converter");
+            return null;
+        }
+    }
+
+    private void convertEntry(String innerType, Map<String, DataTypeDefinition> dataTypes, List<PropertyDefinition> allPropertiesRecursive, Map<String, Object> toscaMap, final boolean isScalarF, final ToscaValueConverter innerConverterFinal,
+            Entry<String, JsonElement> e) {
+        log.debug("try convert element {}", e.getValue());
+        boolean scalar = false;
+        String propType = null;
+        ToscaValueConverter innerConverterProp = innerConverterFinal;
+        if ( isScalarF ){
+            scalar = isScalarF;
+            propType = innerType;
+        }else{
+            for ( PropertyDefinition pd : allPropertiesRecursive ){
+                if ( pd.getName().equals(e.getKey()) ){
+                    propType = pd.getType();
+                    DataTypeDefinition pdDataType = dataTypes.get(propType);
+                    ToscaPropertyType toscaPropType = isScalarType(pdDataType);
+                    if ( toscaPropType == null ){
+                        scalar = false;
+                    }else{
+                        scalar = true;
+                        propType = toscaPropType.getType();
+                        innerConverterProp = toscaPropType.getValueConverter();
+                    }
+                    break;
+                }
+            }
+        }
+        Object convertedValue = convertDataTypeToToscaObject(propType, dataTypes, innerConverterProp, scalar, e.getValue(), false);
+        toscaMap.put(e.getKey(), convertedValue);
+    }
+
+    public Object convertDataTypeToToscaObject(String innerType, Map<String, DataTypeDefinition> dataTypes, ToscaValueConverter innerConverter, final boolean isScalarF, JsonElement entryValue, boolean preserveEmptyValue) {
+        Object convertedValue = null;
+        if (isScalarF && entryValue.isJsonPrimitive()) {
+            log.debug("try convert scalar value {}", entryValue.getAsString());
+            if (entryValue.getAsString() == null) {
+                convertedValue = null;
+            } else {
+                convertedValue = innerConverter.convertToToscaValue(entryValue.getAsString(), innerType, dataTypes);
+            }
+        } else {
+            if ( entryValue.isJsonPrimitive() ){
+                return handleComplexJsonValue(entryValue);
+            }
+
+            // ticket 228696523 created   / DE272734 / Bug 154492 Fix
+            if(entryValue instanceof JsonArray) {
+                ArrayList<Object> toscaObjectPresentationArray = new ArrayList<>();
+                JsonArray jsonArray = entryValue.getAsJsonArray();
+
+                for (JsonElement jsonElement : jsonArray) {
+                    Object convertedDataTypeToToscaMap = convertDataTypeToToscaMap(innerType, dataTypes, isScalarF, jsonElement, preserveEmptyValue);
+                    toscaObjectPresentationArray.add(convertedDataTypeToToscaMap);
+                }
+                convertedValue = toscaObjectPresentationArray;
+            } else {
+                convertedValue = convertDataTypeToToscaMap(innerType, dataTypes, isScalarF, entryValue, preserveEmptyValue);
+            }
+        }
+        return convertedValue;
+    }
+
+    private Object convertDataTypeToToscaMap(String innerType, Map<String, DataTypeDefinition> dataTypes,
+            final boolean isScalarF, JsonElement entryValue, boolean preserveEmptyValue) {
+        Object convertedValue;
+        if (entryValue.isJsonPrimitive()) {
+            return json2JavaPrimitive(entryValue.getAsJsonPrimitive());
+        }
+        JsonObject asJsonObjectIn = entryValue.getAsJsonObject();
+
+        DataTypePropertyConverter.getInstance().mergeDataTypeDefaultValuesWithPropertyValue(asJsonObjectIn, innerType, dataTypes);
+        Map<String, Object> toscaObjectPresentation = new HashMap<>();
+        Set<Entry<String, JsonElement>> entrySetIn = asJsonObjectIn.entrySet();
+
+        for (Entry<String, JsonElement> entry : entrySetIn) {
+            String propName = entry.getKey();
+
+            JsonElement elementValue = entry.getValue();
+            Object convValue;
+            if (!isScalarF) {
+                DataTypeDefinition dataTypeDefinition = dataTypes.get(innerType);
+                Map<String, PropertyDefinition> allProperties = getAllProperties(dataTypeDefinition);
+                PropertyDefinition propertyDefinition = allProperties.get(propName);
+                if (propertyDefinition == null) {
+                    log.trace("The property {} was not found under data type . Parse as map", propName);
+                    if (elementValue.isJsonPrimitive()) {
+                        convValue = elementValue.getAsString();
+                    } else {
+                        convValue = handleComplexJsonValue(elementValue);
+                    }
+                } else {
+                    String type = propertyDefinition.getType();
+                    ToscaPropertyType propertyType = ToscaPropertyType.isValidType(type);
+                    if (propertyType != null) {
+                        if (elementValue.isJsonPrimitive()) {
+                            ToscaValueConverter valueConverter = propertyType.getValueConverter();
+                            convValue = valueConverter.convertToToscaValue(elementValue.getAsString(), type, dataTypes);
+                        } else {
+                            if (ToscaPropertyType.MAP.equals(type) || ToscaPropertyType.LIST.equals(propertyType)) {
+                                ToscaValueConverter valueConverter = propertyType.getValueConverter();
+                                String json = gson.toJson(elementValue);
+                                String innerTypeRecursive = propertyDefinition.getSchema().getProperty().getType();
+                                convValue = valueConverter.convertToToscaValue(json, innerTypeRecursive, dataTypes);
+                            } else {
+                                convValue = handleComplexJsonValue(elementValue);
+                            }
+                        }
+                    } else {
+                        convValue = convertToToscaValue(elementValue.toString(), type, dataTypes);
+                    }
+                }
+            } else {
+                if (elementValue.isJsonPrimitive()) {
+                    convValue = json2JavaPrimitive(elementValue.getAsJsonPrimitive());
+                } else {
+                    convValue = handleComplexJsonValue(elementValue);
+                }
+            }
+            if(preserveEmptyValue || !isEmptyObjectValue(convValue)){
+                toscaObjectPresentation.put(propName, convValue);
+            }
+        }
+        convertedValue = toscaObjectPresentation;
+        return convertedValue;
+    }
 
 }