2  * Copyright © 2016-2018 European Support Limited
 
   4  * Licensed under the Apache License, Version 2.0 (the "License");
 
   5  * you may not use this file except in compliance with the License.
 
   6  * You may obtain a copy of the License at
 
   8  *      http://www.apache.org/licenses/LICENSE-2.0
 
  10  * Unless required by applicable law or agreed to in writing, software
 
  11  * distributed under the License is distributed on an "AS IS" BASIS,
 
  12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  13  * See the License for the specific language governing permissions and
 
  14  * limitations under the License.
 
  15  * ============LICENSE_END=========================================================
 
  16  * Modifications copyright (c) 2019 Nokia
 
  17  * ================================================================================
 
  20 package org.openecomp.sdcrests.vsp.rest.services;
 
  22 import static org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder.getErrorWithParameters;
 
  24 import java.io.IOException;
 
  25 import java.util.ArrayList;
 
  26 import java.util.Collections;
 
  27 import java.util.HashMap;
 
  28 import java.util.List;
 
  30 import java.util.Optional;
 
  31 import javax.activation.DataHandler;
 
  32 import javax.inject.Named;
 
  33 import javax.ws.rs.core.Response;
 
  34 import org.apache.commons.lang3.tuple.Pair;
 
  35 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 
  36 import org.openecomp.sdc.activitylog.ActivityLogManager;
 
  37 import org.openecomp.sdc.activitylog.ActivityLogManagerFactory;
 
  38 import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity;
 
  39 import org.openecomp.sdc.activitylog.dao.type.ActivityType;
 
  40 import org.openecomp.sdc.common.errors.Messages;
 
  41 import org.openecomp.sdc.common.utils.SdcCommon;
 
  42 import org.openecomp.sdc.datatypes.error.ErrorLevel;
 
  43 import org.openecomp.sdc.datatypes.error.ErrorMessage;
 
  44 import org.openecomp.sdc.logging.api.Logger;
 
  45 import org.openecomp.sdc.logging.api.LoggerFactory;
 
  46 import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManager;
 
  47 import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManagerFactory;
 
  48 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
 
  49 import org.openecomp.sdc.vendorsoftwareproduct.VspManagerFactory;
 
  50 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
 
  51 import org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding.OnboardingPackageProcessor;
 
  52 import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardPackageInfo;
 
  53 import org.openecomp.sdc.vendorsoftwareproduct.types.OrchestrationTemplateActionResponse;
 
  54 import org.openecomp.sdc.vendorsoftwareproduct.types.UploadFileResponse;
 
  55 import org.openecomp.sdc.vendorsoftwareproduct.types.ValidationResponse;
 
  56 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.FilesDataStructure;
 
  57 import org.openecomp.sdc.versioning.dao.types.Version;
 
  58 import org.openecomp.sdcrests.vendorsoftwareproducts.types.FileDataStructureDto;
 
  59 import org.openecomp.sdcrests.vendorsoftwareproducts.types.OrchestrationTemplateActionResponseDto;
 
  60 import org.openecomp.sdcrests.vendorsoftwareproducts.types.UploadFileResponseDto;
 
  61 import org.openecomp.sdcrests.vendorsoftwareproducts.types.ValidationResponseDto;
 
  62 import org.openecomp.sdcrests.vsp.rest.OrchestrationTemplateCandidate;
 
  63 import org.openecomp.sdcrests.vsp.rest.mapping.MapFilesDataStructureToDto;
 
  64 import org.openecomp.sdcrests.vsp.rest.mapping.MapUploadFileResponseToUploadFileResponseDto;
 
  65 import org.openecomp.sdcrests.vsp.rest.mapping.MapValidationResponseToDto;
 
  66 import org.springframework.context.annotation.Scope;
 
  67 import org.springframework.stereotype.Service;
 
  70 @Service("orchestrationTemplateCandidate")
 
  71 @Scope(value = "prototype")
 
  72 public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplateCandidate {
 
  73   private static final Logger LOGGER =
 
  74       LoggerFactory.getLogger(OrchestrationTemplateCandidateImpl.class);
 
  75   private OrchestrationTemplateCandidateManager candidateManager =
 
  76       OrchestrationTemplateCandidateManagerFactory.getInstance().createInterface();
 
  77   private VendorSoftwareProductManager vendorSoftwareProductManager = VspManagerFactory
 
  78       .getInstance().createInterface();
 
  79   private ActivityLogManager activityLogManager =
 
  80           ActivityLogManagerFactory.getInstance().createInterface();
 
  83   public Response upload(final String vspId, final String versionId,
 
  84                          final Attachment fileToUpload, final String user) {
 
  85     final byte[] fileToUploadBytes = fileToUpload.getObject(byte[].class);
 
  86     final DataHandler dataHandler = fileToUpload.getDataHandler();
 
  87     final String filename = dataHandler.getName();
 
  89     final OnboardingPackageProcessor onboardingPackageProcessor = new OnboardingPackageProcessor(filename, fileToUploadBytes);
 
  90     if (onboardingPackageProcessor.hasErrors()) {
 
  91       final UploadFileResponseDto uploadFileResponseDto =
 
  92           buildUploadResponseWithError(onboardingPackageProcessor.getErrorMessageSet().toArray(new ErrorMessage[0]));
 
  93       return Response.ok(uploadFileResponseDto).build();
 
  96     final OnboardPackageInfo onboardPackageInfo = onboardingPackageProcessor.getOnboardPackageInfo().orElse(null);
 
  98     if (onboardPackageInfo == null) {
 
  99       final UploadFileResponseDto uploadFileResponseDto = buildUploadResponseWithError(
 
 100           new ErrorMessage(ErrorLevel.ERROR, Messages.PACKAGE_PROCESS_ERROR.formatMessage(filename)));
 
 101       return Response.ok(uploadFileResponseDto).build();
 
 104     final VspDetails vspDetails = new VspDetails(vspId, new Version(versionId));
 
 105     return processOnboardPackage(onboardPackageInfo, vspDetails);
 
 108     private Response processOnboardPackage(final OnboardPackageInfo onboardPackageInfo, final VspDetails vspDetails) {
 
 109         final UploadFileResponse uploadFileResponse = candidateManager.upload(vspDetails, onboardPackageInfo);
 
 110         final UploadFileResponseDto uploadFileResponseDto = new MapUploadFileResponseToUploadFileResponseDto()
 
 111             .applyMapping(uploadFileResponse, UploadFileResponseDto.class);
 
 112         return Response.ok(uploadFileResponseDto).build();
 
 115   private UploadFileResponseDto buildUploadResponseWithError(final ErrorMessage... errorMessages) {
 
 116     final UploadFileResponseDto uploadFileResponseDto = new UploadFileResponseDto();
 
 117     final Map<String, List<ErrorMessage>> errorMap = new HashMap<>();
 
 118     final List<ErrorMessage> errorMessageList = new ArrayList<>();
 
 119     Collections.addAll(errorMessageList, errorMessages);
 
 120     errorMap.put(SdcCommon.UPLOAD_FILE, errorMessageList);
 
 121     uploadFileResponseDto.setErrors(errorMap);
 
 122     return uploadFileResponseDto;
 
 126   public Response get(String vspId, String versionId, String user) throws IOException {
 
 127     Optional<Pair<String, byte[]>> zipFile = candidateManager.get(vspId, new Version(versionId));
 
 129     if (zipFile.isPresent()) {
 
 130       fileName = "Candidate." + zipFile.get().getLeft();
 
 132       zipFile = vendorSoftwareProductManager.get(vspId, new Version((versionId)));
 
 134       if (!zipFile.isPresent()) {
 
 135         ErrorMessage errorMessage = new ErrorMessage(ErrorLevel.ERROR,
 
 136             getErrorWithParameters(
 
 137                 Messages.NO_FILE_WAS_UPLOADED_OR_FILE_NOT_EXIST.getErrorMessage(),
 
 139         LOGGER.error(errorMessage.getMessage());
 
 140         return Response.status(Response.Status.NOT_FOUND).build();
 
 142       fileName = "Processed." + zipFile.get().getLeft();
 
 144     Response.ResponseBuilder response = Response.ok(zipFile.get().getRight());
 
 145     response.header("Content-Disposition", "attachment; filename=" + fileName);
 
 146     return response.build();
 
 150   public Response abort(String vspId, String versionId) {
 
 151     candidateManager.abort(vspId, new Version(versionId));
 
 152     return Response.ok().build();
 
 156   public Response process(String vspId, String versionId, String user) {
 
 158     Version version = new Version(versionId);
 
 159     OrchestrationTemplateActionResponse response = candidateManager.process(vspId, version);
 
 161     activityLogManager.logActivity(new ActivityLogEntity(vspId, version,
 
 162             ActivityType.Upload_Network_Package, user, true, "", ""));
 
 164     OrchestrationTemplateActionResponseDto responseDto = copyOrchestrationTemplateActionResponseToDto(response);
 
 166     return Response.ok(responseDto).build();
 
 170   public Response updateFilesDataStructure(
 
 171       String vspId, String versionId, FileDataStructureDto fileDataStructureDto, String user) {
 
 173     FilesDataStructure fileDataStructure = copyFilesDataStructureDtoToFilesDataStructure(fileDataStructureDto);
 
 175     ValidationResponse response = candidateManager
 
 176         .updateFilesDataStructure(vspId, new Version(versionId), fileDataStructure);
 
 178     if (!response.isValid()) {
 
 179       return Response.status(Response.Status.EXPECTATION_FAILED).entity(
 
 180           new MapValidationResponseToDto()
 
 181               .applyMapping(response, ValidationResponseDto.class)).build();
 
 183     return Response.ok(fileDataStructureDto).build();
 
 187   public Response getFilesDataStructure(String vspId, String versionId, String user) {
 
 188     Optional<FilesDataStructure> filesDataStructure =
 
 189         candidateManager.getFilesDataStructure(vspId, new Version(versionId));
 
 190     if (!filesDataStructure.isPresent()) {
 
 191       filesDataStructure = vendorSoftwareProductManager.getOrchestrationTemplateStructure(vspId,
 
 192           new Version(versionId));
 
 195     FileDataStructureDto fileDataStructureDto =
 
 196         filesDataStructure.map(dataStructure -> new MapFilesDataStructureToDto()
 
 197             .applyMapping(dataStructure, FileDataStructureDto.class))
 
 198             .orElse(new FileDataStructureDto());
 
 199     return Response.ok(fileDataStructureDto).build();
 
 202   private OrchestrationTemplateActionResponseDto copyOrchestrationTemplateActionResponseToDto(OrchestrationTemplateActionResponse response){
 
 203     OrchestrationTemplateActionResponseDto result = new OrchestrationTemplateActionResponseDto();
 
 204     result.setErrors(response.getErrors());
 
 205     result.setFileNames(response.getFileNames());
 
 206     result.setStatus(response.getStatus());
 
 210   private FilesDataStructure copyFilesDataStructureDtoToFilesDataStructure(FileDataStructureDto fileDataStructureDto){
 
 211     FilesDataStructure filesDataStructure = new FilesDataStructure();
 
 212     filesDataStructure.setArtifacts(fileDataStructureDto.getArtifacts());
 
 213     filesDataStructure.setModules(fileDataStructureDto.getModules());
 
 214     filesDataStructure.setNested(fileDataStructureDto.getNested());
 
 215     filesDataStructure.setUnassigned(fileDataStructureDto.getUnassigned());
 
 216     return filesDataStructure;