From cb8e044d761507fbc7263c225ab695b9650fcdb9 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Fri, 13 May 2022 13:01:31 +0300 Subject: [PATCH] RED-4036 - improved report service performance, added some logs --- redaction-report-service-image-v1/pom.xml | 4 +- redaction-report-service-v1/pom.xml | 2 +- .../pom.xml | 4 +- .../v1/server/model/MultiFileDocument.java | 8 +- .../v1/server/model/MultiFileWorkbook.java | 1 + .../v1/server/model/PlaceholderModel.java | 20 ++ .../ExcelTemplateReportGenerationService.java | 82 ++------ .../service/GeneratePlaceholderService.java | 95 ++++++++++ .../service/ReportGenerationService.java | 111 +++++++---- .../service/WordReportGenerationService.java | 178 +++++------------- .../RedactionReportIntegrationTest.java | 59 +++--- 11 files changed, 287 insertions(+), 277 deletions(-) create mode 100644 redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/PlaceholderModel.java create mode 100644 redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/GeneratePlaceholderService.java diff --git a/redaction-report-service-image-v1/pom.xml b/redaction-report-service-image-v1/pom.xml index b114f2a..67fcb73 100644 --- a/redaction-report-service-image-v1/pom.xml +++ b/redaction-report-service-image-v1/pom.xml @@ -5,7 +5,7 @@ com.iqser.red platform-docker-dependency - 1.1.0 + 1.2.0 4.0.0 @@ -41,7 +41,7 @@ docker-maven-plugin - + diff --git a/redaction-report-service-v1/pom.xml b/redaction-report-service-v1/pom.xml index 3bf35d7..7bd3ccf 100644 --- a/redaction-report-service-v1/pom.xml +++ b/redaction-report-service-v1/pom.xml @@ -27,7 +27,7 @@ com.iqser.red platform-commons-dependency - 1.11.0 + 1.13.0 import pom diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml b/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml index 888cc17..7d2a881 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml +++ b/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml @@ -14,8 +14,8 @@ 1.0-SNAPSHOT - 1.160.0 - 3.108.0 + 1.169.0 + 3.109.0 diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileDocument.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileDocument.java index 4d81a54..96d4341 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileDocument.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileDocument.java @@ -1,13 +1,8 @@ package com.iqser.red.service.redaction.report.v1.server.model; -import java.util.List; - -import org.apache.poi.xwpf.usermodel.XWPFDocument; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; - import lombok.AllArgsConstructor; import lombok.Data; +import org.apache.poi.xwpf.usermodel.XWPFDocument; @Data @AllArgsConstructor @@ -15,5 +10,6 @@ public class MultiFileDocument { private XWPFDocument document; private String templateId; + private String templateName; } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileWorkbook.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileWorkbook.java index 6b9f01f..e874193 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileWorkbook.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/MultiFileWorkbook.java @@ -10,5 +10,6 @@ public class MultiFileWorkbook { private XSSFWorkbook workbook; private String templateId; + private String templateName; } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/PlaceholderModel.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/PlaceholderModel.java new file mode 100644 index 0000000..51b3ea9 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/PlaceholderModel.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.redaction.report.v1.server.model; + + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +@AllArgsConstructor +public class PlaceholderModel { + + private List placeholders; + private List imagePlaceholders; + private Map dossierAttributesPlaceholder; + private Map fileAttributePlaceHolders; + + +} diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelTemplateReportGenerationService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelTemplateReportGenerationService.java index fdd2c0f..5cfc643 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelTemplateReportGenerationService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelTemplateReportGenerationService.java @@ -37,6 +37,7 @@ import java.util.regex.Pattern; import javax.imageio.ImageIO; +import com.iqser.red.service.redaction.report.v1.server.model.PlaceholderModel; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.CreationHelper; @@ -67,94 +68,40 @@ import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor public class ExcelTemplateReportGenerationService { - private final DossierAttributesClient dossierAttributesClient; - private final DossierAttributesConfigClient dossierAttributesConfigClient; - private final FileAttributesConfigClient fileAttributesClient; - - - public void generateReport(List reportEntries, String dossierTemplateId, + public void generateReport(List reportEntries, + PlaceholderModel placeholderModel, + String reportTemplateName, XSSFWorkbook workbook, FileModel fileStatus, Dossier dossier, boolean isLastFile) { - List placeholders = getDefaultPlaceholders(); - List imagePlaceholders = new ArrayList<>(); - - var dossierAttributes = dossierAttributesClient.getDossierAttributes(dossier.getId()); - var dossierAttributesConfig = dossierAttributesConfigClient.getDossierAttributes(dossierTemplateId); - - Map dossierAttributesPlaceholder = new HashMap<>(); //KEY:placeholder, VALUE:value - - for (DossierAttributeConfig attributeConfig : dossierAttributesConfig) { - for (DossierAttribute dossierAttribute : dossierAttributes) { - if (dossierAttribute.getDossierAttributeConfigId().equals(attributeConfig.getId())) { - if (attributeConfig.getType().equals(DossierAttributeType.IMAGE)) { - - if (dossierAttribute.getValue() != null) { - if (dossierAttribute.getValue().startsWith("data:")) { - imagePlaceholders.add(new ImagePlaceholder(attributeConfig.getPlaceholder(), Base64.getDecoder() - .decode(dossierAttribute.getValue().split(",")[1]))); - } else { - imagePlaceholders.add(new ImagePlaceholder(attributeConfig.getPlaceholder(), Base64.getDecoder() - .decode(dossierAttribute.getValue()))); - } - } - } else { - if (dossierAttribute.getValue() == null) { - dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), ""); - } else { - dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), dossierAttribute.getValue()); - } - } - } - } - if (!dossierAttributesPlaceholder.containsKey(attributeConfig.getPlaceholder())) { - dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), ""); - } - } - - Map fileAttributePlaceholders = getFileAttributePlaceholders(dossierTemplateId); - placeholders.addAll(fileAttributePlaceholders.keySet()); - placeholders.addAll(dossierAttributesPlaceholder.keySet()); + long start = System.currentTimeMillis(); try { for (Sheet sheet : workbook) { addEntryRows(sheet, reportEntries, fileStatus.getFilename(), isLastFile); - for (ImagePlaceholder imagePlaceholder : imagePlaceholders) { + for (ImagePlaceholder imagePlaceholder : placeholderModel.getImagePlaceholders()){ replacePlaceholdersForImagePlaceholder(workbook, sheet, imagePlaceholder); } - for (String placeholder : placeholders) { - String placeholderValue = getPlaceholderValue(placeholder, dossier, fileStatus, fileAttributePlaceholders, dossierAttributesPlaceholder); + for (String placeholder : placeholderModel.getPlaceholders()) { + String placeholderValue = getPlaceholderValue(placeholder, dossier, fileStatus, placeholderModel.getFileAttributePlaceHolders(), placeholderModel.getDossierAttributesPlaceholder()); if (placeholderValue != null) { replacePlaceholdersForTextPlaceholder(sheet, placeholder, placeholderValue); } } } - } catch (IOException e) { - throw new RuntimeException(e); + + long end = System.currentTimeMillis(); + + log.info("Report Generation took: {} for file with id {}, pageCount: {}, redactionLogEntryCount: {}, reportName: {}, className: {}", end - start, + fileStatus.getId(), fileStatus.getNumberOfPages(), reportEntries.size(), reportTemplateName, getClass().getSimpleName()); + } catch (Exception e) { throw new RuntimeException(e); } } - private List getDefaultPlaceholders() { - List defPlaceholders = new ArrayList<>(); - defPlaceholders.addAll(Arrays.asList(FILE_NAME_PLACEHOLDER, FORMAT_DATE_ISO_PLACEHOLDER, FORMAT_DATE_GER_PLACEHOLDER, FORMAT_DATE_ENG_PLACEHOLDER, FORMAT_TIME_ISO_PLACEHOLDER, DOSSIER_NAME_PLACEHOLDER)); - return defPlaceholders; - } - - - private Map getFileAttributePlaceholders(String dossierTemplateId) { - - Map fileAttributePlaceholders = new HashMap<>(); - - var fileAttributesConfig = fileAttributesClient.getFileAttributeConfigs(dossierTemplateId); - fileAttributesConfig.forEach(fileAttributeConfig -> { - fileAttributePlaceholders.put(fileAttributeConfig.getPlaceholder(), fileAttributeConfig.getId()); - }); - return fileAttributePlaceholders; - } private void addEntryRows(Sheet sheet, List reportEntries, String filename, @@ -386,4 +333,5 @@ public class ExcelTemplateReportGenerationService { } } + } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/GeneratePlaceholderService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/GeneratePlaceholderService.java new file mode 100644 index 0000000..2ce0e68 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/GeneratePlaceholderService.java @@ -0,0 +1,95 @@ +package com.iqser.red.service.redaction.report.v1.server.service; + +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttribute; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; +import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesClient; +import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesConfigClient; +import com.iqser.red.service.redaction.report.v1.server.client.FileAttributesConfigClient; +import com.iqser.red.service.redaction.report.v1.server.model.ImagePlaceholder; +import com.iqser.red.service.redaction.report.v1.server.model.PlaceholderModel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.*; + +import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.*; +import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.DOSSIER_NAME_PLACEHOLDER; + +@Service +@RequiredArgsConstructor +public class GeneratePlaceholderService { + + private final FileAttributesConfigClient fileAttributesClient; + private final DossierAttributesClient dossierAttributesClient; + private final DossierAttributesConfigClient dossierAttributesConfigClient; + + + public PlaceholderModel buildPlaceholders(Dossier dossier){ + + + var dossierAttributes = dossierAttributesClient.getDossierAttributes(dossier.getId()); + var dossierAttributesConfig = dossierAttributesConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); + var fileAttributePlaceHolders = getFileAttributePlaceholders(dossier.getDossierTemplateId()); + + List placeholders = getDefaultPlaceholders(); + List imagePlaceholders = new ArrayList<>(); + + + Map dossierAttributesPlaceholder = new HashMap<>(); //KEY:placeholder, VALUE:value + + for (DossierAttributeConfig attributeConfig : dossierAttributesConfig) { + for (DossierAttribute dossierAttribute : dossierAttributes) { + if (dossierAttribute.getDossierAttributeConfigId().equals(attributeConfig.getId())) { + if (attributeConfig.getType().equals(DossierAttributeType.IMAGE)) { + + if (dossierAttribute.getValue() != null) { + if (dossierAttribute.getValue().startsWith("data:")) { + imagePlaceholders.add(new ImagePlaceholder(attributeConfig.getPlaceholder(), Base64.getDecoder() + .decode(dossierAttribute.getValue().split(",")[1]))); + } else { + imagePlaceholders.add(new ImagePlaceholder(attributeConfig.getPlaceholder(), Base64.getDecoder().decode(dossierAttribute.getValue()))); + } + } + } else { + if (dossierAttribute.getValue() == null) { + dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), ""); + } else { + dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), dossierAttribute.getValue()); + } + } + } + } + if (!dossierAttributesPlaceholder.containsKey(attributeConfig.getPlaceholder())) { + dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), ""); + } + } + + placeholders.addAll(fileAttributePlaceHolders.keySet()); + placeholders.addAll(dossierAttributesPlaceholder.keySet()); + + return new PlaceholderModel(placeholders,imagePlaceholders,dossierAttributesPlaceholder,fileAttributePlaceHolders); + } + + + private List getDefaultPlaceholders() { + + List defPlaceholders = new ArrayList<>(); + defPlaceholders.addAll(Arrays.asList(FILE_NAME_PLACEHOLDER, FORMAT_DATE_ISO_PLACEHOLDER, FORMAT_DATE_GER_PLACEHOLDER, FORMAT_DATE_ENG_PLACEHOLDER, FORMAT_TIME_ISO_PLACEHOLDER, DOSSIER_NAME_PLACEHOLDER, IUCLID_FUNCTION_PLACEHOLDER, SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER, SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER)); + return defPlaceholders; + } + + + + private Map getFileAttributePlaceholders(String dossierTemplateId) { + + Map fileAttributePlaceholders = new HashMap<>(); + + var fileAttributesConfig = fileAttributesClient.getFileAttributeConfigs(dossierTemplateId); + fileAttributesConfig.forEach(fileAttributeConfig -> { + fileAttributePlaceholders.put(fileAttributeConfig.getPlaceholder(), fileAttributeConfig.getId()); + }); + return fileAttributePlaceholders; + } +} 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 8a27c51..9a113f3 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 @@ -3,6 +3,7 @@ package com.iqser.red.service.redaction.report.v1.server.service; import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; import com.iqser.red.service.redaction.report.v1.api.model.ReportRequestMessage; import com.iqser.red.service.redaction.report.v1.api.model.ReportType; import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; @@ -12,6 +13,7 @@ import com.iqser.red.service.redaction.report.v1.server.client.RedactionLogClien import com.iqser.red.service.redaction.report.v1.server.client.ReportTemplateClient; import com.iqser.red.service.redaction.report.v1.server.model.MultiFileDocument; import com.iqser.red.service.redaction.report.v1.server.model.MultiFileWorkbook; +import com.iqser.red.service.redaction.report.v1.server.model.PlaceholderModel; import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry; import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService; import com.iqser.red.service.redaction.v1.model.ManualChange; @@ -22,13 +24,17 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; @Slf4j @Service @@ -43,13 +49,16 @@ public class ReportGenerationService { private final ReportTemplateClient reportTemplateClient; private final RedactionLogClient redactionLogClient; private final ExcelTemplateReportGenerationService excelTemplateReportGenerationService; + private final GeneratePlaceholderService generatePlaceholderService; + @Value("${redaction-report-service.numberOfReportGenerationThreads:4}") + private int numberOfReportGenerationThreads; public List generateReport(ReportRequestMessage reportMessage) { - List storedFileInformation = new ArrayList<>(); + List storedFileInformation = Collections.synchronizedList(new ArrayList<>()); - Dossier project = dossierClient.getDossierById(reportMessage.getDossierId(), true,false); + Dossier dossier = dossierClient.getDossierById(reportMessage.getDossierId(), true, false); List singleFilesTemplates = new ArrayList<>(); List multiFileWorkbooks = new ArrayList<>(); @@ -58,11 +67,11 @@ public class ReportGenerationService { try { ReportTemplate reportTemplate = reportTemplateClient.getReportTemplate(reportMessage.getDossierTemplateId(), templateId); if (reportTemplate.isMultiFileReport()) { - if(reportTemplate.getFileName().endsWith(".xlsx")) { + if (reportTemplate.getFileName().endsWith(".xlsx")) { byte[] excelTemplate = reportStorageService.getReportTemplate(reportTemplate.getStorageId()); try (ByteArrayInputStream is = new ByteArrayInputStream(excelTemplate)) { XSSFWorkbook workbook = new XSSFWorkbook(is); - MultiFileWorkbook multiFileWorkbook = new MultiFileWorkbook(workbook, templateId); + MultiFileWorkbook multiFileWorkbook = new MultiFileWorkbook(workbook, templateId, reportTemplate.getFileName()); multiFileWorkbooks.add(multiFileWorkbook); } catch (IOException e) { throw new RuntimeException("Could not generate multifile excel report."); @@ -71,7 +80,7 @@ public class ReportGenerationService { byte[] wordTemplate = reportStorageService.getReportTemplate(reportTemplate.getStorageId()); try (ByteArrayInputStream is = new ByteArrayInputStream(wordTemplate)) { XWPFDocument doc = new XWPFDocument(is); - MultiFileDocument multiFileDocument = new MultiFileDocument(doc, templateId); + MultiFileDocument multiFileDocument = new MultiFileDocument(doc, templateId, reportTemplate.getFileName()); multiFileDocuments.add(multiFileDocument); } catch (IOException e) { throw new RuntimeException("Could not generate multifile word report."); @@ -85,6 +94,9 @@ public class ReportGenerationService { } } + + var placeholderModel = generatePlaceholderService.buildPlaceholders(dossier); + int i = 1; for (int j = 0; j < reportMessage.getFileIds().size(); j++) { @@ -96,41 +108,30 @@ public class ReportGenerationService { List reportEntries = getReportEntries(reportMessage.getDossierId(), reportMessage.getFileIds() .get(j), fileStatus.isExcluded()); - for (MultiFileWorkbook multiFileWorkbook : multiFileWorkbooks) { - excelTemplateReportGenerationService.generateReport(reportEntries, reportMessage.getDossierTemplateId(), multiFileWorkbook.getWorkbook(), fileStatus, project, j == reportMessage.getFileIds() - .size() - 1); - } + ExecutorService executor = Executors.newFixedThreadPool(numberOfReportGenerationThreads); + + var isLastFile = j == reportMessage.getFileIds() + .size() - 1; + + for (MultiFileWorkbook multiFileWorkbook : multiFileWorkbooks) + executor.submit(() -> excelTemplateReportGenerationService.generateReport(reportEntries, + placeholderModel, multiFileWorkbook.getTemplateName(), + multiFileWorkbook.getWorkbook(), fileStatus, dossier, isLastFile)); + for (MultiFileDocument multiFileDocument : multiFileDocuments) { - wordReportGenerationService.generateReport(ReportType.WORD_TEMPLATE_MULTI_FILE, reportEntries, reportMessage.getDossierTemplateId(), multiFileDocument.getDocument(), fileStatus, project, j == reportMessage.getFileIds() - .size() - 1); + executor.submit(() -> + wordReportGenerationService.generateReport(reportEntries, placeholderModel, multiFileDocument.getTemplateName(), multiFileDocument.getDocument(), fileStatus, dossier, isLastFile) + ); } + for (ReportTemplate reportTemplate : singleFilesTemplates) { - if (reportTemplate.getFileName().endsWith(".xlsx")) { - byte[] excelTemplate = reportStorageService.getReportTemplate(reportTemplate.getStorageId()); - try (ByteArrayInputStream is = new ByteArrayInputStream(excelTemplate)) { - XSSFWorkbook workbook = new XSSFWorkbook(is); - excelTemplateReportGenerationService.generateReport(reportEntries, reportMessage.getDossierTemplateId(), workbook, fileStatus, project, true); - byte[] template = excelTemplateReportGenerationService.toByteArray(workbook); - String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), template); - storedFileInformation.add(new StoredFileInformation(reportMessage.getFileIds() - .get(j), storageId, ReportType.EXCEL_TEMPLATE_SINGLE_FILE, reportTemplate.getTemplateId())); - } catch (IOException e) { - throw new RuntimeException("Could not generate singlefile excel report."); - } - } else { - byte[] wordTemplate= reportStorageService.getReportTemplate(reportTemplate.getStorageId()); - try (ByteArrayInputStream is = new ByteArrayInputStream(wordTemplate)) { - XWPFDocument doc = new XWPFDocument(is); - wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, reportMessage.getDossierTemplateId(), doc, fileStatus, project, true); - byte[] template = wordReportGenerationService.toByteArray(doc); - String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), template); - storedFileInformation.add(new StoredFileInformation(reportMessage.getFileIds().get(j), storageId, ReportType.WORD_SINGLE_FILE, reportTemplate.getTemplateId())); - } catch (IOException e) { - throw new RuntimeException("Could not generate singlefile word report."); - } - } + executor.submit(() -> + storedFileInformation.add(createReportFromTemplate(dossier, fileStatus, placeholderModel, reportTemplate.getFileName(), reportMessage.getDownloadId(), reportEntries, reportTemplate)) + ); } + executor.shutdown(); + long end = System.currentTimeMillis(); log.info("Successfully processed {}/{} fileIds for downloadId {}, took {}", i, reportMessage.getFileIds() .size(), reportMessage.getDownloadId(), end - start); @@ -146,13 +147,44 @@ public class ReportGenerationService { for (MultiFileDocument multiFileDocument : multiFileDocuments) { 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())); + storedFileInformation.add(new StoredFileInformation(null, storageId, ReportType.WORD_TEMPLATE_MULTI_FILE, multiFileDocument.getTemplateId())); } return storedFileInformation; } + private StoredFileInformation createReportFromTemplate(Dossier dossier, FileModel fileStatus, + PlaceholderModel placeholderModel, + String templateName, + String downloadId, + List reportEntries, ReportTemplate reportTemplate) { + if (reportTemplate.getFileName().endsWith(".xlsx")) { + byte[] excelTemplate = reportStorageService.getReportTemplate(reportTemplate.getStorageId()); + try (ByteArrayInputStream is = new ByteArrayInputStream(excelTemplate)) { + XSSFWorkbook workbook = new XSSFWorkbook(is); + excelTemplateReportGenerationService.generateReport(reportEntries, placeholderModel, templateName, workbook, fileStatus, dossier, true); + byte[] template = excelTemplateReportGenerationService.toByteArray(workbook); + String storageId = reportStorageService.storeObject(downloadId, template); + return new StoredFileInformation(fileStatus.getId(), storageId, ReportType.EXCEL_TEMPLATE_SINGLE_FILE, reportTemplate.getTemplateId()); + } catch (IOException e) { + throw new RuntimeException("Could not generate singlefile excel report."); + } + } else { + byte[] wordTemplate = reportStorageService.getReportTemplate(reportTemplate.getStorageId()); + try (ByteArrayInputStream is = new ByteArrayInputStream(wordTemplate)) { + XWPFDocument doc = new XWPFDocument(is); + wordReportGenerationService.generateReport(reportEntries, placeholderModel, templateName, doc, fileStatus, dossier, true); + byte[] template = wordReportGenerationService.toByteArray(doc); + String storageId = reportStorageService.storeObject(downloadId, template); + return new StoredFileInformation(fileStatus.getId(), storageId, ReportType.WORD_SINGLE_FILE, reportTemplate.getTemplateId()); + } catch (IOException e) { + throw new RuntimeException("Could not generate singlefile word report."); + } + } + } + + private List getReportEntries(String dossierId, String fileId, boolean isExcluded) { if (isExcluded) { @@ -165,10 +197,10 @@ public class ReportGenerationService { //filter DECLINED redactions out, they should not be in reports Iterator iter = redactionLog.getRedactionLogEntry().iterator(); - while(iter.hasNext()) { + while (iter.hasNext()) { RedactionLogEntry redactionLogEntry = iter.next(); - for(ManualChange manualChange : redactionLogEntry.getManualChanges()) { - if(manualChange.getAnnotationStatus().equals(AnnotationStatus.DECLINED)) { + for (ManualChange manualChange : redactionLogEntry.getManualChanges()) { + if (manualChange.getAnnotationStatus().equals(AnnotationStatus.DECLINED)) { iter.remove(); } } @@ -181,4 +213,5 @@ public class ReportGenerationService { return redactionLogConverterService.convertAndSort(redactionLog, legalBasisMappings); } + } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/WordReportGenerationService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/WordReportGenerationService.java index 662981b..cebcf97 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/WordReportGenerationService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/WordReportGenerationService.java @@ -1,157 +1,83 @@ package com.iqser.red.service.redaction.report.v1.server.service; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.DOSSIER_NAME_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.EXCERPT_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FILE_NAME_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_DATE_ENG; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_DATE_ENG_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_DATE_GER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_DATE_GER_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_DATE_ISO; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_DATE_ISO_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_TIME_ISO; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_TIME_ISO_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.IUCLID_FUNCTION_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.JUSTIFICATION_LEGAL_BASIS_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.JUSTIFICATION_PARAGRAPH_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.JUSTIFICATION_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.JUSTIFICATION_REASON_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.JUSTIFICATION_TEXT_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.PAGE_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.PARAGRAPH_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.REDACTION_VALUE_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER; -import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.redaction.report.v1.server.model.ColoredText; +import com.iqser.red.service.redaction.report.v1.server.model.ImagePlaceholder; +import com.iqser.red.service.redaction.report.v1.server.model.PlaceholderModel; +import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.util.Dimension2DDouble; +import org.apache.poi.util.Units; +import org.apache.poi.xwpf.usermodel.*; +import org.springframework.stereotype.Service; +import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Base64; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.imageio.ImageIO; - -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; -import org.apache.poi.util.Dimension2DDouble; -import org.apache.poi.util.Units; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.xwpf.usermodel.XWPFParagraph; -import org.apache.poi.xwpf.usermodel.XWPFRun; -import org.apache.poi.xwpf.usermodel.XWPFTable; -import org.apache.poi.xwpf.usermodel.XWPFTableCell; -import org.apache.poi.xwpf.usermodel.XWPFTableRow; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttribute; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.redaction.report.v1.api.model.ReportType; -import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesClient; -import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesConfigClient; -import com.iqser.red.service.redaction.report.v1.server.client.FileAttributesConfigClient; -import com.iqser.red.service.redaction.report.v1.server.model.ColoredText; -import com.iqser.red.service.redaction.report.v1.server.model.ImagePlaceholder; -import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry; -import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.*; @Slf4j @Service @RequiredArgsConstructor public class WordReportGenerationService { - private final FileAttributesConfigClient fileAttributesClient; - private final DossierAttributesClient dossierAttributesClient; - private final DossierAttributesConfigClient dossierAttributesConfigClient; + private final IuclidFunctionService iuclidFunctionService; - public XWPFDocument generateReport(ReportType reportType, List reportEntries, String dossierTemplateId, XWPFDocument doc, FileModel fileStatus, - Dossier dossier, boolean isLastFile) { - - List placeholders = getDefaultPlaceholders(); - List imagePlaceholders = new ArrayList<>(); - - var dossierAttributes = dossierAttributesClient.getDossierAttributes(dossier.getId()); - var dossierAttributesConfig = dossierAttributesConfigClient.getDossierAttributes(dossierTemplateId); - - Map dossierAttributesPlaceholder = new HashMap<>(); //KEY:placeholder, VALUE:value - - for (DossierAttributeConfig attributeConfig : dossierAttributesConfig) { - for (DossierAttribute dossierAttribute : dossierAttributes) { - if (dossierAttribute.getDossierAttributeConfigId().equals(attributeConfig.getId())) { - if (attributeConfig.getType().equals(DossierAttributeType.IMAGE)) { - - if (dossierAttribute.getValue() != null) { - if (dossierAttribute.getValue().startsWith("data:")) { - imagePlaceholders.add(new ImagePlaceholder(attributeConfig.getPlaceholder(), Base64.getDecoder() - .decode(dossierAttribute.getValue().split(",")[1]))); - } else { - imagePlaceholders.add(new ImagePlaceholder(attributeConfig.getPlaceholder(), Base64.getDecoder().decode(dossierAttribute.getValue()))); - } - } - } else { - if (dossierAttribute.getValue() == null) { - dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), ""); - } else { - dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), dossierAttribute.getValue()); - } - } - } - } - if (!dossierAttributesPlaceholder.containsKey(attributeConfig.getPlaceholder())) { - dossierAttributesPlaceholder.put(attributeConfig.getPlaceholder(), ""); - } - } - - Map fileAttributePlaceholders = getFileAttributePlaceholders(dossierTemplateId); - placeholders.addAll(fileAttributePlaceholders.keySet()); - placeholders.addAll(dossierAttributesPlaceholder.keySet()); + public XWPFDocument generateReport(List reportEntries, + PlaceholderModel placeholderModel, + String reportTemplateName, + XWPFDocument doc, FileModel fileStatus, + Dossier dossier, boolean isLastFile) { + long start = System.currentTimeMillis(); try { - for (ImagePlaceholder imagePlaceholder : imagePlaceholders) { + for (ImagePlaceholder imagePlaceholder : placeholderModel.getImagePlaceholders()) { replaceImagePlaceholders(doc, imagePlaceholder); } XWPFTable table = getRedactionTable(doc); Map placeholderCellPos = computePlaceholderPos(table); - addTableRows(table, reportEntries, fileStatus.getFilename(), fileStatus, fileAttributePlaceholders, placeholderCellPos); - for (String placeholder : placeholders) { - String placeholderValue = getPlaceholderValue(placeholder, dossier, fileStatus, fileAttributePlaceholders, dossierAttributesPlaceholder, reportEntries); + addTableRows(table, reportEntries, fileStatus.getFilename(), fileStatus, placeholderModel.getFileAttributePlaceHolders(), placeholderCellPos); + for (String placeholder : placeholderModel.getPlaceholders()) { + String placeholderValue = getPlaceholderValue(placeholder, dossier, fileStatus, placeholderModel.getFileAttributePlaceHolders(), placeholderModel.getDossierAttributesPlaceholder(), reportEntries); if (placeholderValue != null) { replaceTextPlaceholders(doc, placeholder, placeholderValue); } } - if(!isLastFile) { + if (!isLastFile) { readdPlaceholders(table, placeholderCellPos); } + + + long end = System.currentTimeMillis(); + + log.info("Report Generation took: {} for file with id {}, pageCount: {}, redactionLogEntryCount: {}, reportName: {}, className: {}", end - start, + fileStatus.getId(), fileStatus.getNumberOfPages(), reportEntries.size(), reportTemplateName, getClass().getSimpleName()); + return doc; } catch (Exception e) { log.error(e.getMessage() + " in file: " + fileStatus.getFilename()); throw new RuntimeException(e); } + + } @@ -168,26 +94,6 @@ public class WordReportGenerationService { } - private List getDefaultPlaceholders() { - - List defPlaceholders = new ArrayList<>(); - defPlaceholders.addAll(Arrays.asList(FILE_NAME_PLACEHOLDER, FORMAT_DATE_ISO_PLACEHOLDER, FORMAT_DATE_GER_PLACEHOLDER, FORMAT_DATE_ENG_PLACEHOLDER, FORMAT_TIME_ISO_PLACEHOLDER, DOSSIER_NAME_PLACEHOLDER, IUCLID_FUNCTION_PLACEHOLDER, SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER, SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER)); - return defPlaceholders; - } - - - private Map getFileAttributePlaceholders(String dossierTemplateId) { - - Map fileAttributePlaceholders = new HashMap<>(); - - var fileAttributesConfig = fileAttributesClient.getFileAttributeConfigs(dossierTemplateId); - fileAttributesConfig.forEach(fileAttributeConfig -> { - fileAttributePlaceholders.put(fileAttributeConfig.getPlaceholder(), fileAttributeConfig.getId()); - }); - return fileAttributePlaceholders; - } - - private String getPlaceholderValue(String placeholder, Dossier project, FileModel fileStatus, Map fileAttributePlaceholders, Map dossierAttributesPlaceholders, List reportRedactionEntries) { @@ -326,7 +232,7 @@ public class WordReportGenerationService { private Map computePlaceholderPos(XWPFTable table) { Map placeholderCellPos = new HashMap<>(); - if(table != null) { + if (table != null) { int placeholderRow = -1; for (int j = 0; j < table.getRows().size(); j++) { for (int i = 0; i < table.getRows().get(j).getTableCells().size(); i++) { @@ -378,7 +284,7 @@ public class WordReportGenerationService { private void readdPlaceholders(XWPFTable table, Map placeholderCellPos) { XWPFTableRow newRow = table.createRow(); - for(int i = 0; i < table.getRow(0).getTableCells().size(); i++) { + for (int i = 0; i < table.getRow(0).getTableCells().size(); i++) { String placeholder = placeholderCellPos.get(i); setText(newRow.getCell(i), placeholder); } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java index 16203b9..7d85564 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java @@ -12,7 +12,6 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.do import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.redaction.report.v1.api.model.ReportType; import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesClient; import com.iqser.red.service.redaction.report.v1.server.client.DossierAttributesConfigClient; import com.iqser.red.service.redaction.report.v1.server.client.FileAttributesConfigClient; @@ -20,6 +19,7 @@ import com.iqser.red.service.redaction.report.v1.server.client.ReportTemplateCli import com.iqser.red.service.redaction.report.v1.server.configuration.MessagingConfiguration; import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry; import com.iqser.red.service.redaction.report.v1.server.service.ExcelTemplateReportGenerationService; +import com.iqser.red.service.redaction.report.v1.server.service.GeneratePlaceholderService; import com.iqser.red.service.redaction.report.v1.server.service.RedactionLogConverterService; import com.iqser.red.service.redaction.report.v1.server.service.WordReportGenerationService; import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService; @@ -86,6 +86,9 @@ public class RedactionReportIntegrationTest { @Autowired private ExcelTemplateReportGenerationService excelTemplateReportGenerationService; + @Autowired + private GeneratePlaceholderService generatePlaceholderService; + @Test public void testWordReportGeneration() throws IOException { @@ -159,7 +162,7 @@ public class RedactionReportIntegrationTest { FileModel fileStatus = FileModel.builder().filename("FileABCD").fileAttributes(Map.of("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "Test")).build(); - Dossier project = Dossier.builder().id("dossierId").dossierName("projectName").build(); + Dossier dossier = Dossier.builder().id("dossierId").dossierName("dossierName").build(); String templateId = "templateId"; String storageId = "storageId"; @@ -170,8 +173,9 @@ public class RedactionReportIntegrationTest { ClassPathResource templateResource = new ClassPathResource("templates/Seeds - New Justification Form.docx"); + var placeholders = generatePlaceholderService.buildPlaceholders(dossier); XWPFDocument doc = new XWPFDocument(templateResource.getInputStream()); - wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, dossierTemplateId, doc, fileStatus, project, true); + wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, true); byte[] report = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/efsa_template_wrg.docx")) { @@ -226,8 +230,10 @@ public class RedactionReportIntegrationTest { .storageId(storageId) .build()); - excelTemplateReportGenerationService.generateReport(reportEntries, "dossierTemplateId", workbook, fileModel, dossier, false); - excelTemplateReportGenerationService.generateReport(reportEntries2, "dossierTemplateId", workbook, fileModel2, dossier, true); + var placeholders = generatePlaceholderService.buildPlaceholders(dossier); + + excelTemplateReportGenerationService.generateReport(reportEntries, placeholders, "test", workbook, fileModel, dossier, false); + excelTemplateReportGenerationService.generateReport(reportEntries2, placeholders, "test", workbook, fileModel2, dossier, true); byte[] excelTemplateReport = excelTemplateReportGenerationService.toByteArray(workbook); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/test_report_excel_template.xlsx")) { @@ -281,7 +287,7 @@ public class RedactionReportIntegrationTest { FileModel fileModel = FileModel.builder().filename("filename").fileAttributes(attributeIdToValue).build(); FileModel fileModel2 = FileModel.builder().filename("other file").fileAttributes(attributeIdToValue).build(); - Dossier dossier = Dossier.builder().id("dossierId").dossierName("projectName").build(); + Dossier dossier = Dossier.builder().id("dossierId").dossierName("dossierName").build(); when(reportTemplateClient.getReportTemplate(dossierTemplateId, templateId)).thenReturn(ReportTemplate.builder() .dossierTemplateId(dossierTemplateId) @@ -290,15 +296,17 @@ public class RedactionReportIntegrationTest { ClassPathResource wordTemplateResource = new ClassPathResource("templates/Justification Appendix A1.docx"); + var placeholders = generatePlaceholderService.buildPlaceholders(dossier); + XWPFDocument doc = new XWPFDocument(wordTemplateResource.getInputStream()); - wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, dossierTemplateId, doc, fileModel, dossier, true); + wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); byte[] wordReport = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/efsa_template1.docx")) { fileOutputStream.write(wordReport); } doc = new XWPFDocument(wordTemplateResource.getInputStream()); - wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries2, dossierTemplateId, doc, fileModel2, dossier, true); + wordReportGenerationService.generateReport(reportEntries2, placeholders, "test", doc, fileModel2, dossier, true); byte[] wordReport2 = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/efsa_template2.docx")) { fileOutputStream.write(wordReport2); @@ -306,20 +314,20 @@ public class RedactionReportIntegrationTest { ClassPathResource excelTemplateResource = new ClassPathResource("templates/Excel Report.xlsx"); XSSFWorkbook workbook = new XSSFWorkbook(excelTemplateResource.getInputStream()); - excelTemplateReportGenerationService.generateReport(reportEntries, "dossierTemplateId", workbook, fileModel, dossier, false); - excelTemplateReportGenerationService.generateReport(reportEntries2, "dossierTemplateId", workbook, fileModel2, dossier, true); + excelTemplateReportGenerationService.generateReport(reportEntries, placeholders, "test", workbook, fileModel, dossier, false); + excelTemplateReportGenerationService.generateReport(reportEntries2, placeholders, "test", workbook, fileModel2, dossier, true); byte[] excelTemplateReport = excelTemplateReportGenerationService.toByteArray(workbook); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/report_excel_template.xlsx")) { fileOutputStream.write(excelTemplateReport); } XSSFWorkbook workbook2 = new XSSFWorkbook(excelTemplateResource.getInputStream()); - excelTemplateReportGenerationService.generateReport(reportEntries, "dossierTemplateId", workbook2, fileModel, dossier, true); + excelTemplateReportGenerationService.generateReport(reportEntries, placeholders, "test", workbook2, fileModel, dossier, true); byte[] excelTemplateReport2 = excelTemplateReportGenerationService.toByteArray(workbook2); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/report_excel_template2.xlsx")) { fileOutputStream.write(excelTemplateReport2); } XSSFWorkbook workbook3 = new XSSFWorkbook(excelTemplateResource.getInputStream()); - excelTemplateReportGenerationService.generateReport(reportEntries2, "dossierTemplateId", workbook3, fileModel2, dossier, true); + excelTemplateReportGenerationService.generateReport(reportEntries2, placeholders, "test", workbook3, fileModel2, dossier, true); byte[] excelTemplateReport3 = excelTemplateReportGenerationService.toByteArray(workbook3); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/report_excel_template3.xlsx")) { fileOutputStream.write(excelTemplateReport3); @@ -368,7 +376,7 @@ public class RedactionReportIntegrationTest { attributeIdToValue.put("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "Test"); FileModel fileModel = FileModel.builder().filename("filename").fileAttributes(attributeIdToValue).build(); - Dossier project = Dossier.builder().id("dossierId").dossierName("projectName").build(); + Dossier dossier = Dossier.builder().id("dossierId").dossierName("dossierName").build(); String templateId = "templateId"; String storageId = "storageId"; @@ -378,9 +386,9 @@ public class RedactionReportIntegrationTest { .build()); ClassPathResource templateResource = new ClassPathResource("templates/6464 appendix_b EFSA dRAR justification.docx"); - + var placeholders = generatePlaceholderService.buildPlaceholders(dossier); XWPFDocument doc = new XWPFDocument(templateResource.getInputStream()); - wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, dossierTemplateId, doc, fileModel, project, true); + wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); byte[] report = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/efsa_template13.docx")) { @@ -416,7 +424,7 @@ public class RedactionReportIntegrationTest { FileModel fileStatus = FileModel.builder().filename("VV123456").build(); - Dossier project = Dossier.builder().id("dossierId").dossierName("projectName").build(); + Dossier dossier = Dossier.builder().id("dossierId").dossierName("dossierName").build(); String templateId = "templateId"; String storageId = "storageId"; @@ -434,9 +442,9 @@ public class RedactionReportIntegrationTest { .storageId("storageId") .uploadDate(OffsetDateTime.now()) .build(); - + var placeholders = generatePlaceholderService.buildPlaceholders(dossier); XWPFDocument doc = new XWPFDocument(templateResource.getInputStream()); - wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, dossierTemplateId, doc, fileStatus, project, true); + wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, true); byte[] report = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/iuclid_report_2.docx")) { @@ -490,7 +498,7 @@ public class RedactionReportIntegrationTest { FileModel fileModel = FileModel.builder().filename("filename").fileAttributes(attributeIdToValue).build(); FileModel fileModel2 = FileModel.builder().filename("other file").fileAttributes(attributeIdToValue).build(); - Dossier dossier = Dossier.builder().id("dossierId").dossierName("projectName").build(); + Dossier dossier = Dossier.builder().id("dossierId").dossierName("dossierName").build(); when(reportTemplateClient.getReportTemplate(dossierTemplateId, templateId)).thenReturn(ReportTemplate.builder() .dossierTemplateId(dossierTemplateId) @@ -499,8 +507,9 @@ public class RedactionReportIntegrationTest { ClassPathResource excelTemplateResource = new ClassPathResource("templates/Excel Report.xlsx"); XSSFWorkbook workbook = new XSSFWorkbook(excelTemplateResource.getInputStream()); - excelTemplateReportGenerationService.generateReport(emptyReportEntries, "dossierTemplateId", workbook, fileModel, dossier, false); - excelTemplateReportGenerationService.generateReport(reportEntries2, "dossierTemplateId", workbook, fileModel2, dossier, true); + var placeholders = generatePlaceholderService.buildPlaceholders(dossier); + excelTemplateReportGenerationService.generateReport(emptyReportEntries, placeholders, "test", workbook, fileModel, dossier, false); + excelTemplateReportGenerationService.generateReport(reportEntries2, placeholders, "test", workbook, fileModel2, dossier, true); byte[] excelTemplateReport = excelTemplateReportGenerationService.toByteArray(workbook); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/report_excel_templateAAA.xlsx")) { fileOutputStream.write(excelTemplateReport); @@ -533,7 +542,7 @@ public class RedactionReportIntegrationTest { FileModel fileStatus = FileModel.builder().filename("VV123456").build(); FileModel fileStatus2 = FileModel.builder().filename("second file").build(); - Dossier project = Dossier.builder().id("dossierId").dossierName("projectName").build(); + Dossier dossier = Dossier.builder().id("dossierId").dossierName("dossierName").build(); String templateId = "templateId"; String storageId = "storageId"; @@ -545,8 +554,10 @@ public class RedactionReportIntegrationTest { ClassPathResource templateResource = new ClassPathResource("templates/Seeds-NewJustificationForm.docx"); when(reportStorageService.getReportTemplate(storageId)).thenReturn(IOUtils.toByteArray(templateResource.getInputStream())); XWPFDocument doc = new XWPFDocument(templateResource.getInputStream()); - doc = wordReportGenerationService.generateReport(ReportType.WORD_TEMPLATE_MULTI_FILE, reportEntries, dossierTemplateId, doc, fileStatus, project, false); - doc = wordReportGenerationService.generateReport(ReportType.WORD_TEMPLATE_MULTI_FILE, reportEntries2, dossierTemplateId, doc, fileStatus2, project, true); + var placeholders = generatePlaceholderService.buildPlaceholders(dossier); + + doc = wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, false); + doc = wordReportGenerationService.generateReport(reportEntries2, placeholders, "test", doc, fileStatus2, dossier, true); byte[] report = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/seedsReport.docx")) {