X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=catalog-be%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenecomp%2Fsdc%2Fbe%2Ftosca%2FInterfacesOperationsConverter.java;h=e95f16eaacef3c81dd6249744d24e7555e06af21;hb=629837b3f7a282c74604987fd531ff4523f98a0c;hp=64e61699ede395f2837922fa9c753ce2f434bc54;hpb=f13f58eb867c763e6ed1c3b674fd99b1081a0664;p=sdc.git diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java index 64e61699ed..e95f16eaac 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.openecomp.sdc.be.tosca; import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DEFAULT; @@ -22,7 +23,9 @@ import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.OPERATIONS; import com.fasterxml.jackson.annotation.JsonInclude; 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.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -35,9 +38,16 @@ import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +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.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; @@ -45,14 +55,18 @@ 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; +import org.openecomp.sdc.be.tosca.model.ToscaPropertyAssignmentJsonSerializer; import org.openecomp.sdc.be.tosca.utils.OperationArtifactUtil; import org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum; import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; @@ -76,42 +90,6 @@ public class InterfacesOperationsConverter { this.propertyConvertor = propertyConvertor; } - /** - * Creates the interface_types element. - * - * @param component to work on - * @return the added element - */ - public static Map addInterfaceTypeElement(Component component, List allInterfaceTypes) { - if (component instanceof Product) { - return null; - } - final Map interfaces = component.getInterfaces(); - if (MapUtils.isEmpty(interfaces)) { - return null; - } - Map toscaInterfaceTypes = new HashMap<>(); - for (InterfaceDefinition interfaceDefinition : interfaces.values()) { - boolean isInterfaceTypeExistInGlobalType = allInterfaceTypes.stream() - .anyMatch(type -> type.equalsIgnoreCase(interfaceDefinition.getType())); - if (!isInterfaceTypeExistInGlobalType) { - ToscaInterfaceNodeType toscaInterfaceType = new ToscaInterfaceNodeType(); - toscaInterfaceType.setDerived_from(DERIVED_FROM_STANDARD_INTERFACE); - final Map operations = interfaceDefinition.getOperations(); - Map toscaOperations = new HashMap<>(); - for (Map.Entry operationEntry : operations.entrySet()) { - toscaOperations.put(operationEntry.getValue().getName(), null); - } - toscaInterfaceType.setOperations(toscaOperations); - Map interfacesAsMap = getObjectAsMap(toscaInterfaceType); - Map operationsMap = (Map) interfacesAsMap.remove(OPERATIONS.getElementName()); - interfacesAsMap.putAll(operationsMap); - toscaInterfaceTypes.put(getInterfaceType(component, LOCAL_INTERFACE_TYPE), interfacesAsMap); - } - } - return MapUtils.isNotEmpty(toscaInterfaceTypes) ? toscaInterfaceTypes : null; - } - private static Object getDefaultValue(Map inputValueMap) { Object defaultValue = null; for (Map.Entry operationEntry : inputValueMap.entrySet()) { @@ -147,16 +125,11 @@ public class InterfacesOperationsConverter { return toscaResourceName.substring(toscaResourceName.lastIndexOf(DOT) + 1); } - private static boolean isArtifactPresent(Map.Entry operationEntry) { - final boolean isImplementationPresent = !Objects.isNull(operationEntry.getValue().getImplementation()); - if (isImplementationPresent) { - return !Objects.isNull(operationEntry.getValue().getImplementation().getArtifactName()); - } - return false; - } - private static String getInputValue(final OperationInputDefinition input) { - String inputValue = input.getValue() == null ? input.getToscaDefaultValue(): input.getValue(); + if (null != input.getToscaFunction()) { + return input.getToscaFunction().getJsonObjectValue().toString(); + } + String inputValue = input.getValue() == null ? input.getToscaDefaultValue() : input.getValue(); if (inputValue != null && inputValue.contains(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName())) { Gson gson = new Gson(); Map> consumptionValue = gson.fromJson(inputValue, Map.class); @@ -178,13 +151,22 @@ public class InterfacesOperationsConverter { return interfaceType; } - private static Map getObjectAsMap(Object obj) { - ObjectMapper objectMapper = new ObjectMapper(); - if (obj instanceof ToscaInterfaceDefinition) { - //Prevent empty field serialization in interface definition - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + private static Map getObjectAsMap(final Object obj) { + final Map objectAsMap; + if (obj instanceof Map) { + objectAsMap = (Map) obj; + } else { + final ObjectMapper objectMapper = new ObjectMapper(); + final SimpleModule module = new SimpleModule("ToscaPropertyAssignmentSerializer"); + module.addSerializer(ToscaPropertyAssignment.class, new ToscaPropertyAssignmentJsonSerializer()); + objectMapper.registerModule(module); + if (obj instanceof ToscaInterfaceDefinition) { + //Prevent empty field serialization in interface definition + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + objectAsMap = objectMapper.convertValue(obj, Map.class); } - Map objectAsMap = obj instanceof Map ? (Map) obj : objectMapper.convertValue(obj, Map.class); + final String defaultEntry = DEFAULT.getElementName(); if (objectAsMap.containsKey(defaultEntry)) { objectAsMap.put(DEFAULT_HAS_UNDERSCORE, objectAsMap.remove(defaultEntry)); @@ -192,6 +174,47 @@ public class InterfacesOperationsConverter { return objectAsMap; } + /** + * Creates the interface_types element. + * + * @param component to work on + * @return the added element + */ + public Map addInterfaceTypeElement(Component component, List allInterfaceTypes) { + if (component instanceof Product) { + return null; + } + final Map interfaces = component.getInterfaces(); + if (MapUtils.isEmpty(interfaces)) { + return null; + } + Map toscaInterfaceTypes = new HashMap<>(); + for (InterfaceDefinition interfaceDefinition : interfaces.values()) { + boolean isInterfaceTypeExistInGlobalType = allInterfaceTypes.stream() + .anyMatch(type -> type.equalsIgnoreCase(interfaceDefinition.getType())); + if (!isInterfaceTypeExistInGlobalType) { + ToscaInterfaceNodeType toscaInterfaceType = new ToscaInterfaceNodeType(); + toscaInterfaceType.setDerived_from(DERIVED_FROM_STANDARD_INTERFACE); + final Map operations = interfaceDefinition.getOperations(); + Map toscaOperations = new HashMap<>(); + for (Map.Entry operationEntry : operations.entrySet()) { + toscaOperations.put(operationEntry.getValue().getName(), null); + } + toscaInterfaceType.setOperations(toscaOperations); + Map interfacesAsMap = getObjectAsMap(toscaInterfaceType); + Map operationsMap = (Map) interfacesAsMap.remove(OPERATIONS.getElementName()); + interfacesAsMap.putAll(operationsMap); + toscaInterfaceTypes.put(getInterfaceType(component, LOCAL_INTERFACE_TYPE), interfacesAsMap); + } + } + return MapUtils.isNotEmpty(toscaInterfaceTypes) ? toscaInterfaceTypes : null; + } + + private boolean isArtifactPresent(final OperationDataDefinition operationDataDefinition) { + return operationDataDefinition.getImplementation() != null + && StringUtils.isNotEmpty(operationDataDefinition.getImplementation().getArtifactName()); + } + /** * Adds the 'interfaces' element to the node type provided. * @@ -214,18 +237,18 @@ public class InterfacesOperationsConverter { } private Map getInterfacesMap(Component component, Map dataTypes, boolean isAssociatedComponent) { - return getInterfacesMap(component, null, component.getInterfaces(), dataTypes, isAssociatedComponent, false); + return getInterfacesMap(component, null, component.getInterfaces(), dataTypes, isAssociatedComponent); } public Map getInterfacesMap(final Component component, final ComponentInstance componentInstance, final Map interfaces, final Map dataTypes, - final boolean isAssociatedComponent, final boolean isServiceProxyInterface) { + final boolean isAssociatedComponent) { if (MapUtils.isEmpty(interfaces)) { return null; } final Map toscaInterfaceDefinitions = new HashMap<>(); for (InterfaceDefinition interfaceDefinition : interfaces.values()) { - handleInterfaceOperations(component, componentInstance, dataTypes, isAssociatedComponent, isServiceProxyInterface, + handleInterfaceOperations(component, componentInstance, dataTypes, isAssociatedComponent, toscaInterfaceDefinitions, interfaceDefinition); } return toscaInterfaceDefinitions; @@ -233,13 +256,13 @@ public class InterfacesOperationsConverter { public Map getInterfacesMapFromComponentInstance(final Component component, final ComponentInstance componentInstance, final Map dataTypes, - final boolean isAssociatedComponent, final boolean isServiceProxyInterface) { + final boolean isAssociatedComponent) { final Map toscaInterfaceDefinitions = new HashMap<>(); final ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); for (final Map.Entry interfaceEntry : componentInstance.getInterfaces().entrySet()) { final InterfaceDefinition interfaceDefinition = objectMapper.convertValue(interfaceEntry.getValue(), InterfaceDefinition.class); - handleInterfaceOperations(component, componentInstance, dataTypes, isAssociatedComponent, isServiceProxyInterface, + handleInterfaceOperations(component, componentInstance, dataTypes, isAssociatedComponent, toscaInterfaceDefinitions, interfaceDefinition); } return toscaInterfaceDefinitions; @@ -247,7 +270,7 @@ public class InterfacesOperationsConverter { private void handleInterfaceOperations(final Component component, final ComponentInstance componentInstance, final Map dataTypes, final boolean isAssociatedComponent, - final boolean isServiceProxyInterface, final Map toscaInterfaceDefinitions, + final Map toscaInterfaceDefinitions, final InterfaceDefinition interfaceDefinition) { final String interfaceType; if (componentInstance != null && LOCAL_INTERFACE_TYPE.equals(interfaceDefinition.getType())) { @@ -262,16 +285,21 @@ public class InterfacesOperationsConverter { final Map operations = interfaceDefinition.getOperations(); final Map toscaOperationMap = new HashMap<>(); for (final Entry operationEntry : operations.entrySet()) { - final ToscaLifecycleOperationDefinition toscaLifecycleOperationDefinition = new ToscaLifecycleOperationDefinition(); - handleInterfaceOperationImplementation(component, componentInstance, isAssociatedComponent, operationEntry, - toscaLifecycleOperationDefinition); - toscaLifecycleOperationDefinition.setDescription(operationEntry.getValue().getDescription()); - fillToscaOperationInputs(operationEntry.getValue(), dataTypes, toscaLifecycleOperationDefinition, isServiceProxyInterface); - toscaOperationMap.put(operationEntry.getValue().getName(), toscaLifecycleOperationDefinition); + if (operationHasAnImplementation(operationEntry.getValue())) { + final ToscaLifecycleOperationDefinition toscaLifecycleOperationDefinition = new ToscaLifecycleOperationDefinition(); + handleInterfaceOperationImplementation(component, componentInstance, isAssociatedComponent, operationEntry.getValue(), + toscaLifecycleOperationDefinition, dataTypes); + if (StringUtils.isNotEmpty(operationEntry.getValue().getDescription())) { + toscaLifecycleOperationDefinition.setDescription(operationEntry.getValue().getDescription()); + } + fillToscaOperationInputs(operationEntry.getValue(), dataTypes, toscaLifecycleOperationDefinition); + fillToscaOperationMilestones(operationEntry.getValue(), dataTypes, toscaLifecycleOperationDefinition); + toscaOperationMap.put(operationEntry.getValue().getName(), toscaLifecycleOperationDefinition); + } } toscaInterfaceDefinition.setOperations(toscaOperationMap); final Map interfaceInputMap = createInterfaceInputMap(interfaceDefinition, dataTypes); - if (!interfaceInputMap.isEmpty()) { + if (MapUtils.isNotEmpty(interfaceInputMap)) { toscaInterfaceDefinition.setInputs(interfaceInputMap); } final Map interfaceDefinitionAsMap = getObjectAsMap(toscaInterfaceDefinition); @@ -284,39 +312,108 @@ public class InterfacesOperationsConverter { toscaInterfaceDefinitions.put(getLastPartOfName(interfaceType), interfaceDefinitionAsMap); } + private void fillToscaOperationMilestones(OperationDataDefinition operation, Map dataTypes, + ToscaLifecycleOperationDefinition toscaOperation) { + if (Objects.isNull(operation.getMilestones()) || operation.getMilestones().isEmpty()) { + toscaOperation.setMilestones(null); + return; + } + Map toscaMilestones = new HashMap<>(); + for (Entry milestone : operation.getMilestones().entrySet()) { + ListDataDefinition activities = milestone.getValue().getActivities(); + if (MilestoneTypeEnum.getEnum(milestone.getKey()).isEmpty() || activities == null || activities.isEmpty()) { + continue; + } + List> toscaActivities = new ArrayList<>(); + for (ActivityDataDefinition activity : activities.getListToscaDataDefinition()) { + if (ActivityTypeEnum.getEnum(activity.getType()).isEmpty()) { + continue; + } + Map toscaActivityMap = new HashMap<>(); + ToscaActivity toscaActivity = new ToscaActivity(); + toscaActivity.setWorkflow(activity.getWorkflow()); + toscaActivityMap.put(activity.getType(), toscaActivity); + toscaActivities.add(toscaActivityMap); + } + ToscaMilestone toscaMilestone = new ToscaMilestone(); + toscaMilestone.setActivities(toscaActivities); + toscaMilestones.put(milestone.getKey(), toscaMilestone); + } + toscaOperation.setMilestones(toscaMilestones); + } + + private boolean operationHasAnImplementation(OperationDataDefinition operation) { + return operation.getImplementation() != null && StringUtils.isNotEmpty(operation.getImplementation().getArtifactName()) && + !operation.getImplementation().getArtifactName().equals("''"); + } + private void handleInterfaceOperationImplementation(final Component component, final ComponentInstance componentInstance, final boolean isAssociatedComponent, - final Entry operationEntry, - final ToscaLifecycleOperationDefinition toscaOperation) { - final String operationArtifactPath; - final ToscaInterfaceOperationImplementation toscaInterfaceOperationImplementation = new ToscaInterfaceOperationImplementation(); - toscaInterfaceOperationImplementation.setPrimary(new ToscaArtifactDefinition()); - final ToscaArtifactDefinition toscaArtifactDefinition = toscaInterfaceOperationImplementation.getPrimary(); - if (isArtifactPresent(operationEntry) && StringUtils.isNotEmpty(operationEntry.getValue().getImplementation().getArtifactName())) { - operationArtifactPath = OperationArtifactUtil - .createOperationArtifactPath(component, componentInstance, operationEntry.getValue(), isAssociatedComponent); - toscaArtifactDefinition.setFile(operationArtifactPath); - toscaArtifactDefinition.setArtifact_version(!operationEntry.getValue().getImplementation().getArtifactVersion() - .equals(NumberUtils.INTEGER_ZERO.toString()) ? operationEntry.getValue().getImplementation().getArtifactVersion() : null); - toscaArtifactDefinition.setType(operationEntry.getValue().getImplementation().getArtifactType()); - handleInterfaceOperationImplementationProperties(operationEntry, toscaArtifactDefinition); - toscaOperation.setImplementation( - toscaArtifactDefinition.getType() != null ? toscaInterfaceOperationImplementation : operationArtifactPath); - } else { - toscaArtifactDefinition.setFile(operationEntry.getValue().getImplementation().getArtifactName()); - toscaOperation.setImplementation(toscaInterfaceOperationImplementation); + final OperationDataDefinition operationDataDefinition, + final ToscaLifecycleOperationDefinition toscaOperation, + final Map dataTypes) { + final ArtifactDataDefinition implementation = operationDataDefinition.getImplementation(); + if (implementation == null) { + return; + } + + 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); + final String artifactVersion = implementation.getArtifactVersion(); + toscaArtifactDefinition.setArtifact_version(!artifactVersion.equals(NumberUtils.INTEGER_ZERO.toString()) ? artifactVersion : null); + toscaArtifactDefinition.setType(implementation.getArtifactType()); + final Map propertiesMap = handleImplementationProperties(operationDataDefinition, dataTypes); + if (MapUtils.isNotEmpty(propertiesMap)) { + toscaArtifactDefinition.setProperties(propertiesMap); + } + toscaInterfaceOperationImplementation.setPrimary(toscaArtifactDefinition); + toscaOperation.setImplementation(toscaInterfaceOperationImplementation); + } else { + 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); + } + } } } - private void handleInterfaceOperationImplementationProperties(final Entry operationEntry, - final ToscaArtifactDefinition toscaArtifactDefinition) { - final var properties = operationEntry.getValue().getImplementation().getProperties(); - if (CollectionUtils.isNotEmpty(properties)) { - final Map propertiesMap = new HashMap<>(); - properties.stream().filter(propertyDataDefinition -> StringUtils.isNotEmpty(propertyDataDefinition.getValue())) - .forEach(propertyDataDefinition -> propertiesMap.put(propertyDataDefinition.getName(), propertyDataDefinition.getValue())); - toscaArtifactDefinition.setProperties(propertiesMap); + private Map handleImplementationProperties(final OperationDataDefinition operationDataDefinition, + final Map dataTypes) { + if (operationDataDefinition.getImplementation() == null) { + return new HashMap<>(); } + + final List properties = operationDataDefinition.getImplementation().getProperties(); + if (CollectionUtils.isEmpty(properties)) { + return new HashMap<>(); + } + + final Map propertiesMap = new HashMap<>(); + properties.stream() + .filter(propertyDataDefinition -> StringUtils.isNotEmpty(propertyDataDefinition.getValue())) + .forEach(propertyDataDefinition -> { + final String propertyValue = + propertyDataDefinition.getValue() != null ? propertyDataDefinition.getValue() : propertyDataDefinition.getDefaultValue(); + final ToscaPropertyAssignment toscaPropertyAssignment = new ToscaPropertyAssignment(); + toscaPropertyAssignment.setValue(propertyConvertor.convertToToscaObject(propertyDataDefinition, propertyValue, dataTypes, false)); + propertiesMap.put(propertyDataDefinition.getName(), toscaPropertyAssignment); + } + ); + + return propertiesMap; } public void removeInterfacesWithoutOperations(final Map interfaceMap) { @@ -373,7 +470,7 @@ public class InterfacesOperationsConverter { } private void fillToscaOperationInputs(OperationDataDefinition operation, Map dataTypes, - ToscaLifecycleOperationDefinition toscaOperation, boolean isServiceProxyInterface) { + ToscaLifecycleOperationDefinition toscaOperation) { if (Objects.isNull(operation.getInputs()) || operation.getInputs().isEmpty()) { toscaOperation.setInputs(null); return; @@ -389,4 +486,5 @@ public class InterfacesOperationsConverter { } toscaOperation.setInputs(toscaInputs); } + }