From b8bf13d6930fdacbce360802b637e7ce7124ae88 Mon Sep 17 00:00:00 2001 From: Viktor Seifert Date: Mon, 27 Jun 2022 18:11:03 +0200 Subject: [PATCH] RED-1098: Implemented writing the requests to the pdftron-service to the respective queue instead of sending them via http --- .../download/DownloadPreparationService.java | 116 +++++++++++++----- 1 file changed, 86 insertions(+), 30 deletions(-) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java index fc98e375f..875c8610e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java @@ -1,7 +1,20 @@ package com.iqser.red.service.peristence.v1.server.service.download; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionMessage; import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionRequest; +import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionType; import com.iqser.red.service.peristence.v1.server.client.RedactionClient; +import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; import com.iqser.red.service.peristence.v1.server.service.RedactionLogService; import com.iqser.red.service.peristence.v1.server.utils.FileSystemBackedArchiver; @@ -11,7 +24,11 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; @@ -19,35 +36,74 @@ import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadS import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; import com.iqser.red.service.redaction.v1.model.RedactionLog; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import javax.transaction.Transactional; -import java.util.Map; -import java.util.stream.Collectors; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class DownloadPreparationService { - private final DownloadStatusPersistenceService downloadStatusPersistenceService; - private final FileStatusPersistenceService fileStatusPersistenceService; - private final FileManagementStorageService fileManagementStorageService; - private final RedactionClient redactionClient; - private final PDFTronRedactionClient pdfTronRedactionClient; - private final ReportTemplatePersistenceService reportTemplatePersistenceService; - private final RedactionLogService redactionLogService; - private final NotificationPersistenceService notificationPersistenceService; - private final DossierPersistenceService dossierPersistenceService; + DownloadStatusPersistenceService downloadStatusPersistenceService; + FileStatusPersistenceService fileStatusPersistenceService; + FileManagementStorageService fileManagementStorageService; + RedactionClient redactionClient; + PDFTronRedactionClient pdfTronRedactionClient; + ReportTemplatePersistenceService reportTemplatePersistenceService; + RedactionLogService redactionLogService; + NotificationPersistenceService notificationPersistenceService; + DossierPersistenceService dossierPersistenceService; + RabbitTemplate rabbitTemplate; + ObjectMapper objectMapper; + @Transactional - public void createDownload(ReportResultMessage reportResultMessage) { + public void createDownload(ReportResultMessage reportResultMessage) throws JsonProcessingException { DownloadStatusEntity downloadStatus = downloadStatusPersistenceService.getStatus(reportResultMessage.getDownloadId()); DossierEntity dossier = downloadStatus.getDossier(); + RedactionMessage message = RedactionMessage.builder().build(); + + for (String fileId : downloadStatus.getFiles().stream().map(FileEntity::getId).collect(Collectors.toUnmodifiableList())) { + for (DownloadFileType downloadFileType : downloadStatus.getDownloadFileTypes()) { + RedactionType redactionType = toRedactionType(downloadFileType); + if (redactionType == null) { + continue; + } + + message.getRedactionTypes().add(redactionType); + message.getFileIds().add(fileId); + message.getDossierIds().add(dossier.getId()); + } + } + + rabbitTemplate.convertAndSend(MessagingConfiguration.PDFTRON_QUEUE, objectMapper.writeValueAsString(message)); + } + + + private RedactionType toRedactionType(DownloadFileType downloadFileType) { + + switch (downloadFileType) { + case REDACTED: + return RedactionType.REDACTED; + case PREVIEW: + return RedactionType.PREVIEW; + case DELTA_PREVIEW: + return RedactionType.DELTA; + case ORIGINAL: + default: + return null; + } + } + + + private void createDownloadArchive(ReportResultMessage reportResultMessage, DownloadStatusEntity downloadStatus, DossierEntity dossier) { + try (FileSystemBackedArchiver fileSystemBackedArchiver = new FileSystemBackedArchiver()) { generateAndAddFiles(downloadStatus, fileSystemBackedArchiver); @@ -87,20 +143,16 @@ public class DownloadPreparationService { fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Original", fileStatus.getFilename(), original)); } if (downloadFileType.name().equals(DownloadFileType.PREVIEW.name())) { - fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Preview", addSuffix(fileStatus.getFilename(), "highlighted"), - getPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getPreviewWatermarkId()))); + fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Preview", addSuffix(fileStatus.getFilename(), "highlighted"), getPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getPreviewWatermarkId()))); } if (downloadFileType.name().equals(DownloadFileType.DELTA_PREVIEW.name())) { - fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Delta Preview", addSuffix(fileStatus.getFilename(), "delta_highlighted"), - getDeltaPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getPreviewWatermarkId()))); + fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Delta Preview", addSuffix(fileStatus.getFilename(), "delta_highlighted"), getDeltaPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getPreviewWatermarkId()))); } if (downloadFileType.name().equals(DownloadFileType.REDACTED.name())) { - fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Redacted", addSuffix(fileStatus.getFilename(), "redacted"), - getRedacted(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getWatermarkId()))); + fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Redacted", addSuffix(fileStatus.getFilename(), "redacted"), getRedacted(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getWatermarkId()))); } } - log.info("Successfully added file {}/{} for downloadId {}, took {}", i, fileIds - .size(), downloadStatus.getStorageId(), System.currentTimeMillis() - start); + log.info("Successfully added file {}/{} for downloadId {}, took {}", i, fileIds.size(), downloadStatus.getStorageId(), System.currentTimeMillis() - start); i++; } log.info("Successfully added {} files for downloadId {}, took {}", fileIds, downloadStatus.getStorageId(), System.currentTimeMillis() - fileGenerationStart); @@ -113,7 +165,6 @@ public class DownloadPreparationService { for (StoredFileInformation storedFileInformation : reportResultMessage.getStoredFileInformation()) { - FileEntity fileStatus = null; if (storedFileInformation.getFileId() != null) { @@ -122,14 +173,14 @@ public class DownloadPreparationService { ReportTemplateEntity reportTemplate = reportTemplatePersistenceService.find(storedFileInformation.getTemplateId()); byte[] report = fileManagementStorageService.getStoredObjectBytes(storedFileInformation.getStorageId()); - fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel(removeExtension(reportTemplate.getFileName()) + (reportTemplate.isMultiFileReport() ? " (multifile)" : ""), - addSuffix(createFileName(fileStatus, reportTemplate), "justification"), report)); + fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel(removeExtension(reportTemplate.getFileName()) + (reportTemplate.isMultiFileReport() ? " (multifile)" : ""), addSuffix(createFileName(fileStatus, reportTemplate), "justification"), report)); } log.info("Successfully added {} reports for downloadId {}, took {}", reportResultMessage.getStoredFileInformation() .size(), reportResultMessage.getDownloadId(), System.currentTimeMillis() - addReportsStart); } + private String createFileName(FileEntity fileStatus, ReportTemplateEntity reportTemplate) { if (fileStatus != null) { @@ -139,7 +190,9 @@ public class DownloadPreparationService { } } + private String getExtension(String fileName) { + var index = fileName.lastIndexOf("."); if (index > 0) { return fileName.substring(index); @@ -148,7 +201,9 @@ public class DownloadPreparationService { } } + private String removeExtension(String fileName) { + var index = fileName.lastIndexOf("."); if (index > 0) { return fileName.substring(0, index); @@ -159,6 +214,7 @@ public class DownloadPreparationService { private String addSuffix(String filename, String suffix) { + var oldExtension = getExtension(filename); return removeExtension(filename) + "_" + suffix + oldExtension; @@ -172,8 +228,8 @@ public class DownloadPreparationService { log.info("Successfully stored zip for downloadId {}, took {}", downloadStatus.getStorageId(), System.currentTimeMillis() - start); } - private byte[] getRedacted(String dossierId, String fileId, RedactionLog redactionLog, String dossierTemplateId, - Long watermarkId) { + + private byte[] getRedacted(String dossierId, String fileId, RedactionLog redactionLog, String dossierTemplateId, Long watermarkId) { return pdfTronRedactionClient.redact(RedactionRequest.builder() .dossierId(dossierId)