Support additional metadata in external assets api
[sdc.git] / common-be / src / main / java / org / openecomp / sdc / be / datatypes / elements / ToscaGetFunctionDataDefinition.java
index 0741d68..82958a7 100644 (file)
@@ -21,6 +21,7 @@
 
 package org.openecomp.sdc.be.datatypes.elements;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.gson.Gson;
 import java.util.ArrayList;
 import java.util.List;
@@ -29,11 +30,12 @@ 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;
 
 @Data
-public class ToscaGetFunctionDataDefinition {
+public class ToscaGetFunctionDataDefinition implements ToscaFunction, ToscaFunctionParameter {
 
     private String propertyUniqueId;
     private String propertyName;
@@ -42,11 +44,13 @@ public class ToscaGetFunctionDataDefinition {
     private String sourceName;
     private ToscaGetFunctionType functionType;
     private List<String> propertyPathFromSource = new ArrayList<>();
+    private List<Object> toscaIndexList;
 
     public ToscaGetFunctionDataDefinition() {
         //necessary for JSON conversions
     }
 
+    @JsonIgnore
     public boolean isSubProperty() {
         return propertyPathFromSource != null && propertyPathFromSource.size() > 1;
     }
@@ -55,6 +59,12 @@ public class ToscaGetFunctionDataDefinition {
      * Builds the value of a property based on the TOSCA get function information.
      */
     public String generatePropertyValue() {
+        return new Gson().toJson(getJsonObjectValue());
+    }
+
+    @JsonIgnore
+    @Override
+    public Object getJsonObjectValue() {
         if (functionType == null) {
             throw new IllegalStateException("functionType is required in order to generate the get function value");
         }
@@ -62,12 +72,11 @@ public class ToscaGetFunctionDataDefinition {
             throw new IllegalStateException("propertyPathFromSource is required in order to generate the get function value");
         }
 
-        final var gson = new Gson();
         if (functionType == ToscaGetFunctionType.GET_PROPERTY || functionType == ToscaGetFunctionType.GET_ATTRIBUTE) {
-            return gson.toJson(buildFunctionValueWithPropertySource());
+            return buildFunctionValueWithPropertySource();
         }
         if (functionType == ToscaGetFunctionType.GET_INPUT) {
-            return gson.toJson(buildGetInputFunctionValue());
+            return buildGetInputFunctionValue();
         }
 
         throw new UnsupportedOperationException(String.format("ToscaGetFunctionType '%s' is not supported yet", functionType));
@@ -80,6 +89,15 @@ public class ToscaGetFunctionDataDefinition {
             );
         }
         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())
             );
@@ -90,6 +108,15 @@ public class ToscaGetFunctionDataDefinition {
                     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())
             );
@@ -99,10 +126,40 @@ public class ToscaGetFunctionDataDefinition {
     }
 
     private Map<String, Object> buildGetInputFunctionValue() {
+        List<Object> propertySourceCopy = new ArrayList<Object>(this.propertyPathFromSource);
+        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(this.functionType.getFunctionName(), propertySourceOneCopy);
         }
-        return Map.of(this.functionType.getFunctionName(), this.propertyPathFromSource);
+        return Map.of(this.functionType.getFunctionName(), propertySourceCopy);
+    }
+
+    @Override
+    public ToscaFunctionType getType() {
+        if (functionType == null) {
+            return null;
+        }
+        switch (functionType) {
+            case GET_INPUT:
+                return ToscaFunctionType.GET_INPUT;
+            case GET_PROPERTY:
+                return ToscaFunctionType.GET_PROPERTY;
+            case GET_ATTRIBUTE:
+                return ToscaFunctionType.GET_ATTRIBUTE;
+            default:
+                return null;
+        }
+    }
+
+    @JsonIgnore
+    @Override
+    public String getValue() {
+        return this.generatePropertyValue();
     }
 
 }