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