Improve handling 'empty'/null string in Service fields
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / tosca / ToscaExportHandler.java
index 6c1f4e3..4d99b4d 100644 (file)
@@ -82,6 +82,7 @@ import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterPropertyDataDef
 import org.openecomp.sdc.be.datatypes.elements.ToscaArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ToscaFunction;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ConstraintType;
 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
@@ -114,6 +115,7 @@ import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
 import org.openecomp.sdc.be.model.operations.impl.ModelOperation;
+import org.openecomp.sdc.be.model.tosca.ToscaType;
 import org.openecomp.sdc.be.model.tosca.converters.ToscaMapValueConverter;
 import org.openecomp.sdc.be.tosca.PropertyConvertor.PropertyType;
 import org.openecomp.sdc.be.tosca.builder.ToscaRelationshipBuilder;
@@ -225,14 +227,6 @@ public class ToscaExportHandler {
                 .forEach(operations -> operations.values().forEach(operation -> operation.setImplementation(null)));
     }
 
-    private static Object buildNodeFilterValue(final PropertyFilterConstraintDataDefinition filterConstraint) {
-        if (filterConstraint.getValue() instanceof ToscaFunction) {
-            return Map.of(filterConstraint.getOperator().getType(), ((ToscaFunction) filterConstraint.getValue()).getJsonObjectValue());
-        } else {
-            return Map.of(filterConstraint.getOperator().getType(), filterConstraint.getValue());
-        }
-    }
-
     public Either<ToscaRepresentation, ToscaError> exportComponent(Component component) {
         return convertToToscaTemplate(component).left().map(this::createToscaRepresentation);
     }
@@ -288,7 +282,6 @@ public class ToscaExportHandler {
         representer.addClassTag(toscaTemplate.getClass(), Tag.MAP);
         representer.setPropertyUtils(new UnsortedPropertyUtils());
 
-
         Yaml yaml = new Yaml(representer, options);
         String yamlAsString = yaml.dumpAsMap(toscaTemplate);
         String sb = getConfiguration().getHeatEnvArtifactHeader()
@@ -353,7 +346,8 @@ public class ToscaExportHandler {
                         .collect(Collectors.toMap(
                                 PropertyDataDefinition::getName,
                                 s -> propertyConvertor.convertProperty(dataTypes, s, PropertyType.PROPERTY),
-                                (toscaPropertyTobeValidated, toscaProperty) -> validateToscaProperty((List<DataTypeDefinition>) dataTypeDefinition, toscaPropertyTobeValidated,
+                                (toscaPropertyTobeValidated, toscaProperty) -> validateToscaProperty((List<DataTypeDefinition>) dataTypeDefinition,
+                                        toscaPropertyTobeValidated,
                                         toscaProperty)
                         )));
             }
@@ -364,7 +358,7 @@ public class ToscaExportHandler {
     }
 
     private List<Map<String, Map<String, String>>> getDefaultToscaImports(final String modelId) {
-        if (modelId == null) {
+        if (StringUtils.isEmpty(modelId)) {
             return getDefaultToscaImportConfig();
         }
 
@@ -531,9 +525,11 @@ public class ToscaExportHandler {
     }
 
     private boolean doNotExtendBaseType(final Component component) {
-        final Map<String, CategoryBaseTypeConfig> serviceNodeTypesConfig = ConfigurationManager.getConfigurationManager().getConfiguration().getServiceBaseNodeTypes();
+        final Map<String, CategoryBaseTypeConfig> serviceNodeTypesConfig = ConfigurationManager.getConfigurationManager().getConfiguration()
+                .getServiceBaseNodeTypes();
         List<CategoryDefinition> categories = component.getCategories();
-        if (CollectionUtils.isNotEmpty(categories) && MapUtils.isNotEmpty(serviceNodeTypesConfig) && serviceNodeTypesConfig.get(categories.get(0).getName()) != null) {
+        if (CollectionUtils.isNotEmpty(categories) && MapUtils.isNotEmpty(serviceNodeTypesConfig)
+                && serviceNodeTypesConfig.get(categories.get(0).getName()) != null) {
             return serviceNodeTypesConfig.get(categories.get(0).getName()).isDoNotExtendBaseType();
         }
         return false;
@@ -561,12 +557,12 @@ public class ToscaExportHandler {
         }
     }
 
-    private Map<String, String> convertMetadata(Component component) {
+    private Map<String, Object> convertMetadata(Component component) {
         return convertMetadata(component, false, null);
     }
 
-    private Map<String, String> convertMetadata(Component component, boolean isInstance, ComponentInstance componentInstance) {
-        Map<String, String> toscaMetadata = new LinkedHashMap<>();
+    private Map<String, Object> convertMetadata(Component component, boolean isInstance, ComponentInstance componentInstance) {
+        Map<String, Object> toscaMetadata = new LinkedHashMap<>();
         toscaMetadata.put(convertMetadataKey(JsonPresentationFields.INVARIANT_UUID), component.getInvariantUUID());
         toscaMetadata.put(JsonPresentationFields.UUID.getPresentation(), component.getUUID());
         toscaMetadata
@@ -610,6 +606,7 @@ public class ToscaExportHandler {
                 }
                 toscaMetadata.put(JsonPresentationFields.RESOURCE_VENDOR_RELEASE.getPresentation(), resource.getVendorRelease());
                 toscaMetadata.put(JsonPresentationFields.RESOURCE_VENDOR_MODEL_NUMBER.getPresentation(), resource.getResourceVendorModelNumber());
+                toscaMetadata.put(resource.isTopologyTemplate() ? JsonPresentationFields.TEMPLATE_VERSION.getPresentation() : JsonPresentationFields.VERSION.getPresentation(), resource.getVersion());
                 break;
             case SERVICE:
                 Service service = (Service) component;
@@ -618,12 +615,11 @@ public class ToscaExportHandler {
                 toscaMetadata.put(JsonPresentationFields.SERVICE_ROLE.getPresentation(), service.getServiceRole());
                 toscaMetadata.put(JsonPresentationFields.SERVICE_FUNCTION.getPresentation(), service.getServiceFunction());
                 toscaMetadata.put(JsonPresentationFields.ENVIRONMENT_CONTEXT.getPresentation(), service.getEnvironmentContext());
+                toscaMetadata.put(JsonPresentationFields.TEMPLATE_VERSION.getPresentation(), service.getVersion());
                 toscaMetadata.put(JsonPresentationFields.INSTANTIATION_TYPE.getPresentation(),
                         service.getEnvironmentContext() == null ? StringUtils.EMPTY : service.getInstantiationType());
                 if (!isInstance) {
-                    // DE268546
-                    toscaMetadata.put(JsonPresentationFields.ECOMP_GENERATED_NAMING.getPresentation(), service.isEcompGeneratedNaming().toString());
-                    toscaMetadata.put(JsonPresentationFields.ECOMP_GENERATED_NAMING.getPresentation(), service.isEcompGeneratedNaming().toString());
+                    toscaMetadata.put(JsonPresentationFields.ECOMP_GENERATED_NAMING.getPresentation(), service.isEcompGeneratedNaming());
                     toscaMetadata.put(JsonPresentationFields.NAMING_POLICY.getPresentation(), service.getNamingPolicy());
                 }
                 break;
@@ -1419,7 +1415,7 @@ public class ToscaExportHandler {
             try {
                 final List<Map<String, ToscaTemplateRequirement>> toscaRequirements = buildRequirements(component, componentInstance,
                         requirementDefinitionList, originComponent, componentCache);
-                if (!toscaRequirements.isEmpty()) {
+                if (CollectionUtils.isNotEmpty(toscaRequirements)) {
                     nodeTypeTemplate.setRequirements(toscaRequirements);
                 }
             } catch (final Exception e) {
@@ -1443,7 +1439,9 @@ public class ToscaExportHandler {
         for (RequirementCapabilityRelDef relationshipDefinition : filteredRelations) {
             final Map<String, ToscaTemplateRequirement> toscaTemplateRequirementMap =
                     buildRequirement(componentInstance, originComponent, component.getComponentInstances(), relationshipDefinition, componentCache);
-            toscaRequirements.add(toscaTemplateRequirementMap);
+            if (MapUtils.isNotEmpty(toscaTemplateRequirementMap)) {
+                toscaRequirements.add(toscaTemplateRequirementMap);
+            }
         }
 
         return toscaRequirements;
@@ -1463,12 +1461,13 @@ public class ToscaExportHandler {
             throws ToscaExportException {
 
         final Map<String, List<RequirementDefinition>> reqMap = fromOriginComponent.getRequirements();
-        final CapabilityRequirementRelationship capabilityRequirementRelationship = relationshipDefinition
-                .getRelationships().get(0);
+        if (MapUtils.isEmpty(reqMap)) {
+            return new HashMap<>();
+        }
+        final CapabilityRequirementRelationship capabilityRequirementRelationship = relationshipDefinition.getRelationships().get(0);
         final RelationshipInfo relationshipInfo = capabilityRequirementRelationship.getRelation();
 
-        final ComponentInstance toInstance = instancesList.stream()
-                .filter(i -> relationshipDefinition.getToNode().equals(i.getUniqueId()))
+        final ComponentInstance toInstance = instancesList.stream().filter(i -> relationshipDefinition.getToNode().equals(i.getUniqueId()))
                 .findFirst().orElse(null);
         if (toInstance == null) {
             final String errorMsg = String
@@ -1477,12 +1476,10 @@ public class ToscaExportHandler {
             log.debug(errorMsg);
             throw new ToscaExportException(errorMsg);
         }
-        final Optional<RequirementDefinition> reqOpt =
-                findRequirement(fromOriginComponent, reqMap, relationshipInfo, fromInstance.getUniqueId());
+        final Optional<RequirementDefinition> reqOpt = findRequirement(fromOriginComponent, reqMap, relationshipInfo, fromInstance.getUniqueId());
         if (reqOpt.isEmpty()) {
-            final String errorMsg = String
-                    .format("Failed to find a requirement with uniqueId %s on a component with uniqueId %s",
-                            relationshipInfo.getRequirementUid(), fromOriginComponent.getUniqueId());
+            final String errorMsg = String.format("Failed to find a requirement with uniqueId %s on a component with uniqueId %s",
+                    relationshipInfo.getRequirementUid(), fromOriginComponent.getUniqueId());
             log.debug(errorMsg);
             throw new ToscaExportException(errorMsg);
         }
@@ -1494,8 +1491,7 @@ public class ToscaExportHandler {
                 toscaOperationFacade.getToscaElement(toInstance.getActualComponentUid(), filter);
         if (getOriginRes.isRight()) {
             final String errorMsg = String.format(
-                    "Failed to build substituted name for the requirement %s. "
-                            + "Failed to get an origin component with uniqueId %s",
+                    "Failed to build substituted name for the requirement %s. Failed to get an origin component with uniqueId %s",
                     reqOpt.get().getName(), toInstance.getActualComponentUid());
             log.debug(errorMsg);
             throw new ToscaExportException(errorMsg);
@@ -1506,9 +1502,8 @@ public class ToscaExportHandler {
         if (capOpt.isEmpty()) {
             capOpt = findCapability(relationshipInfo, toOriginComponent, fromOriginComponent, reqOpt.get());
             if (capOpt.isEmpty()) {
-                final String errorMsg = String
-                        .format("Failed to find a capability with name %s on a component with uniqueId %s",
-                                relationshipInfo.getCapability(), fromOriginComponent.getUniqueId());
+                final String errorMsg = String.format("Failed to find a capability with name %s on a component with uniqueId %s",
+                        relationshipInfo.getCapability(), fromOriginComponent.getUniqueId());
                 log.debug(errorMsg);
                 throw new ToscaExportException(errorMsg);
             }
@@ -1528,7 +1523,7 @@ public class ToscaExportHandler {
                                                           RequirementDefinition requirement) {
         Optional<CapabilityDefinition> cap = toOriginComponent.getCapabilities().get(requirement.getCapability())
                 .stream().filter(c -> c.getType().equals(requirement.getCapability())).findFirst();
-        if (!cap.isPresent()) {
+        if (cap.isEmpty()) {
             log.debug("Failed to find a capability with name {} on a component with uniqueId {}",
                     reqAndRelationshipPair.getCapability(), fromOriginComponent.getUniqueId());
         }
@@ -1585,10 +1580,9 @@ public class ToscaExportHandler {
                                                             Map<String, List<RequirementDefinition>> reqMap,
                                                             RelationshipInfo reqAndRelationshipPair,
                                                             String fromInstanceId) {
-        for (List<RequirementDefinition> reqList : reqMap.values()) {
-            Optional<RequirementDefinition> reqOpt = reqList.stream().filter(
-                            r -> isRequirementBelongToRelation(fromOriginComponent, reqAndRelationshipPair, r, fromInstanceId))
-                    .findFirst();
+        for (final List<RequirementDefinition> reqList : reqMap.values()) {
+            final Optional<RequirementDefinition> reqOpt = reqList.stream()
+                    .filter(r -> isRequirementBelongToRelation(fromOriginComponent, reqAndRelationshipPair, r, fromInstanceId)).findFirst();
             if (reqOpt.isPresent()) {
                 return reqOpt;
             }
@@ -1776,6 +1770,46 @@ public class ToscaExportHandler {
         return propertiesCopy;
     }
 
+    private static Object buildNodeFilterValue(final PropertyFilterConstraintDataDefinition filterConstraint) {
+        if (filterConstraint.getValue() instanceof ToscaFunction) {
+            return Map.of(filterConstraint.getOperator().getType(), ((ToscaFunction) filterConstraint.getValue()).getJsonObjectValue());
+        }
+        if (filterConstraint.getValue() instanceof List) {
+            if (((List<?>) filterConstraint.getValue()).get(0) instanceof ToscaFunction) {
+                List<Object> toscaFunctionList = new ArrayList<>();
+                ((List<?>) filterConstraint.getValue()).forEach(toscaFunctionValue -> toscaFunctionList.add(
+                        ((ToscaFunction) toscaFunctionValue).getJsonObjectValue()));
+                return Map.of(filterConstraint.getOperator().getType(), toscaFunctionList);
+            }
+        }
+        if (doesTypeNeedConvertingToIntOrFloat(filterConstraint.getOriginalType(), filterConstraint.getValue())) {
+            ToscaType toscaType = ToscaType.getToscaType(
+                    filterConstraint.getValue() instanceof List ? ToscaType.LIST.getType() : filterConstraint.getOriginalType());
+            filterConstraint.setValue(toscaType.convert(String.valueOf(filterConstraint.getValue())));
+        } else if (ConstraintType.LENGTH.getType().equals(filterConstraint.getOperator().getType()) ||
+                ConstraintType.MIN_LENGTH.getType().equals(filterConstraint.getOperator().getType()) ||
+                ConstraintType.MAX_LENGTH.getType().equals(filterConstraint.getOperator().getType())) {
+            filterConstraint.setValue(Integer.valueOf(String.valueOf(filterConstraint.getValue())));
+        }
+        if (doesTypeNeedConvertingToBoolean(filterConstraint.getOriginalType())) {
+            filterConstraint.setValue(ToscaType.getToscaType(filterConstraint.getOriginalType()).convert(
+                String.valueOf(filterConstraint.getValue())));
+        }
+        return Map.of(filterConstraint.getOperator().getType(), filterConstraint.getValue());
+    }
+
+    private static boolean doesTypeNeedConvertingToIntOrFloat(String propertyType, Object value) {
+        if (value instanceof List && ((List<?>) value).get(0) instanceof LinkedHashMap
+                && ((LinkedHashMap) ((List<?>) value).get(0)).get("type") != null) {
+            return false;
+        }
+        return ToscaType.INTEGER.getType().equals(propertyType) || ToscaType.FLOAT.getType().equals(propertyType);
+    }
+
+    private static boolean doesTypeNeedConvertingToBoolean(String propertyType) {
+        return ToscaType.BOOLEAN.getType().equals(propertyType);
+    }
+
     private Map<String, String[]> buildSubstitutionMappingPropertyMapping(final Component component) {
         if (component == null || CollectionUtils.isEmpty(component.getInputs())) {
             return Collections.emptyMap();