Fix 'Tosca Function get_input in Properties Assignment error'-bug
[sdc.git] / common-be / src / main / java / org / openecomp / sdc / be / datatypes / elements / ToscaGetFunctionDataDefinition.java
index 4fe3f3a..6f78c68 100644 (file)
@@ -30,6 +30,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import lombok.Data;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.openecomp.sdc.be.datatypes.enums.PropertySource;
 import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType;
 
@@ -43,6 +44,7 @@ public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunct
     private String sourceName;
     private ToscaGetFunctionType functionType;
     private List<String> propertyPathFromSource = new ArrayList<>();
+    private List<Object> toscaIndexList;
 
     public ToscaGetFunctionDataDefinition() {
         //necessary for JSON conversions
@@ -87,6 +89,15 @@ public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunct
             );
         }
         if (propertySource == PropertySource.SELF) {
+            if (CollectionUtils.isNotEmpty(toscaIndexList)) {
+                List<Object> parsedIndexList = new ArrayList<Object>();
+                toscaIndexList.forEach((obj) -> {
+                    parsedIndexList.add(StringUtils.isNumeric(obj.toString()) ? Integer.parseInt(obj.toString()) : obj);
+                });
+                return Map.of(functionType.getFunctionName(),
+                    Stream.concat(Stream.of(PropertySource.SELF.getName()), Stream.concat(propertyPathFromSource.stream(),parsedIndexList.stream())).collect(Collectors.toList())
+                );
+            }
             return Map.of(functionType.getFunctionName(),
                 Stream.concat(Stream.of(PropertySource.SELF.getName()), propertyPathFromSource.stream()).collect(Collectors.toList())
             );
@@ -97,6 +108,15 @@ public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunct
                     String.format("sourceName is required in order to generate the %s from INSTANCE value", functionType.getFunctionName())
                 );
             }
+            if (CollectionUtils.isNotEmpty(toscaIndexList)) {
+                List<Object> parsedIndexList = new ArrayList<Object>();
+                toscaIndexList.forEach((obj) -> {
+                    parsedIndexList.add(StringUtils.isNumeric(obj.toString()) ? Integer.parseInt(obj.toString()) : obj);
+                });
+                return Map.of(functionType.getFunctionName(),
+                    Stream.concat(Stream.of(sourceName), Stream.concat(propertyPathFromSource.stream(),parsedIndexList.stream())).collect(Collectors.toList())
+                );
+            }
             return Map.of(functionType.getFunctionName(),
                 Stream.concat(Stream.of(sourceName), propertyPathFromSource.stream()).collect(Collectors.toList())
             );
@@ -106,10 +126,18 @@ public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunct
     }
 
     private Map<String, Object> buildGetInputFunctionValue() {
+        final List<Object> propertySourceCopy = new ArrayList<>(this.propertyPathFromSource);
+        final List<Object> propertySourceOneCopy = new ArrayList<>();
+        propertySourceOneCopy.add(this.propertyPathFromSource.get(0));
+        if (CollectionUtils.isNotEmpty(toscaIndexList)) {
+            propertySourceCopy.addAll(toscaIndexList);
+            propertySourceOneCopy.addAll(toscaIndexList);
+        }
         if (this.propertyPathFromSource.size() == 1) {
-            return Map.of(this.functionType.getFunctionName(), this.propertyPathFromSource.get(0));
+            return Map.of(functionType.getFunctionName(), propertySourceOneCopy.size() == 1 ? propertySourceOneCopy.get(0) : propertySourceOneCopy);
+        } else {
+            return Map.of(functionType.getFunctionName(), propertySourceCopy.size() == 1 ? propertySourceCopy.get(0) : propertySourceCopy);
         }
-        return Map.of(this.functionType.getFunctionName(), this.propertyPathFromSource);
     }
 
     @Override