Bug fix for userspecified output name in import
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / OutputsBusinessLogic.java
index a5f819d..603270e 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.openecomp.sdc.be.components.impl;
 
 import fj.data.Either;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.jetbrains.annotations.NotNull;
 import org.openecomp.sdc.be.components.attribute.AttributeDeclarationOrchestrator;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
@@ -43,6 +49,7 @@ import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
 import org.openecomp.sdc.be.model.ComponentInstanceOutput;
 import org.openecomp.sdc.be.model.ComponentParametersView;
 import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
@@ -68,7 +75,8 @@ public class OutputsBusinessLogic extends BaseBusinessLogic {
     private static final String GOING_TO_EXECUTE_ROLLBACK_ON_CREATE_OUTPUTS = "Going to execute rollback on create outputs.";
     private static final String GOING_TO_EXECUTE_COMMIT_ON_CREATE_OUTPUTS = "Going to execute commit on create outputs.";
     private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(OutputsBusinessLogic.class);
-    private static final String FAILED_TO_FOUND_COMPONENT_INSTANCE_OUTPUTS_COMPONENT_INSTANCE_ID = "Failed to found component instance outputs componentInstanceId: {}";
+    private static final String FAILED_TO_FOUND_COMPONENT_INSTANCE_OUTPUTS_COMPONENT_INSTANCE_ID =
+        "Failed to found component instance outputs componentInstanceId: {}";
     private static final String FAILED_TO_FOUND_COMPONENT_INSTANCE_OUTPUTS_ERROR = "Failed to found component instance outputs {}, error: {}";
     private final AttributeDeclarationOrchestrator attributeDeclarationOrchestrator;
 
@@ -126,9 +134,13 @@ public class OutputsBusinessLogic extends BaseBusinessLogic {
         try {
             validateUserExists(userId);
             component = getAndValidateComponentForCreate(userId, componentId, componentType, shouldLockComp);
-            result = attributeDeclarationOrchestrator.declareAttributesToOutputs(component, componentInstOutputsMapUi).left()
-                .bind(outputsToCreate -> prepareOutputsForCreation(userId, componentId, outputsToCreate)).right()
-                .map(componentsUtils::getResponseFormat);
+            ImmutablePair<StorageOperationStatus, String> status = validateOutputName(component, componentInstOutputsMapUi);
+            if (status.getLeft() != StorageOperationStatus.OK) {
+                throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.OUTPUT_NAME_ALREADY_EXIST, status.getRight()));
+            }
+            result = attributeDeclarationOrchestrator.declareAttributesToOutputs(component, componentInstOutputsMapUi)
+                .left().bind(outputsToCreate -> prepareOutputsForCreation(userId, componentId, outputsToCreate))
+                .right().map(componentsUtils::getResponseFormat);
             return result;
         } catch (final ByResponseFormatComponentException e) {
             log.error("#createMultipleOutputs: Exception thrown: ", e);
@@ -151,6 +163,29 @@ public class OutputsBusinessLogic extends BaseBusinessLogic {
         }
     }
 
+    private ImmutablePair<StorageOperationStatus, String> validateOutputName(final Component component,
+                                                                            final ComponentInstOutputsMap componentInstOutputsMapUi) {
+        final Map<String, List<ComponentInstanceAttribOutput>> outputDeclaredProperties = new HashMap<>();
+        if (MapUtils.isNotEmpty(componentInstOutputsMapUi.getComponentInstanceOutputsMap())) {
+            outputDeclaredProperties.putAll(componentInstOutputsMapUi.getComponentInstanceOutputsMap());
+        } else if (MapUtils.isNotEmpty(componentInstOutputsMapUi.getComponentInstanceAttributes())) {
+            outputDeclaredProperties.putAll(componentInstOutputsMapUi.getComponentInstanceAttributes());
+        }
+        if (MapUtils.isNotEmpty(outputDeclaredProperties) && CollectionUtils.isNotEmpty(component.getOutputs())) {
+            for (final List<ComponentInstanceAttribOutput> componentInstancePropOutputs : outputDeclaredProperties.values()) {
+                for (final ComponentInstanceAttribOutput componentInstancePropOutput : componentInstancePropOutputs) {
+                    final Optional<OutputDefinition> outputDefinition = component.getOutputs().stream()
+                        .filter(output -> output.getName().equals(componentInstancePropOutput.getOutputName())
+                            || output.getName().equals(componentInstancePropOutput.getName())).findAny();
+                    if (outputDefinition.isPresent()) {
+                        return new ImmutablePair<>(StorageOperationStatus.INVALID_VALUE, outputDefinition.get().getName());
+                    }
+                }
+            }
+        }
+        return new ImmutablePair<>(StorageOperationStatus.OK, StringUtils.EMPTY);
+    }
+
     private Component getAndValidateComponentForCreate(final String userId, final String componentId,
                                                        final ComponentTypeEnum componentType,
                                                        final boolean shouldLockComp) {
@@ -187,6 +222,7 @@ public class OutputsBusinessLogic extends BaseBusinessLogic {
         componentParametersView.setIgnoreComponentInstances(false);
         componentParametersView.setIgnoreComponentInstancesOutputs(false);
         componentParametersView.setIgnoreComponentInstancesAttributes(false);
+        componentParametersView.setIgnoreComponentInstancesProperties(false);
         componentParametersView.setIgnoreUsers(false);
         return componentParametersView;
     }
@@ -264,7 +300,7 @@ public class OutputsBusinessLogic extends BaseBusinessLogic {
                     final var optionalComponentInstance = component.getComponentInstanceByName(getAttribute.get(0));
                     if (optionalComponentInstance.isPresent()) {
                         final var createdOutputs
-                            = createOutputs(component.getUniqueId(), userId, getAttribute.get(1), optionalComponentInstance.get());
+                            = createOutputs(component.getUniqueId(), userId, getAttribute.get(1), optionalComponentInstance.get(),outputDefinitionValue.getName());
                         if (createdOutputs.isRight()) {
                             return Either.right((createdOutputs.right().value()));
                         }
@@ -282,9 +318,9 @@ public class OutputsBusinessLogic extends BaseBusinessLogic {
 
     private Either<List<OutputDefinition>, ResponseFormat> createOutputs(final String componentUniqueId, final String userId,
                                                                          final String attributeName,
-                                                                         final ComponentInstance componentInstance) {
+                                                                         final ComponentInstance componentInstance,
+                                                                         final String outputName) {
         // From Instance
-        final List<OutputDefinition> result = new ArrayList<>();
         final var componentInstanceAttributes = componentInstance.getAttributes();
         if (CollectionUtils.isNotEmpty(componentInstanceAttributes)) {
             final var componentInstanceAttributeOptional = componentInstanceAttributes.stream()
@@ -292,16 +328,37 @@ public class OutputsBusinessLogic extends BaseBusinessLogic {
             if (componentInstanceAttributeOptional.isPresent()) {
                 final var componentInstOutputsMap = new ComponentInstOutputsMap();
                 componentInstOutputsMap.setComponentInstanceAttributes(Collections.singletonMap(componentInstance.getUniqueId(),
-                    Collections.singletonList(new ComponentInstanceAttribOutput(componentInstanceAttributeOptional.get()))));
-                final var createdOutputs = createMultipleOutputs(userId, componentUniqueId, ComponentTypeEnum.SERVICE,
+                    Collections.singletonList(new ComponentInstanceAttribOutput(componentInstanceAttributeOptional.get(),outputName))));
+                return createMultipleOutputs(userId, componentUniqueId, ComponentTypeEnum.SERVICE,
                     componentInstOutputsMap, true, false);
-                if (createdOutputs.isRight()) {
-                    return Either.right((createdOutputs.right().value()));
-                }
-                result.addAll(createdOutputs.left().value());
             }
         }
-        return Either.left(result);
+        final List<PropertyDefinition> componentInstanceProperties = componentInstance.getProperties();
+        if (CollectionUtils.isNotEmpty(componentInstanceProperties)) {
+            final Optional<PropertyDefinition> componentInstancePropertyOptional = componentInstanceProperties.stream()
+                .filter(prop -> prop.getName().equals(attributeName)).findFirst();
+            if (componentInstancePropertyOptional.isPresent()) {
+                PropertyDefinition propertyDefinition = componentInstancePropertyOptional.get();
+                final ComponentInstOutputsMap componentInstOutputsMap = new ComponentInstOutputsMap();
+                ComponentInstanceAttribOutput attribute = getComponentInstanceAttribOutput(propertyDefinition);
+                componentInstOutputsMap.setComponentInstanceAttributes(Collections.singletonMap(componentInstance.getUniqueId(),
+                    Collections.singletonList(new ComponentInstanceAttribOutput(attribute,outputName))));
+                return createMultipleOutputs(userId, componentUniqueId, ComponentTypeEnum.SERVICE, componentInstOutputsMap, true, false);
+            }
+        }
+        return Either.left(new ArrayList<>());
+    }
+
+    @NotNull
+    private ComponentInstanceAttribOutput getComponentInstanceAttribOutput(PropertyDefinition propertyDefinition) {
+        ComponentInstanceAttribOutput attribute = new ComponentInstanceAttribOutput();
+        attribute.setParentUniqueId(propertyDefinition.getParentUniqueId());
+        attribute.setName(propertyDefinition.getName());
+        attribute.setOwnerId(propertyDefinition.getOwnerId());
+        attribute.setType(propertyDefinition.getType());
+        attribute.setSchema(propertyDefinition.getSchema());
+        attribute.setUniqueId(propertyDefinition.getUniqueId());
+        return attribute;
     }
 
 }