1 package org.onap.sdc.workflow.services.impl;
 
   3 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified;
 
   5 import java.io.IOException;
 
   6 import java.io.InputStream;
 
   7 import java.util.Collection;
 
   9 import java.util.Objects;
 
  10 import java.util.Optional;
 
  11 import java.util.stream.Collectors;
 
  12 import org.onap.sdc.workflow.api.types.VersionRequestDto;
 
  13 import org.onap.sdc.workflow.persistence.ArtifactRepository;
 
  14 import org.onap.sdc.workflow.persistence.types.ArtifactEntity;
 
  15 import org.onap.sdc.workflow.persistence.types.WorkflowVersionStatus;
 
  16 import org.onap.sdc.workflow.persistence.types.WorkflowVersion;
 
  17 import org.onap.sdc.workflow.services.WorkflowVersionManager;
 
  18 import org.onap.sdc.workflow.services.exceptions.CreateVersionException;
 
  19 import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException;
 
  20 import org.onap.sdc.workflow.services.exceptions.InvalidArtifactException;
 
  21 import org.onap.sdc.workflow.services.exceptions.VersionModificationException;
 
  22 import org.onap.sdc.workflow.services.impl.mappers.VersionMapper;
 
  23 import org.openecomp.sdc.versioning.VersioningManager;
 
  24 import org.openecomp.sdc.versioning.dao.types.Version;
 
  25 import org.openecomp.sdc.versioning.types.VersionCreationMethod;
 
  26 import org.springframework.beans.factory.annotation.Autowired;
 
  27 import org.springframework.stereotype.Service;
 
  28 import org.springframework.util.StringUtils;
 
  29 import org.springframework.web.multipart.MultipartFile;
 
  31 @Service("workflowVersionManager")
 
  32 public class WorkflowVersionManagerImpl implements WorkflowVersionManager {
 
  34     private final VersioningManager versioningManager;
 
  35     private final ArtifactRepository artifactRepository;
 
  36     private VersionMapper versionMapper;
 
  40     public WorkflowVersionManagerImpl(VersioningManager versioningManager, ArtifactRepository artifactRepository,
 
  41             VersionMapper versionMapper) {
 
  42         this.versioningManager = versioningManager;
 
  43         this.artifactRepository = artifactRepository;
 
  44         this.versionMapper = versionMapper;
 
  48     public Collection<WorkflowVersion> list(String workflowId) {
 
  50         return versioningManager.list(workflowId).stream()
 
  51                                 .map(version -> versionMapper.versionToWorkflowVersion(version))
 
  52                                 .collect(Collectors.toList());
 
  56     public WorkflowVersion get(String workflowId, String versionId) {
 
  58         Version version = new Version(versionId);
 
  60             return this.versionMapper.versionToWorkflowVersion(versioningManager.get(workflowId, version));
 
  61         } catch (Exception e) {
 
  62             throw new EntityNotFoundException(
 
  63                     String.format("version with id '%s' does not exist for workflow with id %s", version.getId(),
 
  69     public WorkflowVersion create(String workflowId, VersionRequestDto versionRequest) {
 
  71         List<Version> versions = versioningManager.list(workflowId);
 
  73         if (versionRequest.getBaseVersionId() != null) {
 
  74             Version baseVersion = findVersion(versions, versionRequest.getBaseVersionId()).orElseThrow(
 
  75                     () -> new EntityNotFoundException(
 
  76                             String.format("version with id '%s' does not exist for workflow with id %s",
 
  77                                     versionRequest.getBaseVersionId(), workflowId)));
 
  79             if(!Certified.equals(baseVersion.getStatus())){
 
  80                 throw new CreateVersionException(workflowId, versionRequest.getBaseVersionId());
 
  84         Version version = new Version();
 
  85         version.setDescription(versionRequest.getDescription());
 
  86         version.setBaseId(versionRequest.getBaseVersionId());
 
  87         Version createdVersion = versioningManager.create(workflowId, version, VersionCreationMethod.major);
 
  89         if (versions.isEmpty()){
 
  90             artifactRepository.createStructure(workflowId, createdVersion.getId());
 
  93         versioningManager.publish(workflowId, createdVersion, "Initial version");
 
  95         return versionMapper.versionToWorkflowVersion(createdVersion);
 
  98     private Optional<Version> findVersion(List<Version> versions, String baseVersionId) {
 
  99         return versions.stream().filter(version -> baseVersionId.equals(version.getId())).findFirst();
 
 103     public void update(String id, WorkflowVersion version) {
 
 105         Version versionToUpdate = mapVersionInfo(id, version);
 
 106         versioningManager.updateVersion(id, versionToUpdate);
 
 107         versioningManager.publish(id, versionToUpdate, "Update version");
 
 112     public void uploadArtifact(String workflowId, WorkflowVersion version, MultipartFile artifact) {
 
 113         WorkflowVersion retrievedVersion = get(workflowId, version.getId());
 
 114         if (WorkflowVersionStatus.CERTIFIED.equals(retrievedVersion.getStatus())) {
 
 115             throw new VersionModificationException(workflowId, version.getId());
 
 118         try (InputStream artifactData = artifact.getInputStream()) {
 
 119             ArtifactEntity artifactEntity =
 
 120                     new ArtifactEntity(StringUtils.cleanPath(artifact.getOriginalFilename()), artifactData);
 
 121             artifactRepository.update(workflowId, version.getId(), artifactEntity);
 
 122             versioningManager.publish(workflowId, versionMapper.workflowVersionToVersion(version), "Update Artifact");
 
 124         } catch (IOException e) {
 
 125             throw new InvalidArtifactException(e.getMessage());
 
 130     public ArtifactEntity getArtifact(String workflowId, WorkflowVersion version) {
 
 131         WorkflowVersion retrievedVersion = get(workflowId, version.getId());
 
 132         Optional<ArtifactEntity> artifactOptional = artifactRepository.get(workflowId, retrievedVersion.getId());
 
 133         if (!artifactOptional.isPresent()) {
 
 134             throw new EntityNotFoundException(
 
 135                     String.format("Artifact for workflow id %S version id %S was not found", workflowId,
 
 138         return artifactOptional.get();
 
 142     public void deleteArtifact(String workflowId, WorkflowVersion version) {
 
 143         WorkflowVersion retrievedVersion = get(workflowId, version.getId());
 
 144         if (WorkflowVersionStatus.CERTIFIED.equals(retrievedVersion.getStatus())) {
 
 145             throw new VersionModificationException(workflowId, version.getId());
 
 148         artifactRepository.delete(workflowId, version.getId());
 
 151     private boolean isFirstVersionCreation(String id, Version createdVersion) {
 
 152         return Objects.isNull(createdVersion.getBaseId()) && versioningManager.list(id).size() == 1;
 
 155     protected Version mapVersionInfo(String id, WorkflowVersion workflowVersion) {
 
 156         WorkflowVersion retrievedVersion = get(id, workflowVersion.getId());
 
 157         Version version = new Version(workflowVersion.getId());
 
 158         version.setBaseId(retrievedVersion.getBaseId());
 
 159         version.setName(retrievedVersion.getName());