Support for copy/paste tosca functions into operation inputs 64/133264/3
authorJvD_Ericsson <jeff.van.dam@est.tech>
Tue, 14 Feb 2023 11:53:07 +0000 (11:53 +0000)
committerMichael Morris <michael.morris@est.tech>
Fri, 17 Feb 2023 09:51:09 +0000 (09:51 +0000)
Issue-ID: SDC-4394
Signed-off-by: JvD_Ericsson <jeff.van.dam@est.tech>
Change-Id: I4aedb641e950419677d2509f4944fcf778c2efd8

catalog-be/src/test/java/org/openecomp/sdc/be/components/merge/property/PropertyDataValueMergeBusinessLogicTest.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/tosca/converters/ToscaListValueConverter.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/tosca/converters/ToscaMapValueConverter.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/tosca/converters/ToscaValueBaseConverter.java
catalog-model/src/test/java/org/openecomp/sdc/be/model/tosca/converters/ToscaValueBaseConverterTest.java

index 400b20c..51b7f80 100644 (file)
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -57,7 +57,7 @@ import org.openecomp.sdc.be.tosca.PropertyConvertor;
 public class PropertyDataValueMergeBusinessLogicTest {
 
     private ObjectMapper mapper = new ObjectMapper();
-    
+
     private PropertyDataValueMergeBusinessLogic testInstance;
 
     @Mock
@@ -66,9 +66,9 @@ public class PropertyDataValueMergeBusinessLogicTest {
     @Before
     public void setUp() throws Exception {
         PropertyValueMerger propertyValueMerger = new PropertyValueMerger();
-        
+
         testInstance = new PropertyDataValueMergeBusinessLogic(propertyValueMerger, applicationDataTypeCache,
-                new PropertyConvertor());
+            new PropertyConvertor());
     }
 
     @Test
@@ -133,7 +133,7 @@ public class PropertyDataValueMergeBusinessLogicTest {
         PropertyDataDefinition newProp = createProp("prop1", ToscaPropertyType.LIST.getType(), "string", "[\"x\", \"\"]");
         testMergeProps(oldProp, newProp, "[\"x\",\"b\"]");
     }
-    
+
     @Test
     public void mergeSimpleListType_differentSize() throws Exception {
         PropertyDataDefinition oldProp = createProp("prop1", ToscaPropertyType.LIST.getType(), "string", "[\"a\", \"b\", \"c\"]");
@@ -148,73 +148,80 @@ public class PropertyDataValueMergeBusinessLogicTest {
         testMergeProps(oldProp, newProp, "[[\"a\"],\"d\"]");
     }
 
-    /**                                   
-     * Old property:                       New property:                           Expected:                           
-     *   {                                  {                                       {                                 
-     *     "mac_range_plan": "y",             "mac_range_plan": "",                   "mac_range_plan": "y",          
-     *     "mac_count_required": {            "mac_count_required": {                 "mac_count_required": {         
-     *       "is_required": true,               "is_required": false,                   "is_required": false,         
-     *       "count": 44                        "mac_address": "myAddress"              "mac_address": "myAddress"    
-     *     }                                  }                                       }                               
-     *   }                                  }                                       }                                 
-     *                                                                                                                
+    /**
+     * Old property:                       New property:                           Expected:
+     * {                                  {                                       {
+     * "mac_range_plan": "y",             "mac_range_plan": "",                   "mac_range_plan": "y",
+     * "mac_count_required": {            "mac_count_required": {                 "mac_count_required": {
+     * "is_required": true,               "is_required": false,                   "is_required": false,
+     * "count": 44                        "mac_address": "myAddress"              "mac_address": "myAddress"
+     * }                                  }                                       }
+     * }                                  }                                       }
      */
     @Test
     public void mergeComplexType() throws Exception {
-        PropertyDataDefinition oldProp = createProp("prop1", "myType", null, "{\"mac_range_plan\":\"y\", \"mac_count_required\":{\"is_required\":true,\"count\":44}}");
-        PropertyDataDefinition newProp = createProp("prop1", "myType", null, "{\"mac_range_plan\":\"\",  \"mac_count_required\":{\"is_required\":false, \"mac_address\":\"myAddress\"}}");
-        
+        PropertyDataDefinition oldProp =
+            createProp("prop1", "myType", null, "{\"mac_range_plan\":\"y\", \"mac_count_required\":{\"is_required\":true,\"count\":44}}");
+        PropertyDataDefinition newProp = createProp("prop1", "myType", null,
+            "{\"mac_range_plan\":\"\",  \"mac_count_required\":{\"is_required\":false, \"mac_address\":\"myAddress\"}}");
+
         DataTypeDefinition myType = new DataTypeDefinition();
         myType.setName("myType");
-      
+
         PropertyDefinition mac_range_plan = new PropertyDefinition();
         mac_range_plan.setName("mac_range_plan");
         mac_range_plan.setType("string");
 
+        PropertyDefinition schemaProp = new PropertyDefinition();
+        schemaProp.setType("string");
+        SchemaDefinition schema = new SchemaDefinition();
+        schema.setProperty(schemaProp);
         PropertyDefinition mac_count_required = new PropertyDefinition();
         mac_count_required.setName("mac_count_required");
         mac_count_required.setType("map");
-        
+        mac_count_required.setSchema(schema);
+
         myType.setProperties(Arrays.asList(mac_range_plan, mac_count_required));
         Map<String, DataTypeDefinition> dataTypes = Collections.singletonMap(myType.getName(), myType);
 
         when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
-        
+
         testInstance.mergePropertyValue(oldProp, newProp, Collections.emptyList());
-        
-        assertEquals("myType", "{\"mac_range_plan\":\"y\",\"mac_count_required\":{\"is_required\":false,\"mac_address\":\"myAddress\"}}", newProp.getValue());
-    }
-    
-    
-    
-    
-    /**                                                                                    Expected property:
+
+        assertEquals("myType", "{\"mac_range_plan\":\"y\",\"mac_count_required\":{\"is_required\":\"false\",\"mac_address\":\"myAddress\"}}",
+            newProp.getValue());
+    }
+
+
+    /**
+     * Expected property:
      * Old property:                            New property:                                {
-     *   {                                        {                                            "mac_range_plan": "n",
-     *     "mac_range_plan": "y",   "               "mac_range_plan": "n",                     "mymap": {
-     *            "mymap": {                                   "mymap": {                                     "mac_count_required": {      
-     *                   "mac_count_required": {                       "mac_count_required": {                               "is_required": false,
-     *                     "is_required": true,                          "is_required": false                        "count": 44                 
-     *                     "count": 44                                     },                                             },
-     *                   },                                            "host":"localhost",                                "host":"localhost",
-     *                   "backup-mode":"daily",                        "ip":"127.0.0.1"                                   "ip":"127.0.0.1"
-     *                   "ip":"0.0.0.0"                        }                                          }                            
-     *            }                                      }                                          }
-     *   }                                                                                      
-     *                                                                                       
+     * {                                        {                                            "mac_range_plan": "n",
+     * "mac_range_plan": "y",   "               "mac_range_plan": "n",                     "mymap": {
+     * "mymap": {                              "mymap": {                                     "mac_count_required": {
+     * "mac_count_required": {                         "mac_count_required": {                               "is_required": false,
+     * "is_required": true,                              "is_required": false                        "count": 44
+     * "count": 44                                 },                                             },
+     * },                                              "host":"localhost",                                "host":"localhost",
+     * "backup-mode":"daily",                          "ip":"127.0.0.1"                                   "ip":"127.0.0.1"
+     * "ip":"0.0.0.0"                          }                                           }
+     * }                                      }                                          }
+     * }
      */
     @Test
     public void mergeComplexType_containingMapWithComplexType() throws Exception {
-        PropertyDataDefinition oldProp = createProp("prop1", "myType", null, "{\"mac_range_plan\":\"y\",\"mymap\": {\"mac_count_required\": {\"is_required\":true,\"count\":44},\"backup-mode\":\"daily\",\"ip\":\"0.0.0.0\"}}");
-        PropertyDataDefinition newProp = createProp("prop1", "myType", null, "{\"mac_range_plan\":\"n\",\"mymap\": {\"mac_count_required\": {\"is_required\":false},\"host\":\"localhost\",\"ip\":\"127.0.0.1\"}}");
-        
+        PropertyDataDefinition oldProp = createProp("prop1", "myType", null,
+            "{\"mac_range_plan\":\"y\",\"mymap\": {\"mac_count_required\": {\"is_required\":true,\"count\":44},\"backup-mode\":\"daily\",\"ip\":\"0.0.0.0\"}}");
+        PropertyDataDefinition newProp = createProp("prop1", "myType", null,
+            "{\"mac_range_plan\":\"n\",\"mymap\": {\"mac_count_required\": {\"is_required\":false},\"host\":\"localhost\",\"ip\":\"127.0.0.1\"}}");
+
         DataTypeDefinition myType = new DataTypeDefinition();
         myType.setName("myType");
-      
+
         PropertyDefinition mac_range_plan = new PropertyDefinition();
         mac_range_plan.setName("mac_range_plan");
         mac_range_plan.setType("string");
-        
+
         PropertyDefinition mymap = new PropertyDefinition();
         mymap.setName("mymap");
         mymap.setType("map");
@@ -222,32 +229,54 @@ public class PropertyDataValueMergeBusinessLogicTest {
         PropertyDefinition mac_count_required = new PropertyDefinition();
         mac_count_required.setName("mac_count_required");
         mac_count_required.setType("MacType");
-        
+
         SchemaDefinition entrySchema = new SchemaDefinition();
         entrySchema.setProperty(mac_count_required);
         mymap.setSchema(entrySchema);
-        
+
         myType.setProperties(Arrays.asList(mac_range_plan, mymap, mac_count_required));
-        Map<String, DataTypeDefinition> dataTypes = Collections.singletonMap(myType.getName(), myType);
+
+        DataTypeDefinition root = new DataTypeDefinition();
+        root.setName("tosca.datatypes.Root");
+
+        DataTypeDefinition macType = new DataTypeDefinition();
+        macType.setName("MacType");
+        macType.setDerivedFrom(root);
+
+        PropertyDefinition is_required = new PropertyDefinition();
+        is_required.setName("is_required");
+        is_required.setType("boolean");
+
+        PropertyDefinition count = new PropertyDefinition();
+        count.setName("count");
+        count.setType("integer");
+
+        macType.setProperties(Arrays.asList(is_required, count));
+
+        Map<String, DataTypeDefinition> dataTypes = new HashMap<>();
+        dataTypes.put(myType.getName(), myType);
+        dataTypes.put(macType.getName(), macType);
 
         when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
-        
+
         testInstance.mergePropertyValue(oldProp, newProp, Collections.emptyList());
-        
-        assertEquals("myType", "{\"mac_range_plan\":\"n\",\"mymap\":{\"ip\":\"127.0.0.1\",\"mac_count_required\":{\"is_required\":false,\"count\":44},\"host\":\"localhost\"}}", newProp.getValue());
+
+        assertEquals("myType",
+            "{\"mac_range_plan\":\"n\",\"mymap\":{\"ip\":\"127.0.0.1\",\"mac_count_required\":{\"is_required\":false,\"count\":44},\"host\":\"localhost\"}}",
+            newProp.getValue());
     }
 
 
-    /*                                                               
-     *  Old Property:                      New Property:                          Expected:          
-     *  [                                  [                                      [                      
-     *    {                                   {                                      {                   
-     *      "prop1": "val1",                    "prop2": {                             "prop2": {        
-     *      "prop2": {                            "prop3": false                         "prop3": false  
-     *        "prop3": true,                    }                                      }                 
-     *        "prop4": 44                     }                                      }                   
-     *      }                              ]                                      ]                      
-     *    },                                                         
+    /*
+     *  Old Property:                      New Property:                          Expected:
+     *  [                                  [                                      [
+     *    {                                   {                                      {
+     *      "prop1": "val1",                    "prop2": {                             "prop2": {
+     *      "prop2": {                            "prop3": false                         "prop3": false
+     *        "prop3": true,                    }                                      }
+     *        "prop4": 44                     }                                      }
+     *      }                              ]                                      ]
+     *    },
      *    {
      *      "prop1": "val2",
      *      "prop2": {
@@ -255,12 +284,12 @@ public class PropertyDataValueMergeBusinessLogicTest {
      *      }
      *    }
      *  ]
-     *  
+     *
      */
     @Test
     public void mergeListOfComplexType_differentSize() throws Exception {
         PropertyDataDefinition oldProp = createProp("prop1", "list", "myType", "[{\"prop1\":\"val1\", \"prop2\":{\"prop3\":true,\"prop4\":44}}, " +
-                                                                                       "{\"prop1\":\"val2\", \"prop2\":{\"prop3\":true}}]");
+            "{\"prop1\":\"val2\", \"prop2\":{\"prop3\":true}}]");
         PropertyDataDefinition newProp = createProp("prop1", "list", "myType", "[{\"prop2\":{\"prop3\":false}}]");
 
         Map<String, DataTypeDefinition> dataTypes = buildDataTypes();
@@ -268,8 +297,8 @@ public class PropertyDataValueMergeBusinessLogicTest {
         testInstance.mergePropertyValue(oldProp, newProp, Collections.emptyList());
         assertEquals("myType", "[{\"prop2\":{\"prop3\":false}}]", newProp.getValue());
     }
-    
-    
+
+
     /*
      *  Old Property:                     New Property:                 Expected:
      *  [                                 [                             [
@@ -278,37 +307,40 @@ public class PropertyDataValueMergeBusinessLogicTest {
      *      "prop2": {                        "prop2": {                   "prop2": {
      *        "prop3": true,                    "prop4": 45                  "prop3": true
      *        "prop4": 44                     }                              "prop4": 45
-     *      }                               },                             }                       
-     *    },                                {                            },                        
-     *    {                                                              {                         
-     *      "prop1": "val2",                  "prop2": {                   "prop1": "val2",                        
-     *      "prop2": {                          "prop3": false             "prop2": {              
-     *        "prop3": true                   }                              "prop3": false        
-     *      }                               }                              }                       
-     *    }                               ]                              }                         
-     *  ]                                                              ]                           
-     *                                                                                             
-     */                                                                                            
+     *      }                               },                             }
+     *    },                                {                            },
+     *    {                                                              {
+     *      "prop1": "val2",                  "prop2": {                   "prop1": "val2",
+     *      "prop2": {                          "prop3": false             "prop2": {
+     *        "prop3": true                   }                              "prop3": false
+     *      }                               }                              }
+     *    }                               ]                              }
+     *  ]                                                              ]
+     *
+     */
     @Test
     public void mergeListOfComplexType() throws Exception {
         PropertyDataDefinition oldProp = createProp("lprop", "list", "myType", "[{\"prop1\":\"val1\", \"prop2\":{\"prop3\":true,\"prop4\":44}}, " +
-                                                                                "{\"prop1\":\"val2\", \"prop2\":{\"prop3\":true}}]");
-        PropertyDataDefinition newProp = createProp("lprop", "list", "myType", "[{\"prop1\":\"\", \"prop2\":{\"prop4\":45}}, {\"prop2\":{\"prop3\":false}}]");
+            "{\"prop1\":\"val2\", \"prop2\":{\"prop3\":true}}]");
+        PropertyDataDefinition newProp =
+            createProp("lprop", "list", "myType", "[{\"prop1\":\"\", \"prop2\":{\"prop4\":45}}, {\"prop2\":{\"prop3\":false}}]");
+
 
-        
         DataTypeDefinition myType = new DataTypeDefinition();
         myType.setName("myType");
-        
+
         Map<String, DataTypeDefinition> dataTypes = buildDataTypes();
         when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
         testInstance.mergePropertyValue(oldProp, newProp, Collections.emptyList());
-        assertEquals("lprop",  "[{\"prop2\":{\"prop4\":45,\"prop3\":true},\"prop1\":\"val1\"},{\"prop2\":{\"prop3\":false},\"prop1\":\"val2\"}]", newProp.getValue());
+        assertEquals("lprop", "[{\"prop2\":{\"prop4\":45,\"prop3\":true},\"prop1\":\"val1\"},{\"prop2\":{\"prop3\":false},\"prop1\":\"val2\"}]",
+            newProp.getValue());
     }
 
     @Test
     public void mergeListOfMapsWithJsonAsInnerType() throws Exception {
         PropertyDataDefinition oldProp = createProp("value_spec", "list", "json", "[{\"prop1\":\"val1\", \"prop2\":\"prop3\",\"prop4\":44}]");
-        PropertyDataDefinition newProp = createProp("value_spec", "list", "json", "[{\"prop22\":{\"prop221\":45,\"prop222\":\"val222\",\"prop223\":\"false\"}}]");
+        PropertyDataDefinition newProp =
+            createProp("value_spec", "list", "json", "[{\"prop22\":{\"prop221\":45,\"prop222\":\"val222\",\"prop223\":\"false\"}}]");
 
         Map<String, DataTypeDefinition> dataTypes = buildDataTypes();
         when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
@@ -317,9 +349,8 @@ public class PropertyDataValueMergeBusinessLogicTest {
     }
 
 
-
     /*
-     * Old Property:                          New Property:                               Expected:                          
+     * Old Property:                          New Property:                               Expected:
      * {                                      {                                           {
      *   "lprop": [                             "lprop": [                                  "lprop": [
      *     {                                      {                                           {
@@ -345,17 +376,17 @@ public class PropertyDataValueMergeBusinessLogicTest {
      *     }                                  }                                               }
      *   ],                                                                                 ],
      *   "prop5": "value5"                                                                  "prop5": "value05"
-     * }                                                                                  }   
+     * }                                                                                  }
      *
      *
-     */                                                                                            
+     */
     @Test
     public void mergeComplexType_containsListOfComplexType() throws Exception {
-        PropertyDataDefinition oldProp = createProp("complexProp", "complexType", null, 
-                "{\"lprop\":[{\"prop1\":\"val1\",\"prop2\":[{\"prop3\":true,\"prop4\":44},{\"prop3\":false,\"prop4\":96}]}," + 
+        PropertyDataDefinition oldProp = createProp("complexProp", "complexType", null,
+            "{\"lprop\":[{\"prop1\":\"val1\",\"prop2\":[{\"prop3\":true,\"prop4\":44},{\"prop3\":false,\"prop4\":96}]}," +
                 "{\"prop1\":\"val2\",\"prop2\":[{\"prop3\":true}]}],\"prop5\":\"value5\"} ");
         PropertyDataDefinition newProp = createProp("complexProp", "complexType", null,
-                "{\"lprop\":[{\"prop2\":[{\"prop3\":true},{\"prop4\":69}]},{\"prop1\":\"val1\",\"prop2\":[{\"prop3\":false}]}],\"prop5\":\"value05\"}");
+            "{\"lprop\":[{\"prop2\":[{\"prop3\":true},{\"prop4\":69}]},{\"prop1\":\"val1\",\"prop2\":[{\"prop3\":false}]}],\"prop5\":\"value05\"}");
 
         DataTypeDefinition complexType = new DataTypeDefinition();
         complexType.setName("complexType");
@@ -365,18 +396,18 @@ public class PropertyDataValueMergeBusinessLogicTest {
         PropertyDefinition prop5 = new PropertyDefinition();
         prop5.setName("prop5");
         prop5.setType("string");
-        
+
         DataTypeDefinition complexProp = new DataTypeDefinition();
         complexProp.setName("complexType");
         complexType.setProperties(Arrays.asList(lprop, prop5));
-        
+
         DataTypeDefinition myType = new DataTypeDefinition();
         myType.setName("myType");
 
         PropertyDefinition prop1 = new PropertyDefinition();
         prop1.setName("prop1");
         prop1.setType("string");
-        
+
         DataTypeDefinition myInnerType = new DataTypeDefinition();
         myInnerType.setName("myInnerType");
 
@@ -393,38 +424,40 @@ public class PropertyDataValueMergeBusinessLogicTest {
         complexType.setProperties(Arrays.asList(lprop, prop5));
         myType.setProperties(Arrays.asList(prop1, prop2));
         myInnerType.setProperties(Arrays.asList(prop3, prop4));
-        
+
         Map<String, DataTypeDefinition> dataTypes = Stream.of(complexType, myType, myInnerType)
-                                                           .collect(Collectors.toMap(DataTypeDefinition::getName, Function.identity()));
-        
+            .collect(Collectors.toMap(DataTypeDefinition::getName, Function.identity()));
+
         when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(dataTypes));
-        
+
         testInstance.mergePropertyValue(oldProp, newProp, Collections.emptyList());
-        
-        assertEquals("complexProp", 
-                "{\"lprop\":[{\"prop2\":[{\"prop4\":44,\"prop3\":true},{\"prop4\":69,\"prop3\":false}],\"prop1\":\"val1\"},{\"prop2\":[{\"prop3\":false}],\"prop1\":\"val1\"}],\"prop5\":\"value05\"}",
-                newProp.getValue());
+
+        assertEquals("complexProp",
+            "{\"lprop\":[{\"prop2\":[{\"prop4\":44,\"prop3\":true},{\"prop4\":69,\"prop3\":false}],\"prop1\":\"val1\"},{\"prop2\":[{\"prop3\":false}],\"prop1\":\"val1\"}],\"prop5\":\"value05\"}",
+            newProp.getValue());
     }
-    
-    
+
+
     @Test
     public void mergeMapType_differentSize() throws Exception {
         PropertyDataDefinition oldProp = createProp("prop1", "map", "string", "{\"prop1\":\"val1\", \"prop2\":\"val2\", \"prop3\":\"val3\"}");
         PropertyDataDefinition newProp = createProp("prop1", "map", "string", "{\"prop1\":\"valY\", \"prop2\":\"\"}");
-        
+
         HashMap<String, String> expected = Maps.newHashMap();
         expected.put("prop1", "valY");
         expected.put("prop2", "val2");
         verifyMapMerge(getMergedMapProp(oldProp, newProp, Collections.emptyList()), expected);
     }
-    
-    
+
+
     @Test
     public void mergeMapType() throws Exception {
-        PropertyDataDefinition oldProp = createProp("prop1", "map", "string", "{\"prop1\":\"val1\", \"prop2\":\"val2\", \"prop3\":\"\", \"prop4\":\"val4\"}");
-        PropertyDataDefinition newProp = createProp("prop1", "map", "string", "{\"prop1\":\"valY\", \"prop2\":\"\", \"prop3\":\"val3\", \"prop5\":\"val5\"}");
-        
-        
+        PropertyDataDefinition oldProp =
+            createProp("prop1", "map", "string", "{\"prop1\":\"val1\", \"prop2\":\"val2\", \"prop3\":\"\", \"prop4\":\"val4\"}");
+        PropertyDataDefinition newProp =
+            createProp("prop1", "map", "string", "{\"prop1\":\"valY\", \"prop2\":\"\", \"prop3\":\"val3\", \"prop5\":\"val5\"}");
+
+
         HashMap<String, String> expected = Maps.newHashMap();
         expected.put("prop1", "valY");
         expected.put("prop2", "val2");
@@ -456,61 +489,66 @@ public class PropertyDataValueMergeBusinessLogicTest {
     public void mergeGetInputValue_valueIsNull_InNewProp() throws Exception {
         PropertyDataDefinition oldProp = createGetInputProp("prop1", "string", null, "input1");
         PropertyDataDefinition newProp = createProp("prop1", "string", null, null);
-        testMergeProps(oldProp, newProp,"{\"get_input\":\"input1\"}", Collections.singletonList("input1"));
+        testMergeProps(oldProp, newProp, "{\"get_input\":\"input1\"}", Collections.singletonList("input1"));
         assertGetInputValues(newProp, "input1");
     }
 
     /*
-     * Old property:                      New property:                       Expected:              
-     * [                                  [                                   [                          
-     *   {                                  {                                   {                         
-     *     "mac_range_plan": {                "mac_count_required": {           "mac_range_plan": {     
-     *       "get_input": "input1"              "is_required": true               "get_input": "input1" 
-     *     },                                 }                                 },                      
-     *     "mac_count_required": {          }                                   "mac_count_required": {                                    
-     *       "is_required": true,                                                 "is_required": true         
-     *       "count": {                   inputs: intput1, input2               }                             
-     *         "get_input": "input2"      ]                                   }                               
-     *       }                                                                                                
-     *     }                                                                  inputs: input2                    
-     *   }                                                                  ]                                 
-     *                                                                        
-     *   inputs: intput1, input2                                                                            
-     * ]                                                                                                    
-     * 
-     * 
-     * 
+     * Old property:                      New property:                       Expected:
+     * [                                  [                                   [
+     *   {                                  {                                   {
+     *     "mac_range_plan": {                "mac_count_required": {           "mac_range_plan": {
+     *       "get_input": "input1"              "is_required": true               "get_input": "input1"
+     *     },                                 }                                 },
+     *     "mac_count_required": {          }                                   "mac_count_required": {
+     *       "is_required": true,                                                 "is_required": true
+     *       "count": {                   inputs: intput1, input2               }
+     *         "get_input": "input2"      ]                                   }
+     *       }
+     *     }                                                                  inputs: input2
+     *   }                                                                  ]
+     *
+     *   inputs: intput1, input2
+     * ]
+     *
+     *
+     *
      */
     @Test
     public void mergeComplexGetInputValue() throws Exception {
-        PropertyDataDefinition oldProp = new PropertyDataDefinitionBuilder().addGetInputValue("input1").addGetInputValue("input2").setName("prop1").setType("myType").setValue("{\"mac_range_plan\":{\"get_input\": \"input1\"}, \"mac_count_required\":{\"is_required\":true,\"count\":{\"get_input\": \"input2\"}}}").build();
-        PropertyDataDefinition newProp = new PropertyDataDefinitionBuilder().addGetInputValue("input2").setName("prop1").setType("myType").setValue("{\"mac_count_required\":{\"is_required\":true}}").build();
-        testMergeProps(oldProp, newProp,"{\"mac_range_plan\":{},\"mac_count_required\":{\"is_required\":true}}", Collections.singletonList("input2"));
+        PropertyDataDefinition oldProp =
+            new PropertyDataDefinitionBuilder().addGetInputValue("input1").addGetInputValue("input2").setName("prop1").setType("myType").setValue(
+                    "{\"mac_range_plan\":{\"get_input\": \"input1\"}, \"mac_count_required\":{\"is_required\":true,\"count\":{\"get_input\": \"input2\"}}}")
+                .build();
+        PropertyDataDefinition newProp = new PropertyDataDefinitionBuilder().addGetInputValue("input2").setName("prop1").setType("myType")
+            .setValue("{\"mac_count_required\":{\"is_required\":true}}").build();
+        testMergeProps(oldProp, newProp, "{\"mac_range_plan\":{},\"mac_count_required\":{\"is_required\":true}}",
+            Collections.singletonList("input2"));
         assertGetInputValues(newProp, "input2");
     }
 
     @Test
     public void mergeListValueWithMultipleGetInputs() throws Exception {
         PropertyDataDefinition oldProp = new PropertyDataDefinitionBuilder()
-                .addGetInputValue("input1").addGetInputValue("input2").addGetInputValue("input3")
-                .setName("prop1")
-                .setType("list").setSchemaType("string")
-                .setValue("[{\"get_input\": \"input2\"},{\"get_input\": \"input3\"},{\"get_input\": \"input1\"}]")
-                .build();
+            .addGetInputValue("input1").addGetInputValue("input2").addGetInputValue("input3")
+            .setName("prop1")
+            .setType("list").setSchemaType("string")
+            .setValue("[{\"get_input\": \"input2\"},{\"get_input\": \"input3\"},{\"get_input\": \"input1\"}]")
+            .build();
 
         PropertyDataDefinition newProp = new PropertyDataDefinitionBuilder()
-                .addGetInputValue("input3")
-                .addGetInputValue("input5")
-                .setName("prop1")
-                .setType("list").setSchemaType("string")
-                .setValue("[{\"get_input\": \"input5\"}, {\"get_input\": \"input3\"}]")
-                .build();
-
-        testMergeProps(oldProp, newProp,"[{\"get_input\":\"input5\"},{\"get_input\":\"input3\"}]");
+            .addGetInputValue("input3")
+            .addGetInputValue("input5")
+            .setName("prop1")
+            .setType("list").setSchemaType("string")
+            .setValue("[{\"get_input\": \"input5\"}, {\"get_input\": \"input3\"}]")
+            .build();
+
+        testMergeProps(oldProp, newProp, "[{\"get_input\":\"input5\"},{\"get_input\":\"input3\"}]");
         assertGetInputValues(newProp, "input3", "input5");
     }
 
-    private void assertGetInputValues(PropertyDataDefinition newProp, String ... expectedInputNames) {
+    private void assertGetInputValues(PropertyDataDefinition newProp, String... expectedInputNames) {
         assertTrue(newProp.isGetInputProperty());
         assertEquals(newProp.getGetInputValues().size(), expectedInputNames.length);
         for (int i = 0; i < expectedInputNames.length; i++) {
@@ -519,12 +557,12 @@ public class PropertyDataValueMergeBusinessLogicTest {
             assertEquals(getInputValueDataDefinition.getInputName(), expectedInputName);
         }
     }
-    
+
     private void testMergeProps(PropertyDataDefinition oldProp, PropertyDataDefinition newProp, String expectedValue) {
         testMergeProps(oldProp, newProp, expectedValue, Collections.emptyList());
     }
 
-    private void testMergeProps(PropertyDataDefinition oldProp, PropertyDataDefinition newProp, String expectedValue,  List<String> getInputsToMerge) {
+    private void testMergeProps(PropertyDataDefinition oldProp, PropertyDataDefinition newProp, String expectedValue, List<String> getInputsToMerge) {
         when(applicationDataTypeCache.getAll(null)).thenReturn(Either.left(Collections.emptyMap()));
         testInstance.mergePropertyValue(oldProp, newProp, getInputsToMerge);
         assertEquals(expectedValue, newProp.getValue());
@@ -545,28 +583,29 @@ public class PropertyDataValueMergeBusinessLogicTest {
 
     private PropertyDataDefinition createProp(String name, String type, String innerType, String val) {
         return new PropertyDataDefinitionBuilder()
-                .setType(type)
-                .setSchemaType(innerType)
-                .setValue(val)
-                .setName(name)
-                .build();
+            .setType(type)
+            .setSchemaType(innerType)
+            .setValue(val)
+            .setName(name)
+            .build();
     }
 
     private PropertyDataDefinition createGetInputProp(String name, String type, String innerType, String inputName) {
         String val = String.format("{\"get_input\":\"%s\"}", inputName);
         return new PropertyDataDefinitionBuilder()
-                .setType(type)
-                .setSchemaType(innerType)
-                .setValue(val)
-                .addGetInputValue(inputName)
-                .setName(name)
-                .build();
+            .setType(type)
+            .setSchemaType(innerType)
+            .setValue(val)
+            .addGetInputValue(inputName)
+            .setName(name)
+            .build();
 
     }
 
     private Map<String, String> convertJsonToMap(String jsonString) {
         try {
-            return mapper.readValue(jsonString, new TypeReference<Map<String, String>>(){});
+            return mapper.readValue(jsonString, new TypeReference<Map<String, String>>() {
+            });
         } catch (IOException e) {
             return null;
         }
index 67894bd..f449f78 100644 (file)
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.openecomp.sdc.be.model.tosca.converters;
 
 import com.google.gson.JsonArray;
@@ -32,7 +33,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.jetbrains.annotations.Nullable;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
@@ -93,12 +93,11 @@ public class ToscaListValueConverter extends ToscaValueBaseConverter implements
             final boolean isScalarF = isScalar;
             final ToscaValueConverter innerConverterFinal = innerConverter;
             asJsonArray.forEach(e -> {
-                Object convertedValue = null;
+                Object convertedValue;
                 if (isScalarF) {
-                    if (e.isJsonPrimitive()) {
-                        String jsonAsString = e.getAsString();
-                        log.debug("try to convert scalar value {}", jsonAsString);
-                        convertedValue = innerConverterFinal.convertToToscaValue(jsonAsString, innerType, dataTypes);
+                    if (isJsonElementAJsonPrimitive(e)) {
+                        log.debug("try to convert scalar value {}", e.getAsString());
+                        convertedValue = innerConverterFinal.convertToToscaValue(e.getAsString(), innerType, dataTypes);
                     } else {
                         convertedValue = handleComplexJsonValue(e);
                     }
@@ -154,16 +153,4 @@ public class ToscaListValueConverter extends ToscaValueBaseConverter implements
             return null;
         }
     }
-
-    private JsonElement parseToJson(final String value) {
-        try {
-            final StringReader reader = new StringReader(value);
-            final JsonReader jsonReader = new JsonReader(reader);
-            jsonReader.setLenient(true);
-            return JsonParser.parseReader(jsonReader);
-        } catch (final JsonSyntaxException e) {
-            log.debug("convertToToscaValue failed to parse json value :", e);
-            return null;
-        }
-    }
 }
index 2cc868b..76d9d2b 100644 (file)
@@ -17,6 +17,7 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.openecomp.sdc.be.model.tosca.converters;
 
 import com.google.gson.JsonArray;
@@ -67,7 +68,7 @@ public class ToscaMapValueConverter extends ToscaValueBaseConverter implements T
             } else {
                 DataTypeDefinition dataTypeDefinition = dataTypes.get(innerType);
                 if (dataTypeDefinition != null) {
-                    ToscaPropertyType toscaPropertyType = null;
+                    ToscaPropertyType toscaPropertyType;
                     if ((toscaPropertyType = isScalarType(dataTypeDefinition)) != null) {
                         innerConverter = toscaPropertyType.getValueConverter();
                     } else {
@@ -85,15 +86,7 @@ public class ToscaMapValueConverter extends ToscaValueBaseConverter implements T
                 }
             }
             JsonElement jsonElement;
-            try {
-                StringReader reader = new StringReader(value);
-                JsonReader jsonReader = new JsonReader(reader);
-                jsonReader.setLenient(true);
-                jsonElement = JsonParser.parseReader(jsonReader);
-            } catch (JsonSyntaxException e) {
-                log.debug("convertToToscaValue failed to parse json value :", e);
-                return null;
-            }
+            jsonElement = parseToJson(value);
             if (jsonElement == null || jsonElement.isJsonNull()) {
                 log.debug("convertToToscaValue json element is null");
                 return null;
@@ -127,9 +120,7 @@ public class ToscaMapValueConverter extends ToscaValueBaseConverter implements T
                     propType = pd.getType();
                     final DataTypeDefinition pdDataType = dataTypes.get(propType);
                     final ToscaPropertyType toscaPropType = isScalarType(pdDataType);
-                    if (toscaPropType == null) {
-                        scalar = false;
-                    } else {
+                    if (toscaPropType != null) {
                         scalar = true;
                         propType = toscaPropType.getType();
                         innerConverterProp = toscaPropType.getValueConverter();
@@ -144,14 +135,9 @@ public class ToscaMapValueConverter extends ToscaValueBaseConverter implements T
 
     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 ");
-            if (entryValue.getAsString() == null) {
-                convertedValue = null;
-            } else {
-                convertedValue = innerConverter.convertToToscaValue(entryValue.getAsString(), innerType, dataTypes);
-            }
+        Object convertedValue;
+        if (isScalarF && isJsonElementAJsonPrimitive(entryValue)) {
+            return innerConverter.convertToToscaValue(entryValue.getAsString(), innerType, dataTypes);
         } else {
             if (entryValue.isJsonPrimitive()) {
                 return handleComplexJsonValue(entryValue);
@@ -201,11 +187,11 @@ public class ToscaMapValueConverter extends ToscaValueBaseConverter implements T
                     String type = propertyDefinition.getType();
                     ToscaPropertyType propertyType = ToscaPropertyType.isValidType(type);
                     if (propertyType != null) {
-                        if (elementValue.isJsonPrimitive()) {
+                        if (isJsonElementAJsonPrimitive(elementValue)) {
                             ToscaValueConverter valueConverter = propertyType.getValueConverter();
                             convValue = valueConverter.convertToToscaValue(elementValue.getAsString(), type, dataTypes);
                         } else {
-                            if (ToscaPropertyType.MAP.equals(type) || ToscaPropertyType.LIST.equals(propertyType)) {
+                            if (ToscaPropertyType.MAP.equals(propertyType) || ToscaPropertyType.LIST.equals(propertyType)) {
                                 ToscaValueConverter valueConverter = propertyType.getValueConverter();
                                 String json = gson.toJson(elementValue);
                                 String innerTypeRecursive = propertyDefinition.getSchema().getProperty().getType();
@@ -219,7 +205,7 @@ public class ToscaMapValueConverter extends ToscaValueBaseConverter implements T
                     }
                 }
             } else {
-                if (elementValue.isJsonPrimitive()) {
+                if (isJsonElementAJsonPrimitive(elementValue)) {
                     convValue = json2JavaPrimitive(elementValue.getAsJsonPrimitive());
                 } else {
                     convValue = handleComplexJsonValue(elementValue);
index 7505d2a..c9b5db8 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.openecomp.sdc.be.model.tosca.converters;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSyntaxException;
+import com.google.gson.stream.JsonReader;
+import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -91,6 +96,9 @@ public class ToscaValueBaseConverter {
             return handleJsonArray(jsonElement);
         }
         if (jsonElement.isJsonPrimitive()) {
+            if (!isJsonElementAJsonPrimitive(jsonElement)) {
+                return handleComplexJsonValue(parseToJson(jsonElement.getAsString()));
+            }
             return json2JavaPrimitive(jsonElement.getAsJsonPrimitive());
         }
         log.debug("JSON type '{}' not supported", jsonElement);
@@ -137,4 +145,28 @@ public class ToscaValueBaseConverter {
         }
         throw new IllegalStateException(String.format("JSON primitive not supported: %s", jsonPrimitive));
     }
+
+    public JsonElement parseToJson(final String value) {
+        try {
+            final StringReader reader = new StringReader(value);
+            final JsonReader jsonReader = new JsonReader(reader);
+            jsonReader.setLenient(true);
+            return JsonParser.parseReader(jsonReader);
+        } catch (final JsonSyntaxException e) {
+            log.debug("convertToToscaValue failed to parse json value :", e);
+            return null;
+        }
+    }
+
+    public boolean isJsonElementAJsonPrimitive(JsonElement jsonElement) {
+        if (!jsonElement.isJsonPrimitive()) {
+            return false;
+        }
+        String elementAsString = jsonElement.getAsString();
+        JsonElement elementAsJson = parseToJson(elementAsString);
+        if (elementAsJson.isJsonPrimitive() || elementAsJson.isJsonNull()) {
+            return true;
+        }
+        return false;
+    }
 }
index 5387b46..13b2be5 100644 (file)
@@ -26,6 +26,8 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import java.util.HashMap;
@@ -145,4 +147,62 @@ class ToscaValueBaseConverterTest {
         assertEquals(innerObject.get("float").getAsDouble(), objectPropertyAsMap.get("float"));
         assertNull(objectPropertyAsMap.get("null"));
     }
+
+    @Test
+    void testParseToJson() {
+        final JsonElement result1 = converter.parseToJson("");
+        assertTrue(result1.isJsonNull());
+
+        final JsonElement result2 = converter.parseToJson("testString");
+        assertTrue(result2.isJsonPrimitive());
+
+        final JsonElement result3 = converter.parseToJson("1");
+        assertTrue(result3.isJsonPrimitive());
+
+        final JsonElement result4 = converter.parseToJson("true");
+        assertTrue(result4.isJsonPrimitive());
+
+        final JsonElement result5 = converter.parseToJson("{\"get_property\":[\"relatedParty_0\",\"name\"]}");
+        assertTrue(result5.isJsonObject());
+
+        final JsonElement result6 = converter.parseToJson("[\"relatedParty_0\",\"name\"]");
+        assertTrue(result6.isJsonArray());
+
+    }
+
+    @Test
+    void testIsJsonElementAJsonPrimitive() {
+
+        JsonElement emptyStringEle = new JsonPrimitive("");
+        final Boolean result1 = converter.isJsonElementAJsonPrimitive(emptyStringEle);
+        assertTrue(result1);
+
+        JsonElement stringEle = new JsonPrimitive("testString");
+        final Boolean result2 = converter.isJsonElementAJsonPrimitive(stringEle);
+        assertTrue(result2);
+
+        JsonElement toscaFunctionEle = new JsonPrimitive("{\"get_property\":[\"relatedParty_0\",\"name\"]}");
+        final Boolean result3 = converter.isJsonElementAJsonPrimitive(toscaFunctionEle);
+        assertFalse(result3);
+
+        JsonElement jsonObjectEle = new JsonObject();
+        final Boolean result4 = converter.isJsonElementAJsonPrimitive(jsonObjectEle);
+        assertFalse(result4);
+
+        JsonElement jsonArrayEle = new JsonArray();
+        final Boolean result5 = converter.isJsonElementAJsonPrimitive(jsonArrayEle);
+        assertFalse(result5);
+
+        JsonElement intEle = new JsonPrimitive(123);
+        final Boolean result6 = converter.isJsonElementAJsonPrimitive(intEle);
+        assertTrue(result6);
+
+        JsonElement boolEle = new JsonPrimitive(true);
+        final Boolean result7 = converter.isJsonElementAJsonPrimitive(boolEle);
+        assertTrue(result7);
+
+        JsonElement nullEle = new JsonNull();
+        final Boolean result8 = converter.isJsonElementAJsonPrimitive(nullEle);
+        assertFalse(result8);
+    }
 }