Backend support for operation milestones with activity inputs
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / tosca / InterfacesOperationsConverter.java
index e56472a..52fdfcc 100644 (file)
@@ -21,35 +21,34 @@ import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INPUTS;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.OPERATIONS;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.google.gson.Gson;
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
-import org.json.JSONObject;
-import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
-import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.elements.ActivityDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.InputDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MilestoneDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.ToscaFunction;
-import org.openecomp.sdc.be.datatypes.elements.ToscaFunctionType;
+import org.openecomp.sdc.be.datatypes.enums.ActivityTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.MilestoneTypeEnum;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
@@ -57,12 +56,14 @@ import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.Product;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.tosca.PropertyConvertor.PropertyType;
+import org.openecomp.sdc.be.tosca.model.ToscaActivity;
 import org.openecomp.sdc.be.tosca.model.ToscaArtifactDefinition;
 import org.openecomp.sdc.be.tosca.model.ToscaInput;
 import org.openecomp.sdc.be.tosca.model.ToscaInterfaceDefinition;
 import org.openecomp.sdc.be.tosca.model.ToscaInterfaceNodeType;
 import org.openecomp.sdc.be.tosca.model.ToscaInterfaceOperationImplementation;
 import org.openecomp.sdc.be.tosca.model.ToscaLifecycleOperationDefinition;
+import org.openecomp.sdc.be.tosca.model.ToscaMilestone;
 import org.openecomp.sdc.be.tosca.model.ToscaNodeType;
 import org.openecomp.sdc.be.tosca.model.ToscaProperty;
 import org.openecomp.sdc.be.tosca.model.ToscaPropertyAssignment;
@@ -140,42 +141,10 @@ public class InterfacesOperationsConverter {
             mappedOutputValue.remove(1);
             mappedOutputValue.add(1, interfaceName);
             inputValue = gson.toJson(consumptionValue);
-        } else {
-            String finalInputValue = inputValue;
-            if (inputValue != null &&
-                Arrays.stream(ToscaFunctionType.values()).anyMatch(toscaType -> finalInputValue.contains(toscaType.getName().toUpperCase()))) {
-                inputValue = getInputValuesAsToscaFunction(inputValue);
-            }
         }
         return inputValue;
     }
 
-    private static String getInputValuesAsToscaFunction(String inputValue) {
-        Gson gson = new Gson();
-        Map<String, Object> mapOfValues = gson.fromJson(inputValue, Map.class);
-        for (Entry<String, Object> entry : mapOfValues.entrySet()) {
-            Object value = entry.getValue();
-            if (value instanceof Map) {
-                Map<String, Object> valueMap = (Map<String, Object>) value;
-                if (valueMap.containsKey("type")) {
-                    String type = (String) valueMap.get("type");
-                    Optional<ToscaFunctionType> toscaType = ToscaFunctionType.findType(type);
-                    if (toscaType.isPresent()) {
-                        ObjectMapper mapper = new ObjectMapper();
-                        try {
-                            String json = gson.toJson(value);
-                            ToscaFunction toscaFunction = mapper.readValue(json, ToscaFunction.class);
-                            entry.setValue(toscaFunction.getJsonObjectValue());
-                        } catch (JsonProcessingException e) {
-                            throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
-                        }
-                    }
-                }
-            }
-        }
-        return String.valueOf(new JSONObject(mapOfValues));
-    }
-
     private static String getInterfaceType(Component component, String interfaceType) {
         if (LOCAL_INTERFACE_TYPE.equals(interfaceType)) {
             return DERIVED_FROM_BASE_DEFAULT + component.getComponentMetadataDefinition().getMetadataDataDefinition().getSystemName();
@@ -325,6 +294,7 @@ public class InterfacesOperationsConverter {
                     toscaLifecycleOperationDefinition.setDescription(operationEntry.getValue().getDescription());
                 }
                 fillToscaOperationInputs(operationEntry.getValue(), dataTypes, toscaLifecycleOperationDefinition);
+                fillToscaOperationMilestones(operationEntry.getValue(), dataTypes, toscaLifecycleOperationDefinition);
                 toscaOperationMap.put(operationEntry.getValue().getName(), toscaLifecycleOperationDefinition);
             }
         }
@@ -343,6 +313,55 @@ public class InterfacesOperationsConverter {
         toscaInterfaceDefinitions.put(getLastPartOfName(interfaceType), interfaceDefinitionAsMap);
     }
 
+    private void fillToscaOperationMilestones(OperationDataDefinition operation, Map<String, DataTypeDefinition> dataTypes,
+                                              ToscaLifecycleOperationDefinition toscaOperation) {
+        if (Objects.isNull(operation.getMilestones()) || operation.getMilestones().isEmpty()) {
+            toscaOperation.setMilestones(null);
+            return;
+        }
+        Map<String, ToscaMilestone> toscaMilestones = new HashMap<>();
+        for (Entry<String, MilestoneDataDefinition> milestone : operation.getMilestones().entrySet()) {
+            ListDataDefinition<ActivityDataDefinition> activities = milestone.getValue().getActivities();
+            if (MilestoneTypeEnum.getEnum(milestone.getKey()).isEmpty() || activities == null || activities.isEmpty()) {
+                continue;
+            }
+            List<Map<String, ToscaActivity>> toscaActivities = new ArrayList<>();
+            for (ActivityDataDefinition activity : activities.getListToscaDataDefinition()) {
+                if (ActivityTypeEnum.getEnum(activity.getType()).isEmpty()) {
+                    continue;
+                }
+                Map<String, ToscaActivity> toscaActivityMap = new HashMap<>();
+                ToscaActivity toscaActivity = new ToscaActivity();
+                toscaActivity.setWorkflow(activity.getWorkflow());
+                Map<String, Object> inputs = getToscaActivityInputs(activity.getInputs(), dataTypes);
+                if (!inputs.isEmpty()) {
+                    toscaActivity.setInputs(inputs);
+                }
+                toscaActivityMap.put(activity.getType(), toscaActivity);
+                toscaActivities.add(toscaActivityMap);
+            }
+            ToscaMilestone toscaMilestone = new ToscaMilestone();
+            toscaMilestone.setActivities(toscaActivities);
+            toscaMilestones.put(milestone.getKey(), toscaMilestone);
+        }
+        toscaOperation.setMilestones(toscaMilestones);
+    }
+
+    private Map<String, Object> getToscaActivityInputs(ListDataDefinition<OperationInputDefinition> inputs,
+                                                       Map<String, DataTypeDefinition> dataTypes) {
+        if (Objects.isNull(inputs) || inputs.isEmpty()) {
+            return null;
+        }
+        Map<String, Object> toscaInputs = new HashMap<>();
+        for (OperationInputDefinition input : inputs.getListToscaDataDefinition()) {
+            Object value = propertyConvertor.convertToToscaObject(input, getInputValue(input), dataTypes, false);
+            if (ObjectUtils.isNotEmpty(value)) {
+                toscaInputs.put(input.getName(), value);
+            }
+        }
+        return toscaInputs;
+    }
+
     private boolean operationHasAnImplementation(OperationDataDefinition operation) {
         return operation.getImplementation() != null && StringUtils.isNotEmpty(operation.getImplementation().getArtifactName()) &&
             !operation.getImplementation().getArtifactName().equals("''");
@@ -361,6 +380,10 @@ public class InterfacesOperationsConverter {
         if (isArtifactPresent(operationDataDefinition)) {
             final String operationArtifactPath =
                 OperationArtifactUtil.createOperationArtifactPath(component, componentInstance, operationDataDefinition, isAssociatedComponent);
+            final ToscaInterfaceOperationImplementation toscaInterfaceOperationImplementation = new ToscaInterfaceOperationImplementation();
+            if (implementation.getTimeout() != null && implementation.getTimeout() > 0) {
+                toscaInterfaceOperationImplementation.setTimeout(implementation.getTimeout());
+            }
             if (implementation.getArtifactType() != null) {
                 final ToscaArtifactDefinition toscaArtifactDefinition = new ToscaArtifactDefinition();
                 toscaArtifactDefinition.setFile(operationArtifactPath);
@@ -371,12 +394,18 @@ public class InterfacesOperationsConverter {
                 if (MapUtils.isNotEmpty(propertiesMap)) {
                     toscaArtifactDefinition.setProperties(propertiesMap);
                 }
-                final ToscaInterfaceOperationImplementation toscaInterfaceOperationImplementation = new ToscaInterfaceOperationImplementation();
                 toscaInterfaceOperationImplementation.setPrimary(toscaArtifactDefinition);
                 toscaOperation.setImplementation(toscaInterfaceOperationImplementation);
             } else {
-                toscaOperation.setImplementation(
-                    StringUtils.isBlank(operationArtifactPath) || "null".equals(operationArtifactPath) ? null : operationArtifactPath);
+                if (toscaInterfaceOperationImplementation.getTimeout() != null) {
+                    final ToscaArtifactDefinition toscaArtifactDefinition = new ToscaArtifactDefinition();
+                    toscaArtifactDefinition.setFile(StringUtils.isBlank(operationArtifactPath) || "null".equals(operationArtifactPath) ? null : operationArtifactPath);
+                    toscaInterfaceOperationImplementation.setPrimary(toscaArtifactDefinition);
+                    toscaOperation.setImplementation(toscaInterfaceOperationImplementation);
+                } else {
+                    toscaOperation.setImplementation(
+                        StringUtils.isBlank(operationArtifactPath) || "null".equals(operationArtifactPath) ? null : operationArtifactPath);
+                }
             }
         }
     }