99b64c7fe2499f678a7aae7413674506bee731c5
[sdc/sdc-workflow-designer.git] /
1 package org.onap.sdc.workflow.services.impl;
2
3 import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified;
4
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.util.Collection;
8 import java.util.List;
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;
31
32 @Service("workflowVersionManager")
33 public class WorkflowVersionManagerImpl implements WorkflowVersionManager {
34
35     private final VersioningManager versioningManager;
36     private final ArtifactRepository artifactRepository;
37     private VersionMapper versionMapper;
38
39
40     @Autowired
41     public WorkflowVersionManagerImpl(VersioningManager versioningManager, ArtifactRepository artifactRepository,
42             VersionMapper versionMapper) {
43         this.versioningManager = versioningManager;
44         this.artifactRepository = artifactRepository;
45         this.versionMapper = versionMapper;
46     }
47
48     @Override
49     public Collection<WorkflowVersion> list(String workflowId) {
50
51         return versioningManager.list(workflowId).stream()
52                                 .map(version -> versionMapper.versionToWorkflowVersion(version))
53                                 .collect(Collectors.toList());
54     }
55
56     @Override
57     public WorkflowVersion get(String workflowId, String versionId) {
58
59         Version version = new Version(versionId);
60         try {
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(),
65                             workflowId));
66         }
67     }
68
69     @Override
70     public WorkflowVersion create(String workflowId, VersionRequestDto versionRequest) {
71
72         List<Version> versions = versioningManager.list(workflowId);
73
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)));
79
80             if(!Certified.equals(baseVersion.getStatus())){
81                 throw new CreateVersionException(workflowId, versionRequest.getBaseVersionId());
82             }
83         }
84
85         Version version = new Version();
86         version.setDescription(versionRequest.getDescription());
87         version.setBaseId(versionRequest.getBaseVersionId());
88         Version createdVersion = versioningManager.create(workflowId, version, VersionCreationMethod.major);
89
90         if (versions.isEmpty()){
91             artifactRepository.createStructure(workflowId, createdVersion.getId());
92         }
93
94         versioningManager.publish(workflowId, createdVersion, "Initial version");
95
96         return versionMapper.versionToWorkflowVersion(createdVersion);
97     }
98
99     private Optional<Version> findVersion(List<Version> versions, String baseVersionId) {
100         return versions.stream().filter(version -> baseVersionId.equals(version.getId())).findFirst();
101     }
102
103     @Override
104     public void update(String id, WorkflowVersion version) {
105
106         Version versionToUpdate = mapVersionInfo(id, version);
107         versioningManager.updateVersion(id, versionToUpdate);
108         versioningManager.publish(id, versionToUpdate, "Update version");
109     }
110
111
112     @Override
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());
117         }
118
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");
124
125         } catch (IOException e) {
126             throw new InvalidArtifactException(e.getMessage());
127         }
128     }
129
130     @Override
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,
137                             version.getId()));
138         }
139         return artifactOptional.get();
140     }
141
142     @Override
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());
147         }
148
149         artifactRepository.delete(workflowId, version.getId());
150     }
151
152     private boolean isFirstVersionCreation(String id, Version createdVersion) {
153         return Objects.isNull(createdVersion.getBaseId()) && versioningManager.list(id).size() == 1;
154     }
155
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());
161         return version;
162     }
163
164
165 }