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 java.util.stream.Stream;
13 import org.onap.sdc.workflow.api.types.VersionRequestDto;
14 import org.onap.sdc.workflow.persistence.ArtifactRepository;
15 import org.onap.sdc.workflow.persistence.types.ArtifactEntity;
16 import org.onap.sdc.workflow.persistence.types.VersionStatus;
17 import org.onap.sdc.workflow.persistence.types.WorkflowVersion;
18 import org.onap.sdc.workflow.services.WorkflowVersionManager;
19 import org.onap.sdc.workflow.services.exceptions.CreateVersionException;
20 import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException;
21 import org.onap.sdc.workflow.services.exceptions.InvalidArtifactException;
22 import org.onap.sdc.workflow.services.exceptions.VersionModificationException;
23 import org.onap.sdc.workflow.services.mappers.VersionMapper;
24 import org.openecomp.sdc.versioning.VersioningManager;
25 import org.openecomp.sdc.versioning.dao.types.Version;
26 import org.openecomp.sdc.versioning.types.VersionCreationMethod;
27 import org.springframework.beans.factory.annotation.Autowired;
28 import org.springframework.stereotype.Service;
29 import org.springframework.util.StringUtils;
30 import org.springframework.web.multipart.MultipartFile;
32 @Service("workflowVersionManager")
33 public class WorkflowVersionManagerImpl implements WorkflowVersionManager {
35 private final VersioningManager versioningManager;
36 private final ArtifactRepository artifactRepository;
37 private VersionMapper versionMapper;
41 public WorkflowVersionManagerImpl(VersioningManager versioningManager, ArtifactRepository artifactRepository,
42 VersionMapper versionMapper) {
43 this.versioningManager = versioningManager;
44 this.artifactRepository = artifactRepository;
45 this.versionMapper = versionMapper;
49 public Collection<WorkflowVersion> list(String workflowId) {
51 return versioningManager.list(workflowId).stream()
52 .map(version -> versionMapper.versionToWorkflowVersion(version))
53 .collect(Collectors.toList());
57 public WorkflowVersion get(String workflowId, String versionId) {
59 Version version = new Version(versionId);
61 return this.versionMapper.versionToWorkflowVersion(versioningManager.get(workflowId, version));
62 } catch (Exception e) {
63 throw new EntityNotFoundException(
64 String.format("version with id '%s' does not exist for workflow with id %s", version.getId(),
70 public WorkflowVersion create(String workflowId, VersionRequestDto versionRequest) {
72 List<Version> versions = versioningManager.list(workflowId);
74 if (versionRequest.getBaseVersionId() != null) {
75 Version baseVersion = findVersion(versions, versionRequest.getBaseVersionId()).orElseThrow(
76 () -> new EntityNotFoundException(
77 String.format("version with id '%s' does not exist for workflow with id %s",
78 versionRequest.getBaseVersionId(), workflowId)));
80 if(!Certified.equals(baseVersion.getStatus())){
81 throw new CreateVersionException(workflowId, versionRequest.getBaseVersionId());
85 Version version = new Version();
86 version.setDescription(versionRequest.getDescription());
87 version.setBaseId(versionRequest.getBaseVersionId());
88 Version createdVersion = versioningManager.create(workflowId, version, VersionCreationMethod.major);
90 if (versions.isEmpty()){
91 artifactRepository.createStructure(workflowId, createdVersion.getId());
94 versioningManager.publish(workflowId, createdVersion, "Initial version");
96 return versionMapper.versionToWorkflowVersion(createdVersion);
99 private Optional<Version> findVersion(List<Version> versions, String baseVersionId) {
100 return versions.stream().filter(version -> baseVersionId.equals(version.getId())).findFirst();
104 public void update(String id, WorkflowVersion version) {
106 Version versionToUpdate = mapVersionInfo(id, version);
107 versioningManager.updateVersion(id, versionToUpdate);
108 versioningManager.publish(id, versionToUpdate, "Update version");
113 public void uploadArtifact(String workflowId, WorkflowVersion version, MultipartFile artifact) {
114 WorkflowVersion retrievedVersion = get(workflowId, version.getId());
115 if (VersionStatus.Certified.equals(retrievedVersion.getStatus())) {
116 throw new VersionModificationException(workflowId, version.getId());
119 try (InputStream artifactData = artifact.getInputStream()) {
120 ArtifactEntity artifactEntity =
121 new ArtifactEntity(StringUtils.cleanPath(artifact.getOriginalFilename()), artifactData);
122 artifactRepository.update(workflowId, version.getId(), artifactEntity);
123 versioningManager.publish(workflowId, versionMapper.workflowVersionToVersion(version), "Update Artifact");
125 } catch (IOException e) {
126 throw new InvalidArtifactException(e.getMessage());
131 public ArtifactEntity getArtifact(String workflowId, WorkflowVersion version) {
132 WorkflowVersion retrievedVersion = get(workflowId, version.getId());
133 Optional<ArtifactEntity> artifactOptional = artifactRepository.get(workflowId, retrievedVersion.getId());
134 if (!artifactOptional.isPresent()) {
135 throw new EntityNotFoundException(
136 String.format("Artifact for workflow id %S version id %S was not found", workflowId,
139 return artifactOptional.get();
143 public void deleteArtifact(String workflowId, WorkflowVersion version) {
144 WorkflowVersion retrievedVersion = get(workflowId, version.getId());
145 if (VersionStatus.Certified.equals(retrievedVersion.getStatus())) {
146 throw new VersionModificationException(workflowId, version.getId());
149 artifactRepository.delete(workflowId, version.getId());
152 private boolean isFirstVersionCreation(String id, Version createdVersion) {
153 return Objects.isNull(createdVersion.getBaseId()) && versioningManager.list(id).size() == 1;
156 protected Version mapVersionInfo(String id, WorkflowVersion workflowVersion) {
157 WorkflowVersion retrievedVersion = get(id, workflowVersion.getId());
158 Version version = new Version(workflowVersion.getId());
159 version.setBaseId(retrievedVersion.getBaseId());
160 version.setName(retrievedVersion.getName());