4fa67ff2d3b517861f1ef7c46e099479f06675fc
[sdc.git] / openecomp-be / backend / openecomp-sdc-vendor-software-product-manager / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / impl / ProcessManagerImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.vendorsoftwareproduct.impl;
22
23 import org.openecomp.core.util.UniqueValueUtil;
24 import org.openecomp.core.utilities.file.FileUtils;
25 import org.openecomp.sdc.activityLog.ActivityLogManager;
26 import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity;
27 import org.openecomp.sdc.common.errors.CoreException;
28 import org.openecomp.sdc.datatypes.error.ErrorLevel;
29 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
30 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
31 import org.openecomp.sdc.logging.types.LoggerConstants;
32 import org.openecomp.sdc.logging.types.LoggerErrorCode;
33 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
34 import org.openecomp.sdc.vendorsoftwareproduct.ProcessManager;
35 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
36 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductDao;
37 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ProcessEntity;
38 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
39 import org.openecomp.sdc.vendorsoftwareproduct.errors.UploadInvalidErrorBuilder;
40 import org.openecomp.sdc.versioning.VersioningUtil;
41 import org.openecomp.sdc.versioning.dao.types.Version;
42 import org.openecomp.sdcrests.activitylog.types.ActivityType;
43
44 import java.io.File;
45 import java.io.FileOutputStream;
46 import java.io.IOException;
47 import java.io.InputStream;
48 import java.util.Collection;
49
50 public class ProcessManagerImpl implements ProcessManager {
51   private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
52   private ActivityLogManager activityLogManager;
53
54   private VendorSoftwareProductDao vendorSoftwareProductDao;
55
56   public ProcessManagerImpl(VendorSoftwareProductDao vendorSoftwareProductDao, ActivityLogManager activityLogManager) {
57     this.vendorSoftwareProductDao = vendorSoftwareProductDao;
58     this.activityLogManager = activityLogManager;
59   }
60
61   @Override
62   public Collection<ProcessEntity> listProcesses(String vspId, Version version,
63                                                  String componentId,
64                                                  String user) {
65     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
66     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
67
68     return vendorSoftwareProductDao.listProcesses(vspId, version, componentId);
69   }
70
71   @Override
72   public void deleteProcesses(String vspId, Version version, String componentId, String user) {
73     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
74
75     Collection<ProcessEntity> processes =
76         vendorSoftwareProductDao.listProcesses(vspId, version, componentId);
77
78     if (!processes.isEmpty()) {
79       for (ProcessEntity process : processes) {
80         deleteUniqueValue(process.getVspId(), process.getVersion(), process.getComponentId(),
81             process.getName());
82       }
83
84       vendorSoftwareProductDao.deleteProcesses(vspId, version, componentId);
85     }
86     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
87   }
88
89   @Override
90   public ProcessEntity createProcess(ProcessEntity process, String user) {
91     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", process.getId(),
92         process.getComponentId());
93     validateUniqueName(process.getVspId(), process.getVersion(), process.getComponentId(),
94         process.getName());
95     //process.setId(CommonMethods.nextUuId());
96
97     vendorSoftwareProductDao.createProcess(process);
98     createUniqueName(process.getVspId(), process.getVersion(), process.getComponentId(),
99         process.getName());
100
101     mdcDataDebugMessage.debugExitMessage("VSP id, component id", process.getId(),
102         process.getComponentId());
103
104     return process;
105   }
106
107
108   @Override
109   public ProcessEntity getProcess(String vspId, Version version, String componentId,
110                                   String processId, String user) {
111     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
112
113     ProcessEntity retrieved =
114         vendorSoftwareProductDao.getProcess(vspId, version, componentId, processId);
115     validateProcessExistence(vspId, version, componentId, processId, retrieved);
116
117     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
118
119     return retrieved;
120   }
121
122   @Override
123   public void updateProcess(ProcessEntity process, String user) {
124     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", process.getId(),
125         process.getComponentId());
126
127     ProcessEntity retrieved = vendorSoftwareProductDao
128         .getProcess(process.getVspId(), process.getVersion(), process.getComponentId(),
129             process.getId());
130     validateProcessExistence(process.getVspId(), process.getVersion(), process.getComponentId(),
131         process.getId(), retrieved);
132
133     updateUniqueName(process.getVspId(), process.getVersion(), process.getComponentId(),
134         retrieved.getName(), process.getName());
135     vendorSoftwareProductDao.updateProcess(process);
136
137     mdcDataDebugMessage.debugExitMessage("VSP id, component id", process.getId(),
138         process.getComponentId());
139   }
140
141   @Override
142   public void deleteProcess(String vspId, Version version, String componentId, String processId,
143                             String user) {
144     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
145
146     ProcessEntity retrieved =
147         vendorSoftwareProductDao.getProcess(vspId, version, componentId, processId);
148     validateProcessExistence(vspId, version, componentId, processId, retrieved);
149
150     vendorSoftwareProductDao.deleteProcess(vspId, version, componentId, processId);
151     deleteUniqueValue(retrieved.getVspId(), retrieved.getVersion(), retrieved.getComponentId(),
152         retrieved.getName());
153
154     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
155   }
156
157
158   @Override
159   public File getProcessArtifact(String vspId, Version version, String componentId,
160                                  String processId, String user) {
161     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
162
163     ProcessEntity retrieved =
164         vendorSoftwareProductDao.getProcessArtifact(vspId, version, componentId, processId);
165     validateProcessArtifactExistence(vspId, version, componentId, processId, retrieved);
166
167     File file = new File(String.format("%s_%s_%s", vspId, componentId, processId));
168     try {
169       FileOutputStream fos = new FileOutputStream(file);
170       fos.write(retrieved.getArtifact().array());
171       fos.close();
172     } catch (IOException exception) {
173       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
174           LoggerTragetServiceName.GET_PROCESS_ARTIFACT, ErrorLevel.ERROR.name(),
175           LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't get process artifact");
176       throw new CoreException(new UploadInvalidErrorBuilder().build());
177     }
178
179     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
180
181     return file;
182   }
183
184   @Override
185   public void deleteProcessArtifact(String vspId, Version version, String componentId,
186                                     String processId, String user) {
187     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
188
189     ProcessEntity retrieved =
190         vendorSoftwareProductDao.getProcessArtifact(vspId, version, componentId, processId);
191     validateProcessArtifactExistence(vspId, version, componentId, processId, retrieved);
192
193     vendorSoftwareProductDao.deleteProcessArtifact(vspId, version, componentId, processId);
194
195     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
196   }
197
198   @Override
199   public void uploadProcessArtifact(InputStream artifactFile, String artifactFileName, String vspId,
200                                     Version version, String componentId, String processId,
201                                     String user) {
202     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
203
204     ProcessEntity retrieved =
205         vendorSoftwareProductDao.getProcess(vspId, version, componentId, processId);
206     validateProcessExistence(vspId, version, componentId, processId, retrieved);
207
208     if (artifactFile == null) {
209       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
210           LoggerTragetServiceName.UPLOAD_PROCESS_ARTIFACT, ErrorLevel.ERROR.name(),
211           LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't upload process artifact");
212       throw new CoreException(new UploadInvalidErrorBuilder().build());
213     }
214
215     byte[] artifact;
216     try {
217       artifact = FileUtils.toByteArray(artifactFile);
218     } catch (RuntimeException exception) {
219       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
220           LoggerTragetServiceName.UPLOAD_PROCESS_ARTIFACT, ErrorLevel.ERROR.name(),
221           LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't upload process artifact");
222       throw new CoreException(new UploadInvalidErrorBuilder().build());
223     }
224
225     vendorSoftwareProductDao.uploadProcessArtifact(vspId, version, componentId, processId, artifact,
226             artifactFileName);
227     ActivityLogEntity activityLogEntity = new ActivityLogEntity(vspId, String.valueOf(version.getMajor()+1),
228             ActivityType.UPLOAD_ARTIFACT.toString(), user, true, "", "");
229     activityLogManager.addActionLog(activityLogEntity, user);
230
231     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
232   }
233
234
235   private void validateProcessExistence(String vspId, Version version, String componentId,
236                                         String processId, ProcessEntity retrieved) {
237     mdcDataDebugMessage.debugEntryMessage("VSP id, component id, process id", vspId, componentId,
238         processId);
239
240     if (retrieved != null) {
241       return;
242     }
243     VersioningUtil.validateEntityExistence(retrieved,
244         new ProcessEntity(vspId, version, componentId, processId),
245         VspDetails.ENTITY_TYPE);//todo retrieved is always null ??
246
247     mdcDataDebugMessage.debugExitMessage("VSP id, component id, process id", vspId, componentId,
248         processId);
249   }
250
251   private void validateProcessArtifactExistence(String vspId, Version version, String componentId,
252                                                 String processId, ProcessEntity retrieved) {
253     mdcDataDebugMessage.debugEntryMessage("VSP id, component id, process id", vspId, componentId,
254         processId);
255
256     if (retrieved != null) {
257       VersioningUtil.validateEntityExistence(retrieved.getArtifact(),
258           new ProcessEntity(vspId, version, componentId, processId),
259           VspDetails.ENTITY_TYPE);
260     } else {
261       VersioningUtil.validateEntityExistence(retrieved,
262           new ProcessEntity(vspId, version, componentId, processId),
263           VspDetails.ENTITY_TYPE); //todo retrieved is always null ??
264     }
265
266     mdcDataDebugMessage.debugExitMessage("VSP id, component id, process id", vspId, componentId,
267         processId);
268   }
269
270
271   protected void validateUniqueName(String vspId, Version version, String componentId,
272                                     String processName) {
273     UniqueValueUtil.validateUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME,
274         vspId, version.toString(), componentId, processName);
275   }
276
277   protected void createUniqueName(String vspId, Version version, String componentId,
278                                   String processName) {
279     UniqueValueUtil
280         .createUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME, vspId,
281             version.toString(), componentId, processName);
282   }
283
284   protected void updateUniqueName(String vspId, Version version, String componentId,
285                                   String oldProcessName, String newProcessName) {
286     UniqueValueUtil
287         .updateUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME, oldProcessName,
288             newProcessName, vspId, version.toString(), componentId);
289   }
290
291   protected void deleteUniqueValue(String vspId, Version version, String componentId,
292                                    String processName) {
293     UniqueValueUtil
294         .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME, vspId,
295             version.toString(), componentId, processName);
296   }
297 }