From 72f068bbb4548561c95d46a7f0d28d762ed5dfc5 Mon Sep 17 00:00:00 2001 From: siarhei_hrabko Date: Tue, 21 Nov 2023 13:56:17 +0300 Subject: [PATCH 1/2] EPMRPP-87421 fixed attachments handling --- .../core/log/impl/CreateLogHandlerImpl.java | 26 ++++++++++++------- .../ta/reportportal/util/ControllerUtils.java | 16 +++++++----- .../ws/controller/LogAsyncController.java | 4 +-- .../ws/controller/LogController.java | 3 ++- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java index a56f547cf3..f99dacb82a 100644 --- a/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java @@ -41,6 +41,8 @@ import java.time.ZoneOffset; import java.util.concurrent.CompletableFuture; import javax.annotation.Nonnull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; @@ -60,6 +62,8 @@ @Transactional public class CreateLogHandlerImpl implements CreateLogHandler { + private final Logger LOGGER = LoggerFactory.getLogger(CreateLogHandlerImpl.class); + @Autowired TestItemRepository testItemRepository; @@ -103,15 +107,19 @@ public EntryCreatedAsyncRS createLog(@Nonnull SaveLogRQ request, MultipartFile f final LogFull logFull = logFullBuilder.get(); final Log log = LOG_FULL_TO_LOG.apply(logFull); - CompletableFuture saveLogFuture = - CompletableFuture.supplyAsync(() -> logRepository.saveAndFlush(log)); - logFull.setId(log.getId()); - logService.saveLogMessage(logFull, launch.getId()); - - if (file != null) { - saveLogFuture.thenAcceptAsync( - savedLog -> saveBinaryData(file, launch, savedLog), taskExecutor); - } + CompletableFuture.supplyAsync(() -> logRepository.saveAndFlush(log)) + .thenAcceptAsync(savedLog -> { + logFull.setId(savedLog.getId()); + logService.saveLogMessage(logFull, launch.getId()); + if (file != null) { + saveBinaryData(file, launch, savedLog); + } + }, taskExecutor) + .exceptionally(e -> { + LOGGER.error("Failed to save log with attachments", e); + return null; + } + ); return new EntryCreatedAsyncRS(log.getUuid()); } diff --git a/src/main/java/com/epam/ta/reportportal/util/ControllerUtils.java b/src/main/java/com/epam/ta/reportportal/util/ControllerUtils.java index 4e3a260683..3c0f441574 100644 --- a/src/main/java/com/epam/ta/reportportal/util/ControllerUtils.java +++ b/src/main/java/com/epam/ta/reportportal/util/ControllerUtils.java @@ -19,15 +19,15 @@ import com.epam.ta.reportportal.exception.ReportPortalException; import com.epam.ta.reportportal.ws.model.ErrorType; import com.epam.ta.reportportal.ws.model.log.SaveLogRQ; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.Path; import javax.validation.Validator; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; import org.springframework.util.MultiValueMap; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; @@ -44,10 +44,14 @@ public class ControllerUtils { * @param files Files map * @return Found file */ - public static MultipartFile findByFileName(String filename, Map files) { + public static MultipartFile findByFileName(String filename, MultiValuedMap files) { /* Request part name? */ if (files.containsKey(filename)) { - return files.get(filename); + var multipartFile = files.get(filename).stream() + .findFirst() + .get(); + files.get(filename).remove(multipartFile); + return multipartFile; } /* Filename? */ for (MultipartFile file : files.values()) { @@ -93,8 +97,8 @@ public static void validateSaveRQ(Validator validator, SaveLogRQ saveLogRQ) { } } - public static Map getUploadedFiles(HttpServletRequest request) { - Map uploadedFiles = new HashMap<>(); + public static MultiValuedMap getUploadedFiles(HttpServletRequest request) { + MultiValuedMap uploadedFiles = new ArrayListValuedHashMap<>(); if (request instanceof MultipartHttpServletRequest) { MultiValueMap multiFileMap = (((MultipartHttpServletRequest) request)).getMultiFileMap(); for (List multipartFiles : multiFileMap.values()) { diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java index 9f21a20483..980ac468fa 100644 --- a/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java +++ b/src/main/java/com/epam/ta/reportportal/ws/controller/LogAsyncController.java @@ -37,9 +37,9 @@ import com.epam.ta.reportportal.ws.model.ErrorType; import com.epam.ta.reportportal.ws.model.log.SaveLogRQ; import io.swagger.annotations.ApiOperation; -import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Validator; +import org.apache.commons.collections4.MultiValuedMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -127,7 +127,7 @@ public ResponseEntity createLog(@PathVariable String proje * Since this is multipart request we can retrieve list of uploaded * attachments */ - Map uploadedFiles = getUploadedFiles(request); + MultiValuedMap uploadedFiles = getUploadedFiles(request); BatchSaveOperatingRS response = new BatchSaveOperatingRS(); EntryCreatedAsyncRS responseItem; /* Go through all provided save log request items */ diff --git a/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java b/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java index f011c3fed2..c55898dc0d 100644 --- a/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java +++ b/src/main/java/com/epam/ta/reportportal/ws/controller/LogController.java @@ -60,6 +60,7 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Validator; +import org.apache.commons.collections4.MultiValuedMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -158,7 +159,7 @@ public ResponseEntity createLog(@PathVariable String proje * Since this is multipart request we can retrieve list of uploaded * attachments */ - Map uploadedFiles = getUploadedFiles(request); + MultiValuedMap uploadedFiles = getUploadedFiles(request); BatchSaveOperatingRS response = new BatchSaveOperatingRS(); EntryCreatedAsyncRS responseItem; /* Go through all provided save log request items */ From ce1500500ba44afedf777ab86ff47443140306d1 Mon Sep 17 00:00:00 2001 From: siarhei_hrabko Date: Tue, 21 Nov 2023 14:06:27 +0300 Subject: [PATCH 2/2] EPMRPP-87421 fixed attachments handling --- .../ta/reportportal/core/log/impl/CreateLogHandlerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java b/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java index f99dacb82a..8b2817ca35 100644 --- a/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java +++ b/src/main/java/com/epam/ta/reportportal/core/log/impl/CreateLogHandlerImpl.java @@ -62,7 +62,7 @@ @Transactional public class CreateLogHandlerImpl implements CreateLogHandler { - private final Logger LOGGER = LoggerFactory.getLogger(CreateLogHandlerImpl.class); + private static final Logger LOGGER = LoggerFactory.getLogger(CreateLogHandlerImpl.class); @Autowired TestItemRepository testItemRepository;