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 3363feb..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 @@ -54,11 +54,6 @@ 5.0.0 - - org.springframework.boot - spring-boot-starter-aop - - org.springframework.boot spring-boot-starter-amqp diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ExcelCell.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ExcelCell.java new file mode 100644 index 0000000..9e9027f --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ExcelCell.java @@ -0,0 +1,13 @@ +package com.iqser.red.service.redaction.report.v1.server.model; + +import org.apache.poi.ss.usermodel.Cell; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class ExcelCell { + + private Cell cell; + private int columnWidth; + private int rowHeights; +} diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ExcelModel.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ExcelModel.java index cef2952..274c746 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ExcelModel.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ExcelModel.java @@ -1,6 +1,8 @@ package com.iqser.red.service.redaction.report.v1.server.model; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; @@ -16,9 +18,12 @@ import lombok.NoArgsConstructor; public class ExcelModel { private Map> placeholderCellPos; - private int placeholderRow; + private int redactionPlaceholderRow; private Map cellWidths = new HashMap<>(); - private Map cellsToCopy = new HashMap<>(); - private boolean copyDone; + private Map cellsToCopyBeforeRedactionPlaceholderRow = new HashMap<>(); + private Map cellsToCopyAfterRedactionPlaceholderRow = new HashMap<>(); + + private List writtenRows = new ArrayList<>(); + private boolean rowsBeforeRedactionEntryRowsAdded; } 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/ExcelReportGenerationService.java similarity index 58% rename from redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelTemplateReportGenerationService.java rename to redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelReportGenerationService.java index 7b694de..89297e3 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/ExcelReportGenerationService.java @@ -25,6 +25,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.OffsetDateTime; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -37,11 +38,6 @@ import java.util.regex.Pattern; import javax.imageio.ImageIO; -import com.iqser.red.service.redaction.report.v1.server.model.CellIdentifier; -import com.iqser.red.service.redaction.report.v1.server.model.ExcelModel; -import com.iqser.red.service.redaction.report.v1.server.model.ImagePlaceholder; -import com.iqser.red.service.redaction.report.v1.server.model.PlaceholderModel; - import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.ClientAnchor; @@ -51,14 +47,17 @@ import org.apache.poi.ss.usermodel.Picture; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Service; -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.ReportRedactionEntry; +import com.iqser.red.service.redaction.report.v1.server.model.CellIdentifier; +import com.iqser.red.service.redaction.report.v1.server.model.ExcelModel; +import com.iqser.red.service.redaction.report.v1.server.model.ImagePlaceholder; import com.iqser.red.service.redaction.report.v1.server.model.PlaceholderInput; +import com.iqser.red.service.redaction.report.v1.server.model.PlaceholderModel; +import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry; +import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -66,71 +65,94 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor -@SuppressWarnings("PMD") -public class ExcelTemplateReportGenerationService { +public class ExcelReportGenerationService { - @SuppressWarnings("checkstyle:ParameterAssignment") - public ExcelModel generateReport(List reportEntries, PlaceholderModel placeholderModel, - String reportTemplateName, SXSSFWorkbook workbook, FileModel fileStatus, - ExcelModel excelModel) { + @Timed("generateExcelReport") + public void generateExcelReport(List reportEntries, PlaceholderModel placeholderModel, + String reportTemplateName, SXSSFWorkbook workbook, String dossierName, + FileModel fileModel, ExcelModel excelModel, boolean isLastFile) { long start = System.currentTimeMillis(); try { + for (Sheet sheet : workbook) { - if(!excelModel.isCopyDone()) { + + if (!excelModel.isRowsBeforeRedactionEntryRowsAdded()) { + for (Map.Entry colummWidthEntry : excelModel.getCellWidths().entrySet()) { sheet.setColumnWidth(colummWidthEntry.getKey(), colummWidthEntry.getValue()); } - Set createdRows = new HashSet<>(); - for (Map.Entry cellsToCopyEntry : excelModel.getCellsToCopy().entrySet()) { - if (!createdRows.contains(cellsToCopyEntry.getKey().getRowIndex())) { - sheet.createRow(cellsToCopyEntry.getKey().getRowIndex()); - createdRows.add(cellsToCopyEntry.getKey().getRowIndex()); - } - - var createdCell = sheet.getRow(cellsToCopyEntry.getKey().getRowIndex()) - .createCell(cellsToCopyEntry.getKey().getColumnIndex()); - createdCell.setCellValue(cellsToCopyEntry.getValue().getStringCellValue()); - CellStyle newCellStyle = workbook.createCellStyle(); - newCellStyle.cloneStyleFrom(cellsToCopyEntry.getValue().getCellStyle()); - createdCell.setCellStyle(newCellStyle); - } - excelModel.setCopyDone(true); + addRows(workbook, sheet, excelModel.getCellsToCopyBeforeRedactionPlaceholderRow(), 0, placeholderModel, dossierName, fileModel.getFilename()); + excelModel.setRowsBeforeRedactionEntryRowsAdded(true); } - excelModel = addEntryRows(sheet, reportEntries, fileStatus.getFilename(), excelModel, placeholderModel); + addRedactionEntryRows(sheet, reportEntries, fileModel.getFilename(), excelModel, placeholderModel); -// for (ImagePlaceholder imagePlaceholder : placeholderModel.getImagePlaceholders()){ -// replacePlaceholdersForImagePlaceholder(workbook, sheet, imagePlaceholder); -// } -// for (String placeholder : placeholderModel.getPlaceholders()) { -// String placeholderValue = getPlaceholderValue(placeholder, dossier, fileStatus, placeholderModel.getFileAttributePlaceHolders(), placeholderModel.getDossierAttributesPlaceholder()); -// if (placeholderValue != null) { -// replacePlaceholdersForTextPlaceholder(sheet, placeholder, placeholderValue); -// } -// } + if (isLastFile) { + addRows(workbook, sheet, excelModel.getCellsToCopyAfterRedactionPlaceholderRow(), excelModel.getWrittenRows() + .size(), placeholderModel, dossierName, fileModel.getFilename()); + } } - 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()); + log.info("Report Generation took: {} for file with id {}, pageCount: {}, redactionLogEntryCount: {}, reportName: {}, className: {}", System.currentTimeMillis() - start, fileModel.getId(), fileModel.getNumberOfPages(), reportEntries.size(), reportTemplateName, getClass().getSimpleName()); } catch (Exception e) { throw new RuntimeException(e); } - - return excelModel; } - public ExcelModel caculateExcelModel(Sheet sheet) { + @SneakyThrows + @Timed("excel-addRows") + private void addRows(SXSSFWorkbook workbook, Sheet sheet, Map copiedCells, + int numberOfRowsToShift, PlaceholderModel placeholderModel, String dossierName, + String filename) { + + Set createdCopyRows = new HashSet<>(); + for (Map.Entry cellsToCopyEntry : copiedCells.entrySet()) { + + int indexToAddRow = cellsToCopyEntry.getKey().getRowIndex() + numberOfRowsToShift; + + if (!createdCopyRows.contains(indexToAddRow)) { + sheet.createRow(indexToAddRow); + createdCopyRows.add(indexToAddRow); + } + + var createdCell = sheet.getRow(indexToAddRow).createCell(cellsToCopyEntry.getKey().getColumnIndex()); + createdCell.setCellValue(cellsToCopyEntry.getValue().getStringCellValue()); + CellStyle newCellStyle = workbook.createCellStyle(); + newCellStyle.cloneStyleFrom(cellsToCopyEntry.getValue().getCellStyle()); + createdCell.setCellStyle(newCellStyle); + createdCell.getRow().setHeight(cellsToCopyEntry.getValue().getRow().getHeight()); + + replacePlaceholders(createdCell, placeholderModel, dossierName, filename); + replacePlaceholdersForImagePlaceholder(workbook, sheet, createdCell, placeholderModel); + } + } + + + private void replacePlaceholders(Cell cell, PlaceholderModel placeholderModel, String dossierName, + String filename) { + + for (String placeholder : placeholderModel.getPlaceholders()) { + String placeholderValue = getPlaceholderValue(placeholder, dossierName, filename, placeholderModel); + if (placeholderValue != null) { + replacePlaceholdersForCell(cell, placeholder, placeholderValue); + } + } + } + + + @Timed("calculateExcelModel") + public ExcelModel calculateExcelModel(Sheet sheet) { long start = System.currentTimeMillis(); Map> placeholderCellPos = new HashMap<>(); Map columnWidths = new HashMap<>(); - Map cellsToCopy = new HashMap<>(); + Map cellsToCopyBeforePlaceholderRow = new HashMap<>(); + Map cellsToCopyAfterPlaceholderRow = new HashMap<>(); int placeholderRow = -1; for (int j = 0; j < sheet.getLastRowNum() + 1; j++) { Row actualRow = sheet.getRow(j); @@ -138,42 +160,51 @@ public class ExcelTemplateReportGenerationService { for (int i = 0; i < actualRow.getLastCellNum(); i++) { Cell cell = sheet.getRow(j).getCell(i); if (cell != null) { + int columnWidth = sheet.getColumnWidth(i); + columnWidths.put(i, columnWidth); if (containsRedactionPlaceholder(cell.getStringCellValue())) { - int columnWidth = sheet.getColumnWidth(i); - columnWidths.put(i, columnWidth); + placeholderCellPos.put(i, getFunctionForPlaceHolder(cell.getStringCellValue())); placeholderRow = j; } else { - cellsToCopy.put(new CellIdentifier(j, i), cell); + if (placeholderRow == -1) { + cellsToCopyBeforePlaceholderRow.put(new CellIdentifier(j, i), cell); + } else { + cellsToCopyAfterPlaceholderRow.put(new CellIdentifier(j, i), cell); + } } } } } } log.debug("Calculate Placeholder Cells took: {}", System.currentTimeMillis() - start); - return new ExcelModel(placeholderCellPos, placeholderRow, columnWidths, cellsToCopy, false); + return new ExcelModel(placeholderCellPos, placeholderRow, columnWidths, cellsToCopyBeforePlaceholderRow, cellsToCopyAfterPlaceholderRow, new ArrayList<>(), false); } - @SuppressWarnings("checkstyle:ParameterAssignment") - private ExcelModel addEntryRows(Sheet sheet, List reportEntries, String filename, ExcelModel excelModel, PlaceholderModel placeholderModel) { + @Timed("excel-addRedactionEntryRows") + private void addRedactionEntryRows(Sheet sheet, List reportEntries, String filename, + ExcelModel excelModel, PlaceholderModel placeholderModel) { long start = System.currentTimeMillis(); - AtomicInteger rowIndex = new AtomicInteger(excelModel.getPlaceholderRow()); + AtomicInteger rowIndex = new AtomicInteger(excelModel.getRedactionPlaceholderRow()); Map> placeholderCellPos = excelModel.getPlaceholderCellPos(); reportEntries.forEach(entry -> { + sheet.createRow(rowIndex.get()); + excelModel.getWrittenRows().add(rowIndex.get()); for (Map.Entry> entry1 : placeholderCellPos.entrySet()) { Cell cell = sheet.getRow(rowIndex.get()).createCell(entry1.getKey()); - cell.setCellValue(entry1.getValue().apply(new PlaceholderInput(filename, entry, placeholderModel, null))); + cell.setCellValue(entry1.getValue() + .apply(new PlaceholderInput(filename, entry, placeholderModel, null))); } rowIndex.getAndIncrement(); }); - log.debug("Adding rows took: {}", System.currentTimeMillis() - start); - excelModel.setPlaceholderRow(rowIndex.getAndIncrement()); - return excelModel; + excelModel.setRedactionPlaceholderRow(rowIndex.getAndIncrement()); + + log.debug("Adding rows took: {}", System.currentTimeMillis() - start); } @@ -218,61 +249,53 @@ public class ExcelTemplateReportGenerationService { .replaceAll("\n", " ") .replaceAll(" ", " ") : ""; } - // TODO in case placeholder is invalid -> do not replace with empty string but throw previus exception return (input) -> ""; } - private void replacePlaceholdersForTextPlaceholder(Sheet sheet, String search, String replace) { + private void replacePlaceholdersForCell(Cell cell, String search, String replace) { - for (Row row : sheet) { - for (Cell cell : row) { - if (cell.getStringCellValue().contains(search)) { - String safeToUseInReplaceAllString = Pattern.quote(search); - String escapedReplace = Matcher.quoteReplacement(replace); - String str = cell.getStringCellValue().replaceAll(safeToUseInReplaceAllString, escapedReplace); - cell.setCellValue(str); - } - } + if (cell.getStringCellValue().contains(search)) { + String safeToUseInReplaceAllString = Pattern.quote(search); + String escapedReplace = Matcher.quoteReplacement(replace); + String str = cell.getStringCellValue().replaceAll(safeToUseInReplaceAllString, escapedReplace); + cell.setCellValue(str); } } - private void replacePlaceholdersForImagePlaceholder(XSSFWorkbook workbook, Sheet sheet, - ImagePlaceholder imagePlaceholder) throws IOException { + private void replacePlaceholdersForImagePlaceholder(SXSSFWorkbook workbook, Sheet sheet, Cell cell, + PlaceholderModel placeholderModel) throws IOException { - for (Row row : sheet) { - for (Cell cell : row) { - if (cell.getStringCellValue().contains(imagePlaceholder.getPlaceholder())) { - try (ByteArrayInputStream is = new ByteArrayInputStream(imagePlaceholder.getImage())) { + for (ImagePlaceholder imagePlaceholder : placeholderModel.getImagePlaceholders()) { -// ByteArrayInputStream scaledImage = getScaledImage(is, PixelUtil.widthUnits2Pixel((short) sheet.getColumnWidth(cell.getColumnIndex())), PixelUtil.heightUnits2Pixel(cell.getRow().getHeight())); -// is.reset(); + if (cell.getStringCellValue().contains(imagePlaceholder.getPlaceholder())) { + try (ByteArrayInputStream is = new ByteArrayInputStream(imagePlaceholder.getImage())) { - double factor = calculateScale(is, PixelUtil.widthUnits2Pixel((short) sheet.getColumnWidth(cell.getColumnIndex())), PixelUtil.heightUnits2Pixel(cell.getRow() - .getHeight())); - is.reset(); + double factor = calculateScale(is, PixelUtil.widthUnits2Pixel((short) sheet.getColumnWidth(cell.getColumnIndex())), PixelUtil.heightUnits2Pixel(cell.getRow() + .getHeight())); + is.reset(); - int pictureIdx = workbook.addPicture(is, XSSFWorkbook.PICTURE_TYPE_JPEG); - is.reset(); + int pictureIdx = workbook.addPicture(is.readAllBytes(), SXSSFWorkbook.PICTURE_TYPE_JPEG); + is.reset(); - //Returns an object that handles instantiating concrete classes - CreationHelper helper = workbook.getCreationHelper(); - //Create an anchor that is attached to the worksheet - ClientAnchor anchor = helper.createClientAnchor(); - anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE); + //Returns an object that handles instantiating concrete classes + CreationHelper helper = workbook.getCreationHelper(); + //Create an anchor that is attached to the worksheet + ClientAnchor anchor = helper.createClientAnchor(); + anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE); - anchor.setCol1(cell.getColumnIndex()); - anchor.setRow1(cell.getRowIndex()); + anchor.setCol1(cell.getColumnIndex()); + anchor.setRow1(cell.getRowIndex()); - //Creates the top-level drawing patriarch. - Drawing drawing = sheet.createDrawingPatriarch(); + //Creates the top-level drawing patriarch. + Drawing drawing = sheet.createDrawingPatriarch(); - Picture picture = drawing.createPicture(anchor, pictureIdx); - picture.resize(factor); + Picture picture = drawing.createPicture(anchor, pictureIdx); + picture.resize(factor); + + cell.setCellValue(""); - cell.setCellValue(""); - } } } } @@ -301,9 +324,8 @@ public class ExcelTemplateReportGenerationService { } - private String getPlaceholderValue(String placeholder, Dossier project, FileModel fileStatus, - Map fileAttributePlaceholders, - Map dossierAttributesPlaceholders) { + private String getPlaceholderValue(String placeholder, String dossierName, String filename, + PlaceholderModel placeholderModel) { if (placeholder.equals(FORMAT_DATE_ISO_PLACEHOLDER)) { return OffsetDateTime.now().format(FORMAT_DATE_ISO); @@ -318,23 +340,19 @@ public class ExcelTemplateReportGenerationService { return OffsetDateTime.now().format(FORMAT_TIME_ISO); } if (placeholder.equals(DOSSIER_NAME_PLACEHOLDER)) { - return project.getDossierName(); + return dossierName; } if (placeholder.equals(FILE_NAME_PLACEHOLDER)) { - return null; + return filename; + } + if (placeholderModel.getFileAttributeValueByPlaceholder().containsKey(placeholder)) { + return placeholderModel.getFileAttributeValueByPlaceholder().get(placeholder); } - if (fileAttributePlaceholders.containsKey(placeholder)) { - String id = fileAttributePlaceholders.get(placeholder); - if (fileStatus.getFileAttributes().containsKey(id)) { - return fileStatus.getFileAttributes().get(id); - } else { - return null; - } - } - if (dossierAttributesPlaceholders.containsKey(placeholder)) { - return dossierAttributesPlaceholders.get(placeholder); + if (placeholderModel.getDossierAttributesValueByPlaceholder().containsKey(placeholder)) { + return placeholderModel.getDossierAttributesValueByPlaceholder().get(placeholder); } + return null; } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/IuclidFunctionService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/IuclidFunctionService.java index 12b8c38..c757ea0 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/IuclidFunctionService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/IuclidFunctionService.java @@ -11,9 +11,12 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry; +import io.micrometer.core.annotation.Timed; + @Service public class IuclidFunctionService { + @Timed("computeIuclidFunction") public String computeIuclidFunction(List reportRedactionEntries, String filename) { Map> entriesPerJustification = new HashMap<>(); 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 992426e..ecd9aeb 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 @@ -1,5 +1,18 @@ package com.iqser.red.service.redaction.report.v1.server.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 org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.springframework.stereotype.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; @@ -22,30 +35,14 @@ import com.iqser.red.service.redaction.v1.model.RedactionLog; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; +import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -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.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - @Slf4j @Service @RequiredArgsConstructor -@SuppressWarnings("PMD") public class ReportGenerationService { private final ReportStorageService reportStorageService; @@ -55,12 +52,13 @@ public class ReportGenerationService { private final DossierClient dossierClient; private final ReportTemplateClient reportTemplateClient; private final RedactionLogClient redactionLogClient; - private final ExcelTemplateReportGenerationService excelTemplateReportGenerationService; + private final ExcelReportGenerationService excelTemplateReportGenerationService; private final GeneratePlaceholderService generatePlaceholderService; @SneakyThrows - public List generateReport(ReportRequestMessage reportMessage) { + @Timed("generateReports") + public List generateReports(ReportRequestMessage reportMessage) { List storedFileInformation = Collections.synchronizedList(new ArrayList<>()); @@ -78,7 +76,7 @@ public class ReportGenerationService { try (ByteArrayInputStream is = new ByteArrayInputStream(excelTemplate)) { XSSFWorkbook readWorkbook = new XSSFWorkbook(is); SXSSFWorkbook writeWorkbook = new SXSSFWorkbook(); - for(Sheet sheet: readWorkbook){ + for (Sheet sheet : readWorkbook) { writeWorkbook.createSheet(sheet.getSheetName()); } MultiFileWorkbook multiFileWorkbook = new MultiFileWorkbook(readWorkbook, writeWorkbook, templateId, reportTemplate.getFileName()); @@ -117,29 +115,27 @@ public class ReportGenerationService { 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 : multiFileWorkbooks) { - if(excelModel == null){ - excelModel = excelTemplateReportGenerationService.caculateExcelModel(multiFileWorkbook.getReadWorkBook().getSheetAt(0)); + if (excelModel == null) { + excelModel = excelTemplateReportGenerationService.calculateExcelModel(multiFileWorkbook.getReadWorkBook() + .getSheetAt(0)); } - excelModel = excelTemplateReportGenerationService.generateReport(reportEntries, placeholderModel, multiFileWorkbook.getTemplateName(), multiFileWorkbook.getWriteWorkbook(), fileStatus, excelModel); + excelTemplateReportGenerationService.generateExcelReport(reportEntries, placeholderModel, multiFileWorkbook.getTemplateName(), multiFileWorkbook.getWriteWorkbook(), dossier.getDossierName(), fileStatus, excelModel, isLastFile); } for (MultiFileDocument multiFileDocument : multiFileDocuments) { - wordReportGenerationService.generateReport(reportEntries, placeholderModel, multiFileDocument.getTemplateName(), multiFileDocument.getDocument(), fileStatus, dossier, isLastFile); - + wordReportGenerationService.generateWordReport(reportEntries, placeholderModel, multiFileDocument.getTemplateName(), multiFileDocument.getDocument(), fileStatus, dossier, isLastFile); } for (ReportTemplate reportTemplate : singleFilesTemplates) { storedFileInformation.add(createReportFromTemplate(dossier, fileStatus, placeholderModel, reportTemplate.getFileName(), reportMessage.getDownloadId(), reportEntries, reportTemplate)); - } long end = System.currentTimeMillis(); @@ -174,11 +170,11 @@ public class ReportGenerationService { try (ByteArrayInputStream is = new ByteArrayInputStream(excelTemplate)) { XSSFWorkbook readWorkbook = new XSSFWorkbook(is); SXSSFWorkbook writeWorkbook = new SXSSFWorkbook(); - for(Sheet sheet: readWorkbook){ + for (Sheet sheet : readWorkbook) { writeWorkbook.createSheet(sheet.getSheetName()); } - var excelModel = excelTemplateReportGenerationService.caculateExcelModel(readWorkbook.getSheetAt(0)); - excelTemplateReportGenerationService.generateReport(reportEntries, placeholderModel, templateName, writeWorkbook, fileStatus, excelModel); + var excelModel = excelTemplateReportGenerationService.calculateExcelModel(readWorkbook.getSheetAt(0)); + excelTemplateReportGenerationService.generateExcelReport(reportEntries, placeholderModel, templateName, writeWorkbook, dossier.getDossierName(), fileStatus, excelModel, true); byte[] template = excelTemplateReportGenerationService.toByteArray(writeWorkbook); String storageId = reportStorageService.storeObject(downloadId, template); return new StoredFileInformation(fileStatus.getId(), storageId, ReportType.EXCEL_TEMPLATE_SINGLE_FILE, reportTemplate.getTemplateId()); @@ -189,7 +185,7 @@ public class ReportGenerationService { 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); + wordReportGenerationService.generateWordReport(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()); @@ -200,6 +196,7 @@ public class ReportGenerationService { } + @Timed("getReportEntries") private List getReportEntries(String dossierId, String fileId, boolean isExcluded) { if (isExcluded) { @@ -228,7 +225,4 @@ 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/ReportMessageReceiver.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportMessageReceiver.java index 7fc04d0..fbfaf0d 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportMessageReceiver.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportMessageReceiver.java @@ -36,7 +36,7 @@ public class ReportMessageReceiver { long start = System.currentTimeMillis(); log.info("Start generating reports for downloadId {}", reportMessage.getDownloadId()); - List storedFileInformation = reportGenerationService.generateReport(reportMessage); + List storedFileInformation = reportGenerationService.generateReports(reportMessage); addToReportResultQueue(reportMessage.getUserId(), reportMessage.getDownloadId(), storedFileInformation, 1); long end = System.currentTimeMillis(); 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 7b962f0..cd439e9 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 @@ -34,16 +34,15 @@ import static com.iqser.red.service.redaction.report.v1.server.service.Placehold @Slf4j @Service @RequiredArgsConstructor -@SuppressWarnings("PMD") public class WordReportGenerationService { private final IuclidFunctionService iuclidFunctionService; @Timed("generateWordReport") - public XWPFDocument generateReport(List reportEntries, PlaceholderModel placeholderModel, - String reportTemplateName, XWPFDocument doc, FileModel fileModel, - Dossier dossier, boolean isLastFile) { + public XWPFDocument generateWordReport(List reportEntries, PlaceholderModel placeholderModel, + String reportTemplateName, XWPFDocument doc, FileModel fileModel, + Dossier dossier, boolean isLastFile) { long start = System.currentTimeMillis(); @@ -53,26 +52,19 @@ public class WordReportGenerationService { replaceImagePlaceholders(doc, imagePlaceholder); } - long t1 = System.currentTimeMillis(); XWPFTable table = getRedactionTable(doc); - var placeholderFunctions = computePlaceholderPos(table, placeholderModel); - addTableRows(table, reportEntries, fileModel.getFilename(), placeholderModel, placeholderFunctions); - long t2 = System.currentTimeMillis(); - log.debug("Table time: {}", (t2 - t1)); - t1 = System.currentTimeMillis(); + var placeholderFunctions = computePlaceholderPos(table, placeholderModel); + + addRedactionEntryRows(table, reportEntries, fileModel.getFilename(), placeholderModel, placeholderFunctions); + replaceTextPlaceholders(doc, placeholderModel, dossier.getDossierName(), fileModel.getFilename(), table, reportEntries); if (isLastFile) { removePlaceholdersRow(table); } - t2 = System.currentTimeMillis(); - log.debug("Text time: {}", (t2 - t1)); - - long end = System.currentTimeMillis(); - - log.info("Report Generation took: {} for file with id {}, pageCount: {}, redactionLogEntryCount: {}, reportName: {}, className: {}", end - start, fileModel.getId(), fileModel.getNumberOfPages(), reportEntries.size(), reportTemplateName, getClass().getSimpleName()); + log.info("Report Generation took: {} for file with id {}, pageCount: {}, redactionLogEntryCount: {}, reportName: {}, className: {}", System.currentTimeMillis() - start, fileModel.getId(), fileModel.getNumberOfPages(), reportEntries.size(), reportTemplateName, getClass().getSimpleName()); return doc; } catch (Exception e) { @@ -175,6 +167,7 @@ public class WordReportGenerationService { } + @Timed("word-replaceTextPlaceholders") public void replaceTextPlaceholders(XWPFDocument doc, PlaceholderModel placeholderModel, String dossierName, String fileName, XWPFTable tableToSkip, List reportRedactionEntries) { @@ -267,6 +260,7 @@ public class WordReportGenerationService { } + @Timed("word-computePlaceholderPos") private PlaceHolderFunctions computePlaceholderPos(XWPFTable table, PlaceholderModel placeholderModel) { Set foundPlaceHolder = new HashSet<>(); @@ -288,23 +282,25 @@ public class WordReportGenerationService { } - private void addTableRows(XWPFTable table, List reportEntries, String filename, - PlaceholderModel placeholderModel, PlaceHolderFunctions placeHolderFunctions) { + @Timed("word-addRedactionEntryRows") + private void addRedactionEntryRows(XWPFTable table, List reportEntries, String filename, + PlaceholderModel placeholderModel, PlaceHolderFunctions placeHolderFunctions) { if (table == null) { return; } - if (placeHolderFunctions.getFoundPlaceHolder().contains(SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER)) { + if (placeHolderFunctions.getFoundPlaceHolder() + .contains(SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER)) { var redactionsPerJustification = getRedactionsPerJustification(reportEntries); - for (Map.Entry> entry : redactionsPerJustification.entrySet()) { XWPFTableRow row = table.createRow(); for (Map.Entry> entry1 : placeHolderFunctions.getFunctionPerPlaceHolder() .entrySet()) { - setText(row.getCell(entry1.getKey()), entry1.getValue().apply(new PlaceholderInput(filename, null, placeholderModel, entry))); + setText(row.getCell(entry1.getKey()), entry1.getValue() + .apply(new PlaceholderInput(filename, null, placeholderModel, entry))); } } } else { @@ -312,7 +308,8 @@ public class WordReportGenerationService { XWPFTableRow row = table.createRow(); for (Map.Entry> entry1 : placeHolderFunctions.getFunctionPerPlaceHolder() .entrySet()) { - setText(row.getCell(entry1.getKey()), entry1.getValue().apply(new PlaceholderInput(filename, entry, placeholderModel, null))); + setText(row.getCell(entry1.getKey()), entry1.getValue() + .apply(new PlaceholderInput(filename, entry, placeholderModel, null))); } }); } 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 8002e82..37cb5ba 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 @@ -3,13 +3,7 @@ package com.iqser.red.service.redaction.report.v1.server; import com.amazonaws.services.s3.AmazonS3; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -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.FileAttributeConfig; -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.server.client.DossierAttributesClient; @@ -20,7 +14,7 @@ import com.iqser.red.service.redaction.report.v1.server.configuration.MessagingC 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 com.iqser.red.service.redaction.report.v1.server.service.ExcelTemplateReportGenerationService; +import com.iqser.red.service.redaction.report.v1.server.service.ExcelReportGenerationService; 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; @@ -32,7 +26,6 @@ import org.apache.commons.io.IOUtils; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -42,8 +35,6 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.test.context.junit4.SpringRunner; import java.io.FileOutputStream; -import java.io.IOException; -import java.time.OffsetDateTime; import java.util.*; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.DOSSIER_NAME_PLACEHOLDER; @@ -56,7 +47,6 @@ import static com.iqser.red.service.redaction.report.v1.server.service.Placehold 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 static com.iqser.red.service.redaction.report.v1.server.utils.OsUtils.getTemporaryDirectory; -import static org.mockito.Mockito.when; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) @@ -97,7 +87,7 @@ public class RedactionReportIntegrationTest { private DossierAttributesClient dossierAttributesClient; @Autowired - private ExcelTemplateReportGenerationService excelTemplateReportGenerationService; + private ExcelReportGenerationService excelTemplateReportGenerationService; @Autowired private GeneratePlaceholderService generatePlaceholderService; @@ -127,7 +117,7 @@ public class RedactionReportIntegrationTest { List.of(new ImagePlaceholder("{{dossier.attribute.Signature}}",IOUtils.toByteArray(imageResource.getInputStream())))); XWPFDocument doc = new XWPFDocument(wordTemplateResource.getInputStream()); - wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); + wordReportGenerationService.generateWordReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); byte[] wordReport = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/Justification Appendix A1_justification.docx")) { fileOutputStream.write(wordReport); @@ -159,7 +149,7 @@ public class RedactionReportIntegrationTest { List.of(new ImagePlaceholder("{{dossier.attribute.Signature}}",IOUtils.toByteArray(imageResource.getInputStream())))); XWPFDocument doc = new XWPFDocument(wordTemplateResource.getInputStream()); - wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); + wordReportGenerationService.generateWordReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); byte[] wordReport = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/Justification Appendix A2_justification.docx")) { fileOutputStream.write(wordReport); @@ -183,7 +173,7 @@ public class RedactionReportIntegrationTest { var placeholders = buildPlaceHolderModel(new HashMap<>(), Map.of("{{file.attribute.Path}}", "Path"), List.of()); - wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, true); + wordReportGenerationService.generateWordReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, true); byte[] report = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/IUCLID_Template_justification.docx")) { @@ -208,7 +198,7 @@ public class RedactionReportIntegrationTest { var placeholders = buildPlaceHolderModel(new HashMap<>(), Map.of("{{file.attribute.Path}}", "Path"), List.of()); - wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, true); + wordReportGenerationService.generateWordReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, true); byte[] report = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/seeds-report.docx")) { @@ -238,8 +228,8 @@ public class RedactionReportIntegrationTest { var placeholders = buildPlaceHolderModel(new HashMap<>(), Map.of("{{file.attribute.Path}}", "Path"), List.of()); - wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, false); - wordReportGenerationService.generateReport(reportEntriesSecondFile, placeholders, "test", doc, fileModelSecondFile, dossier, true); + wordReportGenerationService.generateWordReport(reportEntries, placeholders, "test", doc, fileStatus, dossier, false); + wordReportGenerationService.generateWordReport(reportEntriesSecondFile, placeholders, "test", doc, fileModelSecondFile, dossier, true); byte[] report = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/seeds-report-multifile.docx")) { @@ -274,7 +264,7 @@ public class RedactionReportIntegrationTest { List.of(new ImagePlaceholder("{{dossier.attribute.Signature}}",IOUtils.toByteArray(imageResource.getInputStream())))); XWPFDocument doc = new XWPFDocument(wordTemplateResource.getInputStream()); - wordReportGenerationService.generateReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); + wordReportGenerationService.generateWordReport(reportEntries, placeholders, "test", doc, fileModel, dossier, true); byte[] wordReport = wordReportGenerationService.toByteArray(doc); try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/6464 appendix_b EFSA dRAR_justification.docx")) { fileOutputStream.write(wordReport); @@ -297,10 +287,10 @@ public class RedactionReportIntegrationTest { var placeholders = buildPlaceHolderModel(new HashMap<>(), new HashMap<>(), List.of()); XSSFWorkbook readWorkbook = new XSSFWorkbook(templateResource.getInputStream()); - var excelModel = excelTemplateReportGenerationService.caculateExcelModel(readWorkbook.getSheetAt(0)); + var excelModel = excelTemplateReportGenerationService.calculateExcelModel(readWorkbook.getSheetAt(0)); SXSSFWorkbook writeWorkbook = new SXSSFWorkbook(); writeWorkbook.createSheet("Sheet1"); - excelTemplateReportGenerationService.generateReport(reportEntries, placeholders, "test", writeWorkbook, fileModel, excelModel); + excelTemplateReportGenerationService.generateExcelReport(reportEntries, placeholders, "test", writeWorkbook, "dossierName" ,fileModel, excelModel, true); byte[] excelTemplateReport3 = excelTemplateReportGenerationService.toByteArray(writeWorkbook); @@ -326,15 +316,15 @@ public class RedactionReportIntegrationTest { var placeholders = buildPlaceHolderModel(new HashMap<>(), new HashMap<>(), List.of()); XSSFWorkbook readWorkbook = new XSSFWorkbook(templateResource.getInputStream()); - var excelModel = excelTemplateReportGenerationService.caculateExcelModel(readWorkbook.getSheetAt(0)); + var excelModel = excelTemplateReportGenerationService.calculateExcelModel(readWorkbook.getSheetAt(0)); SXSSFWorkbook writeWorkbook = new SXSSFWorkbook(); writeWorkbook.createSheet("Sheet1"); - excelModel = excelTemplateReportGenerationService.generateReport(reportEntries, placeholders, "test", writeWorkbook, fileModel, excelModel); + excelTemplateReportGenerationService.generateExcelReport(reportEntries, placeholders, "test", writeWorkbook, "dossierName" ,fileModel, excelModel, false); RedactionLog redactionLogSecondFile = objectMapper.readValue(new ClassPathResource("files/excelReportRedactionLog.json").getInputStream(), RedactionLog.class); List reportEntriesSecondFile = redactionLogConverterService.convertAndSort(redactionLogSecondFile, legalBasisMapping); FileModel fileModelSecondFile = FileModel.builder().filename("secondFile").build(); - excelTemplateReportGenerationService.generateReport(reportEntriesSecondFile, placeholders, "test", writeWorkbook, fileModelSecondFile, excelModel); + excelTemplateReportGenerationService.generateExcelReport(reportEntriesSecondFile, placeholders, "test", writeWorkbook,"dossierName" , fileModelSecondFile, excelModel, true); byte[] excelTemplateReport3 = excelTemplateReportGenerationService.toByteArray(writeWorkbook); @@ -344,6 +334,37 @@ public class RedactionReportIntegrationTest { } + @Test + @SneakyThrows + public void testExcelPlaceholders() { + + RedactionLog redactionLog = objectMapper.readValue(new ClassPathResource("files/redactionLog.json").getInputStream(), RedactionLog.class); + List legalBasisMapping = objectMapper.readValue(new ClassPathResource("files/legalBasisMapping.json").getInputStream(), new TypeReference<>() {}); + List reportEntries = redactionLogConverterService.convertAndSort(redactionLog, legalBasisMapping); + var imageResource = new ClassPathResource("files/exampleImage.jpg"); + + FileModel fileModel = FileModel.builder().filename("filename").build(); + + ClassPathResource templateResource = new ClassPathResource("templates/Excel Report_PlaceholderTest.xlsx"); + + var placeholders = buildPlaceHolderModel(Map.of("{{dossier_attribute.test1}}", "replaced_dossier_test1"), Map.of("{{file_attribute.test1}}", "replaced_file_test1", "{{file_attribute.test2}}", "replaced_file_test2"), List.of(new ImagePlaceholder("{{dossier.attribute.Signature}}",IOUtils.toByteArray(imageResource.getInputStream())))); + + XSSFWorkbook readWorkbook = new XSSFWorkbook(templateResource.getInputStream()); + var excelModel = excelTemplateReportGenerationService.calculateExcelModel(readWorkbook.getSheetAt(0)); + SXSSFWorkbook writeWorkbook = new SXSSFWorkbook(); + writeWorkbook.createSheet("Sheet1"); + excelTemplateReportGenerationService.generateExcelReport(reportEntries, placeholders, "test", writeWorkbook,"dossierName" , fileModel, excelModel, true); + + + byte[] excelTemplateReport3 = excelTemplateReportGenerationService.toByteArray(writeWorkbook); + try (FileOutputStream fileOutputStream = new FileOutputStream(getTemporaryDirectory() + "/PlaceholderTest_justification.xlsx")) { + fileOutputStream.write(excelTemplateReport3); + } + } + + + + private PlaceholderModel buildPlaceHolderModel(Map dossierAttributes, Map fileAttributes, List imagePlaceholders){ var defaultPlaceHolder = new HashSet(Set.of(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)); diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/Excel Report_PlaceholderTest.xlsx b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/Excel Report_PlaceholderTest.xlsx new file mode 100644 index 0000000..dc965aa Binary files /dev/null and b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/Excel Report_PlaceholderTest.xlsx differ diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/TestReport.xlsx b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/TestReport.xlsx deleted file mode 100644 index 09e80a4..0000000 Binary files a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/TestReport.xlsx and /dev/null differ diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/TestReport2.xlsx b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/TestReport2.xlsx deleted file mode 100644 index 88dfc40..0000000 Binary files a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/TestReport2.xlsx and /dev/null differ