From fe86da316cfeb38a097a4f45ec2ca065a01eb9d4 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Tue, 21 Feb 2023 16:37:41 +0100 Subject: [PATCH] RED-6098: added SKIPPED_PLACEHOLDER and its logic to list skipped redactions in Excel reports --- .../v1/server/model/ReportRedactionEntry.java | 1 + .../service/ExcelReportGenerationService.java | 6 +++- .../v1/server/service/PlaceholderService.java | 4 ++- .../service/RedactionLogConverterService.java | 7 ++-- .../RedactionReportV2IntegrationTest.java | 31 +++++++++--------- .../resources/templates/Excel Report.xlsx | Bin 10418 -> 6055 bytes 6 files changed, 29 insertions(+), 20 deletions(-) diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java index 01a80b9..8754de6 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java @@ -17,5 +17,6 @@ public class ReportRedactionEntry { private String excerpt; private String value; private String entityDisplayName; + private boolean isSkipped; } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelReportGenerationService.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 index d2f9793..14c8f9e 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelReportGenerationService.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 @@ -26,6 +26,7 @@ import static com.iqser.red.service.redaction.report.v1.server.service.Placehold import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.SCM_FUNCTION_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 static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.SKIPPED_PLACEHOLDER; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -338,7 +339,7 @@ public class ExcelReportGenerationService { JUSTIFICATION_PARAGRAPH_PLACEHOLDER) || text.contains(JUSTIFICATION_REASON_PLACEHOLDER) || text.contains(REDACTION_VALUE_PLACEHOLDER) || text.contains( JUSTIFICATION_LEGAL_BASIS_PLACEHOLDER) || text.contains(JUSTIFICATION_TEXT_PLACEHOLDER) || text.contains( SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER) || text.contains(SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER) || text.contains( - REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER) || text.contains(SCM_FUNCTION_PLACEHOLDER); + REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER) || text.contains(SCM_FUNCTION_PLACEHOLDER) || text.contains(SKIPPED_PLACEHOLDER); } @@ -385,6 +386,9 @@ public class ExcelReportGenerationService { if (placeholder.equals(REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER)) { return input -> input.getEntry().getEntityDisplayName(); } + if (placeholder.equals(SKIPPED_PLACEHOLDER)) { + return input -> input.getEntry().isSkipped() ? "true" : ""; + } return input -> ""; } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java index 4b6c115..5f04b08 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java @@ -48,6 +48,7 @@ public class PlaceholderService { public static final String EXCERPT_PLACEHOLDER = "{{redaction.excerpt}}"; public static final String REDACTION_VALUE_PLACEHOLDER = "{{redaction.value}}"; public static final String REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER = "{{redaction.entity.displayName}}"; + public static final String SKIPPED_PLACEHOLDER = "{{redaction.skipped}}"; public static final String SCM_FUNCTION_PLACEHOLDER = "{{function.scm}}"; public static final String FILE_ATTRIBUTE_PLACEHOLDER_BASE = "{{file.attribute."; public static final String DOSSIER_ATTRIBUTE_PLACEHOLDER_BASE = "{{dossier.attribute."; @@ -94,7 +95,8 @@ public class PlaceholderService { JUSTIFICATION_TEXT_PLACEHOLDER, SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER, SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER, - REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER); + REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER, + SKIPPED_PLACEHOLDER); } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/RedactionLogConverterService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/RedactionLogConverterService.java index 95d95e0..f338cbb 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/RedactionLogConverterService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/RedactionLogConverterService.java @@ -82,8 +82,8 @@ public class RedactionLogConverterService { List reportEntries = new ArrayList<>(); redactionLog.getRedactionLogEntry().forEach(entry -> { - - if (entry.isRedacted()) { + var isSkipped = !entry.isRedacted() && !entry.isHint(); + if (entry.isRedacted() || isSkipped) { if (entry.lastChangeIsRemoved()) { return; @@ -133,7 +133,8 @@ public class RedactionLogConverterService { .orElse(""), checkTextForNull(entry.getTextBefore()) + entry.getValue() + checkTextForNull(entry.getTextAfter()), entry.getValue(), - mapOfEntityDisplayName.get(entry.getType()))); + mapOfEntityDisplayName.get(entry.getType()), + isSkipped)); } } } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java index 6ff97b1..51ffc02 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportV2IntegrationTest.java @@ -256,21 +256,6 @@ public class RedactionReportV2IntegrationTest { } - @Configuration - @EnableAutoConfiguration(exclude = {StorageAutoConfiguration.class, RabbitAutoConfiguration.class}) - @ComponentScan("com.iqser.red.service.persistence") - public static class TestConfiguration { - - @Bean - @Primary - public StorageService inmemoryStorage() { - - return new FileSystemBackedStorageService(); - } - - } - - private List createFileModels(int numOfFileModelsToCreate) { if (numOfFileModelsToCreate <= 0) { @@ -284,4 +269,20 @@ public class RedactionReportV2IntegrationTest { return fileModels; } + + @Configuration + @EnableAutoConfiguration(exclude = {StorageAutoConfiguration.class, RabbitAutoConfiguration.class}) + @ComponentScan("com.iqser.red.service.persistence") + public static class TestConfiguration { + + @Bean + @Primary + public StorageService inmemoryStorage() { + + return new FileSystemBackedStorageService(); + } + + + } + } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/Excel Report.xlsx b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/Excel Report.xlsx index db2fc88deab89ab84efe2d05643cd16630883f39..3889cd9b8ffaa50e51516d26ce45c8d829a09154 100644 GIT binary patch literal 6055 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 literal 10418 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