2  * ============LICENSE_START=======================================================
 
   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
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  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=========================================================
 
  21 package org.openecomp.sdc.vendorsoftwareproduct.impl;
 
  23 import org.openecomp.core.util.UniqueValueUtil;
 
  24 import org.openecomp.core.utilities.file.FileUtils;
 
  25 import org.openecomp.sdc.common.errors.CoreException;
 
  26 import org.openecomp.sdc.common.errors.ErrorCategory;
 
  27 import org.openecomp.sdc.common.errors.ErrorCode;
 
  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.ProcessDao;
 
  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.sdc.versioning.errors.VersioningErrorCodes;
 
  45 import java.io.FileOutputStream;
 
  46 import java.io.IOException;
 
  47 import java.io.InputStream;
 
  48 import java.nio.ByteBuffer;
 
  49 import java.util.Collection;
 
  51 public class ProcessManagerImpl implements ProcessManager {
 
  52   private static final String PROCESS_ARTIFACT_NOT_EXIST_MSG =
 
  53       "Process artifact for process with Id %s does not exist for %s with Id %s and version %s";
 
  55   private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
 
  57   private ProcessDao processDao;
 
  59   public ProcessManagerImpl(ProcessDao processDao) {
 
  60     this.processDao = processDao;
 
  64   public Collection<ProcessEntity> listProcesses(String vspId, Version version,
 
  66     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
 
  67     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
 
  69     return processDao.list(new ProcessEntity(vspId, version, componentId, null));
 
  73   public void deleteProcesses(String vspId, Version version, String componentId) {
 
  74     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
 
  76     ProcessEntity allProcesses = new ProcessEntity(vspId, version, componentId, null);
 
  77     Collection<ProcessEntity> processes = processDao.list(allProcesses);
 
  79     if (!processes.isEmpty()) {
 
  80       for (ProcessEntity process : processes) {
 
  81         deleteUniqueValue(process.getVspId(), process.getVersion(), process.getComponentId(),
 
  86     if (componentId == null) {
 
  87       processDao.deleteVspAll(vspId,version);
 
  89       processDao.deleteAll(allProcesses);
 
  92     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
 
  96   public ProcessEntity createProcess(ProcessEntity process) {
 
  97     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", process.getId(),
 
  98         process.getComponentId());
 
  99     validateUniqueName(process.getVspId(), process.getVersion(), process.getComponentId(),
 
 102     processDao.create(process);
 
 103     createUniqueName(process.getVspId(), process.getVersion(), process.getComponentId(),
 
 106     mdcDataDebugMessage.debugExitMessage("VSP id, component id", process.getId(),
 
 107         process.getComponentId());
 
 113   public ProcessEntity getProcess(String vspId, Version version, String componentId,
 
 115     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
 
 117     ProcessEntity retrieved =
 
 118         processDao.get(new ProcessEntity(vspId, version, componentId, processId));
 
 119     validateProcessExistence(vspId, version, componentId, processId, retrieved);
 
 121     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
 
 127   public void updateProcess(ProcessEntity process) {
 
 128     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", process.getId(),
 
 129         process.getComponentId());
 
 131     ProcessEntity retrieved = processDao.get(process);
 
 132     validateProcessExistence(process.getVspId(), process.getVersion(), process.getComponentId(),
 
 133         process.getId(), retrieved);
 
 135     updateUniqueName(process.getVspId(), process.getVersion(), process.getComponentId(),
 
 136         retrieved.getName(), process.getName());
 
 137     processDao.update(process);
 
 139     mdcDataDebugMessage.debugExitMessage("VSP id, component id", process.getId(),
 
 140         process.getComponentId());
 
 144   public void deleteProcess(String vspId, Version version, String componentId, String processId) {
 
 145     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
 
 147     ProcessEntity retrieved = getProcess(vspId, version, componentId, processId);
 
 149     processDao.delete(retrieved);
 
 150     deleteUniqueValue(retrieved.getVspId(), retrieved.getVersion(), retrieved.getComponentId(),
 
 151         retrieved.getName());
 
 153     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
 
 158   public File getProcessArtifact(String vspId, Version version, String componentId,
 
 160     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
 
 162     ProcessEntity retrieved = getValidatedProcessArtifact(vspId, version, componentId, processId);
 
 164     File file = new File(String.format("%s_%s_%s", vspId, componentId, processId));
 
 165     try (FileOutputStream fos = new FileOutputStream(file)) {
 
 166       fos.write(retrieved.getArtifact().array());
 
 167     } catch (IOException exception) {
 
 168       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
 
 169           LoggerTragetServiceName.GET_PROCESS_ARTIFACT, ErrorLevel.ERROR.name(),
 
 170           LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't get process artifact");
 
 171       throw new CoreException(new UploadInvalidErrorBuilder().build());
 
 174     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
 
 180   public void deleteProcessArtifact(String vspId, Version version, String componentId,
 
 182     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
 
 184     ProcessEntity retrieved = getValidatedProcessArtifact(vspId, version, componentId, processId);
 
 186     processDao.deleteArtifact(retrieved);
 
 188     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
 
 192   public void uploadProcessArtifact(InputStream artifactFile, String artifactFileName, String vspId,
 
 193                                     Version version, String componentId, String processId) {
 
 194     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", vspId, componentId);
 
 196     ProcessEntity process = getProcess(vspId, version, componentId, processId);
 
 197     process.setArtifactName(artifactFileName);
 
 198     process.setArtifact(readArtifact(artifactFile));
 
 199     processDao.uploadArtifact(process);
 
 201     mdcDataDebugMessage.debugExitMessage("VSP id, component id", vspId, componentId);
 
 204   private ProcessEntity getValidatedProcessArtifact(String vspId, Version version,
 
 205                                                     String componentId, String processId) {
 
 206     ProcessEntity retrieved =
 
 207         processDao.getArtifact(new ProcessEntity(vspId, version, componentId, processId));
 
 208     validateProcessArtifactExistence(vspId, version, componentId, processId, retrieved);
 
 212   private ByteBuffer readArtifact(InputStream artifactInputStream) {
 
 213     if (artifactInputStream == null) {
 
 214       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
 
 215           LoggerTragetServiceName.UPLOAD_PROCESS_ARTIFACT, ErrorLevel.ERROR.name(),
 
 216           LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't upload process artifact");
 
 217       throw new CoreException(new UploadInvalidErrorBuilder().build());
 
 220       return ByteBuffer.wrap(FileUtils.toByteArray(artifactInputStream));
 
 221     } catch (RuntimeException exception) {
 
 222       MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
 
 223           LoggerTragetServiceName.UPLOAD_PROCESS_ARTIFACT, ErrorLevel.ERROR.name(),
 
 224           LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't upload process artifact");
 
 225       throw new CoreException(new UploadInvalidErrorBuilder().build());
 
 230   private void validateProcessExistence(String vspId, Version version, String componentId,
 
 231                                         String processId, ProcessEntity retrieved) {
 
 232     VersioningUtil.validateEntityExistence(retrieved,
 
 233         new ProcessEntity(vspId, version, componentId, processId),
 
 234         VspDetails.ENTITY_TYPE);
 
 237   private void validateProcessArtifactExistence(String vspId, Version version, String componentId,
 
 238                                                 String processId, ProcessEntity retrieved) {
 
 239     ProcessEntity inputProcess = new ProcessEntity(vspId, version, componentId, processId);
 
 240     VersioningUtil.validateEntityExistence(retrieved, inputProcess, VspDetails.ENTITY_TYPE);
 
 241     if (retrieved.getArtifact() == null) {
 
 242       throw new CoreException(new ErrorCode.ErrorCodeBuilder()
 
 243           .withCategory(ErrorCategory.APPLICATION)
 
 244           .withId(VersioningErrorCodes.VERSIONABLE_SUB_ENTITY_NOT_FOUND)
 
 245           .withMessage(String.format(PROCESS_ARTIFACT_NOT_EXIST_MSG,
 
 246               processId, VspDetails.ENTITY_TYPE, vspId, version)).build());
 
 251   protected void validateUniqueName(String vspId, Version version, String componentId,
 
 252                                     String processName) {
 
 253     UniqueValueUtil.validateUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME,
 
 254         vspId, version.getId(), componentId, processName);
 
 257   protected void createUniqueName(String vspId, Version version, String componentId,
 
 258                                   String processName) {
 
 260         .createUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME, vspId,
 
 261             version.getId(), componentId, processName);
 
 264   protected void updateUniqueName(String vspId, Version version, String componentId,
 
 265                                   String oldProcessName, String newProcessName) {
 
 267         .updateUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME, oldProcessName,
 
 268             newProcessName, vspId, version.getId(), componentId);
 
 271   protected void deleteUniqueValue(String vspId, Version version, String componentId,
 
 272                                    String processName) {
 
 273     if (componentId == null) {
 
 275           .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME, vspId,
 
 276               version.getId(), processName);
 
 279         .deleteUniqueValue(VendorSoftwareProductConstants.UniqueValues.PROCESS_NAME, vspId,
 
 280             version.getId(), componentId, processName);