diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java index 86181c2..598971e 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -36,8 +37,10 @@ import com.iqser.red.service.redaction.v1.model.RedactionLog; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import io.micrometer.core.annotation.Timed; +import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; +import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @SuppressWarnings("ALL") @@ -68,9 +71,66 @@ public class ReportGenerationService { Dossier dossier = dossierClient.getDossierById(reportMessage.getDossierId(), true, false); - List singleFilesTemplates = new ArrayList<>(); - List multiFileWorkbookReportTemplates = new ArrayList<>(); - List multiFileDocumentReportTemplates = new ArrayList<>(); + ReportTemplates reportTemplates = prepareReportTemplates(reportMessage); + + var placeholderModel = generatePlaceholderService.buildPlaceholders(dossier); + + String downloadId = reportMessage.getDownloadId(); + + for (int fileIdIndex = 0; fileIdIndex < reportMessage.getFileIds().size(); fileIdIndex++) { + + long start = System.currentTimeMillis(); + var isLastFile = fileIdIndex == reportMessage.getFileIds().size() - 1; + + String dossierId = dossier.getId(); + String fileId = reportMessage.getFileIds().get(fileIdIndex); + String dossierName = dossier.getDossierName(); + + var fileStatus = fileStatusClient.getFileStatus(dossierId, fileId); + generatePlaceholderService.resolveFileAttributeValues(fileStatus, placeholderModel); + + List reportEntries = getReportEntries(dossierId, fileId, fileStatus.isExcluded()); + + generateMultiFileExcelReports(reportTemplates.multiFileWorkbookReportTemplates, placeholderModel, fileStatus, isLastFile, dossierName, reportEntries); + + generateMultiFileWordReports(reportTemplates.multiFileDocumentReportTemplates, + storedFileInformation, + dossier, + placeholderModel, + isLastFile, + downloadId, + fileStatus, + reportEntries); + + generateSingleFileReports(reportTemplates.singleFilesTemplates, storedFileInformation, dossier, placeholderModel, downloadId, fileStatus, reportEntries); + + long end = System.currentTimeMillis(); + log.info("Successfully processed {}/{} fileIds for downloadId {}, took {}", fileIdIndex + 1, reportMessage.getFileIds().size(), downloadId, end - start); + } + + for (MultiFileWorkbook multiFileWorkbook : reportTemplates.multiFileWorkbookReportTemplates) { + byte[] template = excelTemplateReportGenerationService.toByteArray(multiFileWorkbook.getWriteWorkbook()); + String storageId = reportStorageService.storeObject(downloadId, template); + storedFileInformation.add(new StoredFileInformation(null, storageId, ReportType.EXCEL_TEMPLATE_MULTI_FILE, multiFileWorkbook.getTemplateId(), 0)); + } + + for (MultiFileDocument multiFileDocument : reportTemplates.multiFileDocumentReportTemplates) { + byte[] template = wordReportGenerationService.toByteArray(multiFileDocument.getDocument()); + String storageId = reportStorageService.storeObject(downloadId, template); + storedFileInformation.add(new StoredFileInformation(null, + storageId, + ReportType.WORD_TEMPLATE_MULTI_FILE, + multiFileDocument.getTemplateId(), + multiFileDocument.getDocumentPartNr())); + } + + return reportStorageService.storeReportInformation(reportMessage.getDownloadId(), storedFileInformation); + } + + + private ReportTemplates prepareReportTemplates(ReportRequestMessage reportMessage) { + + var reportTemplates = new ReportTemplates(); for (String templateId : reportMessage.getTemplateIds()) { try { ReportTemplate reportTemplate = reportTemplateClient.getReportTemplate(reportMessage.getDossierTemplateId(), templateId); @@ -88,7 +148,7 @@ public class ReportGenerationService { templateId, reportTemplate.getFileName(), excelTemplateReportGenerationService.calculateExcelModel(readWorkbook.getSheetAt(0))); - multiFileWorkbookReportTemplates.add(multiFileWorkbook); + reportTemplates.multiFileWorkbookReportTemplates.add(multiFileWorkbook); } catch (IOException e) { throw new RuntimeException("Could not generate multifile excel report."); } @@ -97,111 +157,96 @@ public class ReportGenerationService { try (ByteArrayInputStream is = new ByteArrayInputStream(wordTemplate)) { XWPFDocument doc = new XWPFDocument(is); MultiFileDocument multiFileDocument = new MultiFileDocument(wordTemplate, doc, templateId, reportTemplate.getFileName(), 0, 0); - multiFileDocumentReportTemplates.add(multiFileDocument); + reportTemplates.multiFileDocumentReportTemplates.add(multiFileDocument); } catch (IOException e) { throw new RuntimeException("Could not generate multifile word report."); } } } else { - singleFilesTemplates.add(reportTemplate); + reportTemplates.singleFilesTemplates.add(reportTemplate); } } catch (Exception e) { log.warn("Skipping reportTemplate with id {}", templateId); } } + return reportTemplates; + } - var placeholderModel = generatePlaceholderService.buildPlaceholders(dossier); - int i = 1; - for (int j = 0; j < reportMessage.getFileIds().size(); j++) { - - long start = System.currentTimeMillis(); - - var fileStatus = fileStatusClient.getFileStatus(reportMessage.getDossierId(), reportMessage.getFileIds().get(j)); - - generatePlaceholderService.resolveFileAttributeValues(fileStatus, placeholderModel); - - List reportEntries = getReportEntries(reportMessage.getDossierId(), reportMessage.getFileIds().get(j), fileStatus.isExcluded()); - - var isLastFile = j == reportMessage.getFileIds().size() - 1; - - for (MultiFileWorkbook multiFileWorkbook : multiFileWorkbookReportTemplates) { - if (multiFileWorkbook.getExcelModel().isHasRssPlaceHolders()) { - generatePlaceholderService.resolveRssValues(fileStatus, placeholderModel); - } - excelTemplateReportGenerationService.generateExcelReport(reportEntries, - placeholderModel, - multiFileWorkbook.getTemplateName(), - multiFileWorkbook.getWriteWorkbook(), - dossier.getDossierName(), - fileStatus, - multiFileWorkbook.getExcelModel(), - isLastFile); - } - - for (MultiFileDocument multiFileDocument : multiFileDocumentReportTemplates) { - var numberOfChars = wordReportGenerationService.approxNumberOfChars(reportEntries.stream().findFirst(), fileStatus.getFilename()); - - if (multiFileDocument.getNumberOfChars() >= reportTemplateSettings.getMultiFileChunkSize()) { - wordReportGenerationService.removePlaceholdersRow(wordReportGenerationService.getRedactionTable(multiFileDocument.getDocument())); - byte[] wordDoc = wordReportGenerationService.toByteArray(multiFileDocument.getDocument()); - String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), wordDoc); - storedFileInformation.add(new StoredFileInformation(null, - storageId, - ReportType.WORD_TEMPLATE_MULTI_FILE, - multiFileDocument.getTemplateId(), - multiFileDocument.getDocumentPartNr())); - multiFileDocument.setDocumentPartNr(multiFileDocument.getDocumentPartNr() + 1); - - try (ByteArrayInputStream is = new ByteArrayInputStream(multiFileDocument.getTemplateAsBytes())) { - XWPFDocument doc = new XWPFDocument(is); - multiFileDocument.setDocument(doc); - multiFileDocument.setNumberOfChars(0); - } - } - numberOfChars = wordReportGenerationService.generateWordReport(reportEntries, - placeholderModel, - multiFileDocument.getTemplateName(), - multiFileDocument.getDocument(), - fileStatus, - dossier, - isLastFile ? isLastFile : multiFileDocument.getNumberOfChars() + numberOfChars >= reportTemplateSettings.getMultiFileChunkSize()); - multiFileDocument.setNumberOfChars(multiFileDocument.getNumberOfChars() + numberOfChars); - } - - for (ReportTemplate reportTemplate : singleFilesTemplates) { - - storedFileInformation.add(createReportFromTemplate(dossier, - fileStatus, - placeholderModel, - reportTemplate.getFileName(), - reportMessage.getDownloadId(), - reportEntries, - reportTemplate)); - } - - long end = System.currentTimeMillis(); - log.info("Successfully processed {}/{} fileIds for downloadId {}, took {}", i, reportMessage.getFileIds().size(), reportMessage.getDownloadId(), end - start); - i++; - } + private void generateMultiFileExcelReports(List multiFileWorkbookReportTemplates, + PlaceholderModel placeholderModel, + FileModel fileStatus, + boolean isLastFile, + String dossierName, + List reportEntries) { for (MultiFileWorkbook multiFileWorkbook : multiFileWorkbookReportTemplates) { - byte[] template = excelTemplateReportGenerationService.toByteArray(multiFileWorkbook.getWriteWorkbook()); - String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), template); - storedFileInformation.add(new StoredFileInformation(null, storageId, ReportType.EXCEL_TEMPLATE_MULTI_FILE, multiFileWorkbook.getTemplateId(), 0)); + if (multiFileWorkbook.getExcelModel().isHasRssPlaceHolders()) { + generatePlaceholderService.resolveRssValues(fileStatus, placeholderModel); + } + excelTemplateReportGenerationService.generateExcelReport(reportEntries, + placeholderModel, + multiFileWorkbook.getTemplateName(), + multiFileWorkbook.getWriteWorkbook(), + dossierName, + fileStatus, + multiFileWorkbook.getExcelModel(), + isLastFile); } + } + + + private void generateMultiFileWordReports(List multiFileDocumentReportTemplates, + List storedFileInformation, + Dossier dossier, + PlaceholderModel placeholderModel, + boolean isLastFile, + String downloadId, + FileModel fileStatus, + List reportEntries) throws IOException { for (MultiFileDocument multiFileDocument : multiFileDocumentReportTemplates) { - byte[] template = wordReportGenerationService.toByteArray(multiFileDocument.getDocument()); - String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), template); - storedFileInformation.add(new StoredFileInformation(null, - storageId, - ReportType.WORD_TEMPLATE_MULTI_FILE, - multiFileDocument.getTemplateId(), - multiFileDocument.getDocumentPartNr())); - } + var numberOfChars = wordReportGenerationService.approxNumberOfChars(reportEntries.stream().findFirst(), fileStatus.getFilename()); - return reportStorageService.storeReportInformation(reportMessage.getDownloadId(), storedFileInformation); + if (multiFileDocument.getNumberOfChars() >= reportTemplateSettings.getMultiFileChunkSize()) { + wordReportGenerationService.removePlaceholdersRow(wordReportGenerationService.getRedactionTable(multiFileDocument.getDocument())); + byte[] wordDoc = wordReportGenerationService.toByteArray(multiFileDocument.getDocument()); + String storageId = reportStorageService.storeObject(downloadId, wordDoc); + storedFileInformation.add(new StoredFileInformation(null, + storageId, + ReportType.WORD_TEMPLATE_MULTI_FILE, + multiFileDocument.getTemplateId(), + multiFileDocument.getDocumentPartNr())); + multiFileDocument.setDocumentPartNr(multiFileDocument.getDocumentPartNr() + 1); + + try (ByteArrayInputStream is = new ByteArrayInputStream(multiFileDocument.getTemplateAsBytes())) { + XWPFDocument doc = new XWPFDocument(is); + multiFileDocument.setDocument(doc); + multiFileDocument.setNumberOfChars(0); + } + } + numberOfChars = wordReportGenerationService.generateWordReport(reportEntries, + placeholderModel, + multiFileDocument.getTemplateName(), + multiFileDocument.getDocument(), + fileStatus, + dossier, + isLastFile ? isLastFile : multiFileDocument.getNumberOfChars() + numberOfChars >= reportTemplateSettings.getMultiFileChunkSize()); + multiFileDocument.setNumberOfChars(multiFileDocument.getNumberOfChars() + numberOfChars); + } + } + + + private void generateSingleFileReports(List singleFilesTemplates, List storedFileInformation, + Dossier dossier, PlaceholderModel placeholderModel, + String downloadId, + FileModel fileStatus, + List reportEntries) { + + for (ReportTemplate reportTemplate : singleFilesTemplates) { + + storedFileInformation.add(createReportFromTemplate(dossier, fileStatus, placeholderModel, reportTemplate.getFileName(), downloadId, reportEntries, reportTemplate)); + } } @@ -292,4 +337,14 @@ public class ReportGenerationService { return mapOfEntityDisplayName; } + + @FieldDefaults(makeFinal = true, level = AccessLevel.PUBLIC) + private static final class ReportTemplates { + + List singleFilesTemplates = new LinkedList<>(); + List multiFileWorkbookReportTemplates = new LinkedList<>(); + List multiFileDocumentReportTemplates = new LinkedList<>(); + + } + }