package org.openecomp.sdc.be.components.merge.instance; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic; import org.openecomp.sdc.be.model.ArtifactDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.ComponentInstance; import org.openecomp.sdc.be.model.Operation; import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; import org.openecomp.sdc.common.api.Constants; import org.openecomp.sdc.exception.ResponseFormat; import org.springframework.beans.factory.annotation.Autowired; import fj.data.Either; /** * Created by chaya on 9/20/2017. */ @org.springframework.stereotype.Component("ComponentInstanceArtifactsMerge") public class ComponentInstanceArtifactsMerge implements ComponentInstanceMergeInterface { @Autowired ToscaOperationFacade toscaOperationFacade; @Autowired ArtifactsBusinessLogic artifactsBusinessLogic; @Override public void saveDataBeforeMerge(DataForMergeHolder dataHolder, Component containerComponent, ComponentInstance currentResourceInstance, Component originComponent) { Map componentInstancesDeploymentArtifacts = currentResourceInstance.safeGetDeploymentArtifacts(); Map originalComponentDeploymentArtifacts = originComponent.getDeploymentArtifacts(); Map deploymentArtifactsCreatedOnTheInstance = componentInstancesDeploymentArtifacts.entrySet() .stream() .filter(i -> !originalComponentDeploymentArtifacts.containsKey(i.getKey())) .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); dataHolder.setOrigComponentDeploymentArtifactsCreatedOnTheInstance(deploymentArtifactsCreatedOnTheInstance); Map componentInstancesInformationalArtifacts = currentResourceInstance.safeGetArtifacts(); Map originalComponentInformationalArtifacts = originComponent.getArtifacts(); Map informationalArtifactsCreatedOnTheInstance = componentInstancesInformationalArtifacts.entrySet() .stream() .filter(i -> !originalComponentInformationalArtifacts.containsKey(i.getKey())) .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); dataHolder.setOrigComponentInformationalArtifactsCreatedOnTheInstance(informationalArtifactsCreatedOnTheInstance); } private void addEsIdToArtifactJson(Map artifactJson, String origEsId) { artifactJson.put(Constants.ARTIFACT_ES_ID, origEsId); } @Override public Either mergeDataAfterCreate(User user, DataForMergeHolder dataHolder, Component updatedContainerComponent, String newInstanceId) { Map origInstanceDeploymentArtifactsCreatedOnTheInstance = dataHolder.getOrigComponentDeploymentArtifactsCreatedOnTheInstance(); Map currentInstanceDeploymentArtifacts = updatedContainerComponent.safeGetComponentInstanceDeploymentArtifacts(newInstanceId); Map filteredDeploymentArtifactsToAdd = Optional.ofNullable(origInstanceDeploymentArtifactsCreatedOnTheInstance).orElse(new HashMap<>()).entrySet().stream() .filter(artifact -> noArtifactWithTheSameLabel(artifact.getValue().getArtifactLabel(), currentInstanceDeploymentArtifacts)) .collect(Collectors.toMap(p -> p.getKey(), q -> q.getValue())); Map origInstanceInformationalArtifactsCreatedOnTheInstance = dataHolder.getOrigComponentInformationalArtifactsCreatedOnTheInstance(); Map currentInstanceInformationalArtifacts = updatedContainerComponent.safeGetComponentInstanceInformationalArtifacts(newInstanceId); Map filteredInformationalArtifactsToAdd = Optional.ofNullable(origInstanceInformationalArtifactsCreatedOnTheInstance).orElse(new HashMap<>()).entrySet().stream() .filter(artifact -> noArtifactWithTheSameLabel(artifact.getValue().getArtifactLabel(), currentInstanceInformationalArtifacts)) .collect(Collectors.toMap(p -> p.getKey(), q -> q.getValue())); Map allFilteredArtifactsToAdd = new HashMap<>(); allFilteredArtifactsToAdd.putAll(filteredDeploymentArtifactsToAdd); allFilteredArtifactsToAdd.putAll(filteredInformationalArtifactsToAdd); for (Map.Entry currentArtifactDefinition : allFilteredArtifactsToAdd.entrySet()) { Map jsonForUpdateArtifact = artifactsBusinessLogic.buildJsonForUpdateArtifact( currentArtifactDefinition.getValue().getUniqueId(), currentArtifactDefinition.getValue().getArtifactName(), currentArtifactDefinition.getValue().getArtifactType(), currentArtifactDefinition.getValue().getArtifactGroupType(), currentArtifactDefinition.getValue().getArtifactLabel(), currentArtifactDefinition.getValue().getArtifactDisplayName(), currentArtifactDefinition.getValue().getDescription(), currentArtifactDefinition.getValue().getPayloadData(), null, currentArtifactDefinition.getValue().getListHeatParameters()); addEsIdToArtifactJson(jsonForUpdateArtifact, currentArtifactDefinition.getValue().getEsId()); Either, ResponseFormat> uploadArtifactToService = artifactsBusinessLogic.updateResourceInstanceArtifactNoContent(newInstanceId, updatedContainerComponent, user, jsonForUpdateArtifact, artifactsBusinessLogic.new ArtifactOperationInfo( false, false, ArtifactsBusinessLogic.ArtifactOperationEnum.LINK), currentArtifactDefinition.getValue()); if (uploadArtifactToService.isRight()) { return Either.right(uploadArtifactToService.right().value()); } toscaOperationFacade.commit(); } return Either.left(updatedContainerComponent); } private boolean noArtifactWithTheSameLabel(String artifactLabel, Map currDeploymentArtifacts) { for (Map.Entry artifact : currDeploymentArtifacts.entrySet()) { if (artifact.getValue().getArtifactLabel().equals(artifactLabel)) { return false; } } return true; } }