diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/pom.xml b/redaction-report-service-v1/redaction-report-service-api-v1/pom.xml index 6add97d..0759411 100644 --- a/redaction-report-service-v1/redaction-report-service-api-v1/pom.xml +++ b/redaction-report-service-v1/redaction-report-service-api-v1/pom.xml @@ -26,5 +26,11 @@ org.springframework spring-web + + com.iqser.red.service + persistence-service-api-v1 + 0.151.0 + compile + diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/PlaceholderResource.java b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/PlaceholderResource.java index 0186c4a..2f712ed 100644 --- a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/PlaceholderResource.java +++ b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/PlaceholderResource.java @@ -2,15 +2,26 @@ package com.iqser.red.service.redaction.report.v1.api.resource; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import java.util.List; public interface PlaceholderResource { String PLACEHOLDERS_PATH = "/placeholders"; + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String REPORT_TEMPLATE_ID = "reportTemplateId"; + String PLACEHOLDER = "placeholder"; + + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/dossier-template-id/{" + DOSSIER_TEMPLATE_ID + "}"; + String REPORT_TEMPLATE_ID_PATH_VARIABLE = "/report-template-id/{" + REPORT_TEMPLATE_ID + "}"; + String PLACEHOLDER_PATH_VARIABLE = "/placeholder/{" + PLACEHOLDER + "}"; @GetMapping(value = PLACEHOLDERS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) List getPlaceholders(); + @GetMapping(value = PLACEHOLDERS_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + REPORT_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + List getPlaceholdersOfTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @PathVariable(REPORT_TEMPLATE_ID) String reportTemplateId); } diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/ReportTemplateResource.java b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/ReportTemplateResource.java new file mode 100644 index 0000000..28b6d1f --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/ReportTemplateResource.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.redaction.report.v1.api.resource; + +import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +public interface ReportTemplateResource { + + String REPORT_TEMPLATE_PATH = "/report-templates"; + + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/dossier-template-id/{" + DOSSIER_TEMPLATE_ID + "}"; + + @PostMapping(value = REPORT_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + List getReportTemplatesByPlaceholder(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @RequestBody JSONPrimitive placeholder); + +} diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/PlaceholderController.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/PlaceholderController.java index c59d328..74322ae 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/PlaceholderController.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/PlaceholderController.java @@ -4,8 +4,10 @@ import com.iqser.red.service.redaction.report.v1.api.resource.PlaceholderResourc import com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; +import java.util.ArrayList; import java.util.List; @Slf4j @@ -15,9 +17,17 @@ public class PlaceholderController implements PlaceholderResource { private final PlaceholderService placeholderService; - @Override public List getPlaceholders() { + return placeholderService.getGeneralPlaceholders(); } + + @Override + public List getPlaceholdersOfTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @PathVariable(REPORT_TEMPLATE_ID) String reportTemplateId) { + + return new ArrayList<>(placeholderService.getPlaceholdersOfTemplate(dossierTemplateId, reportTemplateId)); + } + } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/ReportTemplateController.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/ReportTemplateController.java new file mode 100644 index 0000000..31026cc --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/ReportTemplateController.java @@ -0,0 +1,28 @@ +package com.iqser.red.service.redaction.report.v1.server.controller; + +import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.redaction.report.v1.api.resource.ReportTemplateResource; +import com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class ReportTemplateController implements ReportTemplateResource { + + private final PlaceholderService placeholderService; + + @Override + public List getReportTemplatesByPlaceholder(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @RequestBody JSONPrimitive placeholder) { + + return placeholderService.getReportTemplatesByPlaceholder(dossierTemplateId, placeholder.getValue()); + } +} 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 94dd45c..bd0be22 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 @@ -1,12 +1,26 @@ package com.iqser.red.service.redaction.report.v1.server.service; -import java.time.format.DateTimeFormatter; -import java.util.List; - -import org.springframework.stereotype.Service; - +import com.amazonaws.services.kms.model.NotFoundException; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; +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.client.ReportTemplateClient; +import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService; +import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xwpf.usermodel.*; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.time.format.DateTimeFormatter; +import java.util.*; @Slf4j @Service @@ -39,9 +53,152 @@ public class PlaceholderService { public static final String IUCLID_FUNCTION_PLACEHOLDER = "{{function.iuclidreport}}"; + private final ReportTemplateClient reportTemplateClient; + private final ReportStorageService reportStorageService; + private final DossierAttributesConfigClient dossierAttributesConfigClient; + private final FileAttributesConfigClient fileAttributesClient; + public List getGeneralPlaceholders() { return List.of(FILE_NAME_PLACEHOLDER, PAGE_PLACEHOLDER, PARAGRAPH_PLACEHOLDER, JUSTIFICATION_PLACEHOLDER, EXCERPT_PLACEHOLDER, FORMAT_DATE_ISO_PLACEHOLDER, FORMAT_DATE_GER_PLACEHOLDER, FORMAT_DATE_ENG_PLACEHOLDER, FORMAT_TIME_ISO_PLACEHOLDER, DOSSIER_NAME_PLACEHOLDER, IUCLID_FUNCTION_PLACEHOLDER, REDACTION_VALUE_PLACEHOLDER, JUSTIFICATION_LEGAL_BASIS_PLACEHOLDER, JUSTIFICATION_TEXT_PLACEHOLDER); } + public Set getPlaceholdersOfTemplate(String dossierTemplateId, String reportTemplateId) { + + ReportTemplate reportTemplate = reportTemplateClient.getReportTemplate(dossierTemplateId, reportTemplateId); + Set allPlaceholders = getAllPlaceholders(dossierTemplateId); + return findGivenPlaceholdersOfTemplate(reportTemplate, allPlaceholders); + } + + public List getReportTemplatesByPlaceholder(String dossierTemplateId, String placeholder) { + + List reportTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplateId); + if (reportTemplates == null || reportTemplates.isEmpty()) { + throw new NotFoundException("For dossierTemplateId '" + dossierTemplateId + "' no report templates exist."); + } + List result = new ArrayList<>(); + + for (ReportTemplate reportTemplate : reportTemplates) { + Set placeholders = findGivenPlaceholdersOfTemplate(reportTemplate, new HashSet<>(Collections.singleton(placeholder))); + if (!placeholders.isEmpty()) { + result.add(reportTemplate); + } + } + + return result; + } + + private Set findGivenPlaceholdersOfTemplate(ReportTemplate reportTemplate, Set placeholders) { + + try { + byte[] file = reportStorageService.getReportTemplate(reportTemplate.getStorageId()); + + if (StringUtils.containsIgnoreCase(reportTemplate.getStorageId(), ".xlsx")) { + return findExcelPlaceholders(file, placeholders); + + } else if (StringUtils.containsIgnoreCase(reportTemplate.getStorageId(), ".docx")) { + return findWordPlaceholders(file, placeholders); + + } else { + throw new IllegalArgumentException("The filetype is not supported for this file '" + reportTemplate.getFileName() + "'."); + } + + } catch (StorageObjectDoesNotExist e) { + throw new NotFoundException("The template '" + reportTemplate.getFileName() + "' does not exist."); + } + } + + private Set findExcelPlaceholders(byte[] template, Set allPlaceholders) { + + try (ByteArrayInputStream is = new ByteArrayInputStream(template)) { + Set resultPlaceholders = new HashSet<>(); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + loop: + for (Sheet sheet : workbook) { + for (int j = 0; j < sheet.getLastRowNum() + 1; j++) { + Row actualRow = sheet.getRow(j); + if (actualRow != null) { + for (int i = 0; i < actualRow.getLastCellNum(); i++) { + Cell cell = sheet.getRow(j).getCell(i); + if (cell != null) { + contains(allPlaceholders, resultPlaceholders, cell.getStringCellValue()); + if (allPlaceholders.isEmpty()) { + break loop; + } + } + } + } + } + } + + return resultPlaceholders; + + } catch (IOException e) { + throw new RuntimeException("An error occurred while parsing excel sheet", e); + } + + } + + private Set findWordPlaceholders(byte[] template, Set allPlaceholders) { + + Set resultPlaceholders = new HashSet<>(); + + try (ByteArrayInputStream is = new ByteArrayInputStream(template)) { + XWPFDocument doc = new XWPFDocument(is); + + for (XWPFParagraph p : doc.getParagraphs()) { + contains(allPlaceholders, resultPlaceholders, p.getText()); + if (allPlaceholders.isEmpty()) { + break; + } + } + + if (!allPlaceholders.isEmpty()) { + loop: + for (XWPFTable tbl : doc.getTables()) { + for (XWPFTableRow row : tbl.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + for (XWPFParagraph p : cell.getParagraphs()) { + contains(allPlaceholders, resultPlaceholders, p.getText()); + if (allPlaceholders.isEmpty()) { + break loop; + } + } + } + } + } + } + + return resultPlaceholders; + + } catch (IOException e) { + throw new RuntimeException("An error occurred while parsing word file", e); + } + } + + private Set getAllPlaceholders(String dossierTemplateId) { + + Set allPlaceholders = new HashSet<>(getGeneralPlaceholders()); + + dossierAttributesConfigClient.getDossierAttributes(dossierTemplateId).forEach(dossierAttributeConfig -> { + allPlaceholders.add(dossierAttributeConfig.getPlaceholder()); + }); + + fileAttributesClient.getFileAttributeConfigs(dossierTemplateId).forEach(fileAttributeConfig -> { + allPlaceholders.add(fileAttributeConfig.getPlaceholder()); + }); + + return allPlaceholders; + } + + private void contains(Set allPlaceholders, Set resultPlaceholders, String placeholder) { + for (String searchPlaceholder : allPlaceholders) { + if (StringUtils.contains(placeholder, searchPlaceholder)) { + resultPlaceholders.add(searchPlaceholder); + } + } + allPlaceholders.removeAll(resultPlaceholders); + } + } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/PlaceholderTest.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/PlaceholderTest.java new file mode 100644 index 0000000..8fccb49 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/PlaceholderTest.java @@ -0,0 +1,205 @@ +package com.iqser.red.service.redaction.report.v1.server; + +import com.amazonaws.services.s3.AmazonS3; +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.DossierAttributeType; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; +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.client.ReportTemplateClient; +import com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService; +import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService; +import com.iqser.red.storage.commons.service.StorageService; +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.core.io.ClassPathResource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; +import java.util.List; +import java.util.Set; + +import static org.mockito.Mockito.when; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = RANDOM_PORT) +public class PlaceholderTest { + + @Autowired + private PlaceholderService placeholderService; + + @MockBean + private StorageService storageService; + + @MockBean + private AmazonS3 s3Client; + + @MockBean + private ReportTemplateClient reportTemplateClient; + + @MockBean + private ReportStorageService reportStorageService; + + @MockBean + private DossierAttributesConfigClient dossierAttributesConfigClient; + + @MockBean + private FileAttributesConfigClient fileAttributesClient; + + @Test + public void testGeneralPlaceholders() { + + // Act + List placeholders = placeholderService.getGeneralPlaceholders(); + + // Assert + Assert.assertNotNull(placeholders); + Assert.assertEquals(placeholders.size(), 14); + } + + @Test + public void testGetReportTemplates() throws IOException { + + // Arrange + String dossierTemplateId = "123"; + String storageId = "PlaceholderTest.docx"; + String storageId2 = "IUCLID_Template.docx"; + + ClassPathResource templateResource = new ClassPathResource("templates/" + storageId); + when(reportStorageService.getReportTemplate(storageId)).thenReturn(IOUtils.toByteArray(templateResource.getInputStream())); + + ClassPathResource templateResource2 = new ClassPathResource("templates/" + storageId2); + when(reportStorageService.getReportTemplate(storageId2)).thenReturn(IOUtils.toByteArray(templateResource2.getInputStream())); + + when(reportTemplateClient.getAvailableReportTemplates(dossierTemplateId)).thenReturn(List.of( + ReportTemplate.builder().storageId(storageId).build(), + ReportTemplate.builder().storageId(storageId2).build())); + + DossierAttributeConfig dossierAttributeConfig = new DossierAttributeConfig("id", "Active Substance", true, "{{dossier.attribute.ActiveSubstance}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig2 = new DossierAttributeConfig("id2", "Rapporteur Member State", false, "{{dossier.attribute.RapporteurMemberState}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig3 = new DossierAttributeConfig("id3", "Dossier Name", true, "{{dossier.attribute.Name}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig4 = new DossierAttributeConfig("id4", "Company", false, "{{dossier.attribute.Company}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig5 = new DossierAttributeConfig("id5", "Date", true, "{{dossier.attribute.Date}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig6 = new DossierAttributeConfig("id6", "Signature", false, "{{dossier.attribute.Signature}}", DossierAttributeType.IMAGE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig7 = new DossierAttributeConfig("id7", "Does not exist", true, "{{does.not.exist}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig8 = new DossierAttributeConfig("id8", "test1", true, "{{test1}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig9 = new DossierAttributeConfig("id9", "test1", true, "{{TEST1}}", DossierAttributeType.DATE, dossierTemplateId); + when(dossierAttributesConfigClient.getDossierAttributes(dossierTemplateId)).thenReturn(List.of(dossierAttributeConfig, dossierAttributeConfig2, dossierAttributeConfig3, dossierAttributeConfig4, dossierAttributeConfig5, dossierAttributeConfig6, dossierAttributeConfig7, dossierAttributeConfig8, dossierAttributeConfig9)); + + FileAttributeConfig fileAttributeConfig1 = FileAttributeConfig.builder().id("config1").label("Label1").placeholder("{{file.test.1}}").build(); + FileAttributeConfig fileAttributeConfig2 = FileAttributeConfig.builder().id("config2").label("Label2").placeholder("{{file.test.not.exist}}").build(); + + when(fileAttributesClient.getFileAttributeConfigs(dossierTemplateId)).thenReturn(List.of(fileAttributeConfig1, fileAttributeConfig2)); + + // Act + List reportTemplates = placeholderService.getReportTemplatesByPlaceholder(dossierTemplateId, "{{dossier.attribute.ActiveSubstance}}"); + + // Assert + Assert.assertNotNull(reportTemplates); + System.out.println(reportTemplates.size() + " reportTemplates: " + reportTemplates); + Assert.assertFalse(reportTemplates.isEmpty()); + Assert.assertEquals(1, reportTemplates.size()); + Assert.assertEquals(storageId, reportTemplates.get(0).getStorageId()); + } + + @Test + public void testWord() throws IOException { + + // Arrange + String dossierTemplateId = "123"; + String reportTemplateId = "456"; + String storageId = "PlaceholderTest.docx"; + + ClassPathResource templateResource = new ClassPathResource("templates/" + storageId); + when(reportStorageService.getReportTemplate(storageId)).thenReturn(IOUtils.toByteArray(templateResource.getInputStream())); + + when(reportTemplateClient.getReportTemplate(dossierTemplateId, reportTemplateId)).thenReturn(ReportTemplate.builder().storageId(storageId).build()); + + DossierAttributeConfig dossierAttributeConfig = new DossierAttributeConfig("id", "Active Substance", true, "{{dossier.attribute.ActiveSubstance}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig2 = new DossierAttributeConfig("id2", "Rapporteur Member State", false, "{{dossier.attribute.RapporteurMemberState}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig3 = new DossierAttributeConfig("id3", "Dossier Name", true, "{{dossier.attribute.Name}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig4 = new DossierAttributeConfig("id4", "Company", false, "{{dossier.attribute.Company}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig5 = new DossierAttributeConfig("id5", "Date", true, "{{dossier.attribute.Date}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig6 = new DossierAttributeConfig("id6", "Signature", false, "{{dossier.attribute.Signature}}", DossierAttributeType.IMAGE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig7 = new DossierAttributeConfig("id7", "Does not exist", true, "{{does.not.exist}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig8 = new DossierAttributeConfig("id8", "test1", true, "{{test1}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig9 = new DossierAttributeConfig("id9", "test1", true, "{{TEST1}}", DossierAttributeType.DATE, dossierTemplateId); + when(dossierAttributesConfigClient.getDossierAttributes(dossierTemplateId)).thenReturn(List.of(dossierAttributeConfig, dossierAttributeConfig2, dossierAttributeConfig3, dossierAttributeConfig4, dossierAttributeConfig5, dossierAttributeConfig6, dossierAttributeConfig7, dossierAttributeConfig8, dossierAttributeConfig9)); + + FileAttributeConfig fileAttributeConfig1 = FileAttributeConfig.builder().id("config1").label("Label1").placeholder("{{file.test.1}}").build(); + FileAttributeConfig fileAttributeConfig2 = FileAttributeConfig.builder().id("config2").label("Label2").placeholder("{{file.test.not.exist}}").build(); + + when(fileAttributesClient.getFileAttributeConfigs(dossierTemplateId)).thenReturn(List.of(fileAttributeConfig1, fileAttributeConfig2)); + + + // Act + Set placeholders = placeholderService.getPlaceholdersOfTemplate(dossierTemplateId, reportTemplateId); + + // Assert + Assert.assertNotNull(placeholders); + System.out.println(placeholders.size() + " placeholders: " + placeholders); + Assert.assertFalse(placeholders.isEmpty()); + Assert.assertEquals(12, placeholders.size()); + Assert.assertTrue(placeholders.contains("{{test1}}")); + Assert.assertTrue(placeholders.contains("{{file.test.1}}")); + Assert.assertFalse(placeholders.contains("{{test2}}")); + Assert.assertFalse(placeholders.contains("{{TEST1}}")); + Assert.assertFalse(placeholders.contains("{{does.not.exist}}")); + Assert.assertFalse(placeholders.contains("{{file.test.not.exist}}")); + } + + @Test + public void testExcel() throws IOException { + + // Arrange + String dossierTemplateId = "123"; + String reportTemplateId = "456"; + String storageId = "PlaceholderTest.xlsx"; + + ClassPathResource templateResource = new ClassPathResource("templates/" + storageId); + when(reportStorageService.getReportTemplate(storageId)).thenReturn(IOUtils.toByteArray(templateResource.getInputStream())); + + when(reportTemplateClient.getReportTemplate(dossierTemplateId, reportTemplateId)).thenReturn(ReportTemplate.builder().storageId(storageId).build()); + + DossierAttributeConfig dossierAttributeConfig = new DossierAttributeConfig("id", "Active Substance", true, "{{dossier.attribute.ActiveSubstance}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig2 = new DossierAttributeConfig("id2", "Rapporteur Member State", false, "{{dossier.attribute.RapporteurMemberState}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig3 = new DossierAttributeConfig("id3", "Dossier Name", true, "{{dossier.attribute.Name}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig4 = new DossierAttributeConfig("id4", "Company", false, "{{dossier.attribute.Company}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig5 = new DossierAttributeConfig("id5", "Date", true, "{{dossier.attribute.Date}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig6 = new DossierAttributeConfig("id6", "Signature", false, "{{dossier.attribute.Signature}}", DossierAttributeType.IMAGE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig7 = new DossierAttributeConfig("id7", "Does not exist", true, "{{does.not.exist}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig8 = new DossierAttributeConfig("id8", "test1", true, "{{test1}}", DossierAttributeType.DATE, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig9 = new DossierAttributeConfig("id9", "test1", true, "{{TEST1}}", DossierAttributeType.DATE, dossierTemplateId); + when(dossierAttributesConfigClient.getDossierAttributes(dossierTemplateId)).thenReturn(List.of(dossierAttributeConfig, dossierAttributeConfig2, dossierAttributeConfig3, dossierAttributeConfig4, dossierAttributeConfig5, dossierAttributeConfig6, dossierAttributeConfig7, dossierAttributeConfig8, dossierAttributeConfig9)); + + FileAttributeConfig fileAttributeConfig1 = FileAttributeConfig.builder().id("config1").label("Label1").placeholder("{{file.test.1}}").build(); + FileAttributeConfig fileAttributeConfig2 = FileAttributeConfig.builder().id("config2").label("Label2").placeholder("{{file.test.not.exist}}").build(); + + when(fileAttributesClient.getFileAttributeConfigs(dossierTemplateId)).thenReturn(List.of(fileAttributeConfig1, fileAttributeConfig2)); + + // Act + Set placeholders = placeholderService.getPlaceholdersOfTemplate(dossierTemplateId, reportTemplateId); + + // Assert + Assert.assertNotNull(placeholders); + System.out.println(placeholders.size() + " placeholders: " + placeholders); + Assert.assertFalse(placeholders.isEmpty()); + Assert.assertEquals(6, placeholders.size()); + Assert.assertTrue(placeholders.contains("{{test1}}")); + Assert.assertTrue(placeholders.contains("{{file.test.1}}")); + Assert.assertTrue(placeholders.contains("{{file.name}}")); + Assert.assertTrue(placeholders.contains("{{redaction.paragraph}}")); + Assert.assertFalse(placeholders.contains("{{test2}}")); + Assert.assertFalse(placeholders.contains("{{TEST1}}")); + Assert.assertFalse(placeholders.contains("{{does.not.exist}}")); + Assert.assertFalse(placeholders.contains("{{file.test.not.exist}}")); + } + +} 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 b4c5d97..e23dcd4 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 @@ -1,30 +1,5 @@ package com.iqser.red.service.redaction.report.v1.server; -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.utils.OsUtils.getTemporaryDirectory; -import static org.mockito.Mockito.when; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Base64; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.IOUtils; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.io.ClassPathResource; -import org.springframework.test.context.junit4.SpringRunner; - import com.amazonaws.services.s3.AmazonS3; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -33,12 +8,10 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.Re 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.FileAttribute; 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.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasisMapping; 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; @@ -52,8 +25,25 @@ import com.iqser.red.service.redaction.report.v1.server.service.WordReportGenera import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService; import com.iqser.red.service.redaction.v1.model.RedactionLog; import com.iqser.red.storage.commons.service.StorageService; - import lombok.SneakyThrows; +import org.apache.commons.io.IOUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +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.utils.OsUtils.getTemporaryDirectory; +import static org.mockito.Mockito.when; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = RANDOM_PORT) @@ -122,7 +112,7 @@ public class RedactionReportIntegrationTest { .placeholder("{{dossier.attribute.name}}") .build(); - var dossierAttributeConfig2 =DossierAttributeConfig + var dossierAttributeConfig2 = DossierAttributeConfig .builder() .id("id2") .label("label2") @@ -166,7 +156,7 @@ public class RedactionReportIntegrationTest { when(fileAttributesConfigClient.getFileAttributeConfigs(dossierTemplateId)).thenReturn(List.of(fileAttributeConfig1)); - FileModel fileStatus = FileModel.builder().filename("filename").fileAttributes(Map.of("3e9b9569-5d2e-4619-848b-dd0a3e96527f","Test" )).build(); + FileModel fileStatus = FileModel.builder().filename("filename").fileAttributes(Map.of("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "Test")).build(); Dossier project = Dossier.builder().id("dossierId").dossierName("projectName").build(); @@ -271,7 +261,7 @@ public class RedactionReportIntegrationTest { List reportEntries2 = redactionLogConverterService.convertAndSort(redactionLog2, legalBasisMapping); DossierAttributeConfig dossierAttributeConfig = new DossierAttributeConfig("id", "Active Substance", true, "{{dossier.attribute.ActiveSubstance}}", DossierAttributeType.TEXT, dossierTemplateId); - DossierAttributeConfig dossierAttributeConfig2 = new DossierAttributeConfig("id2", "Rapporteur Member State", false,"{{dossier.attribute.RapporteurMemberState}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig2 = new DossierAttributeConfig("id2", "Rapporteur Member State", false, "{{dossier.attribute.RapporteurMemberState}}", DossierAttributeType.TEXT, dossierTemplateId); DossierAttributeConfig dossierAttributeConfig3 = new DossierAttributeConfig("id3", "Dossier Name", true, "{{dossier.attribute.Name}}", DossierAttributeType.TEXT, dossierTemplateId); DossierAttributeConfig dossierAttributeConfig4 = new DossierAttributeConfig("id4", "Company", false, "{{dossier.attribute.Company}}", DossierAttributeType.TEXT, dossierTemplateId); DossierAttributeConfig dossierAttributeConfig5 = new DossierAttributeConfig("id5", "Date", true, "{{dossier.attribute.Date}}", DossierAttributeType.DATE, dossierTemplateId); @@ -287,7 +277,7 @@ public class RedactionReportIntegrationTest { when(dossierAttributesClient.getDossierAttributes("dossierId")).thenReturn(List.of(dossierAttribute, dossierAttribute2, dossierAttribute3, dossierAttribute4, dossierAttribute5, dossierAttribute6)); - FileAttributeConfig fileAttributeConfig = new FileAttributeConfig("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "", "Document Title", true, true, false, false, "{{file.attribute.placeholder}}", FileAttributeType.TEXT, dossierTemplateId); + FileAttributeConfig fileAttributeConfig = new FileAttributeConfig("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "", "Document Title", true, true, false, false, "{{file.attribute.placeholder}}", FileAttributeType.TEXT, dossierTemplateId); when(fileAttributesConfigClient.getFileAttributeConfigs(dossierTemplateId)).thenReturn(List.of(fileAttributeConfig)); Map attributeIdToValue = new HashMap(); @@ -369,7 +359,7 @@ public class RedactionReportIntegrationTest { List reportEntries = redactionLogConverterService.convertAndSort(redactionLog, legalBasisMapping); DossierAttributeConfig dossierAttributeConfig = new DossierAttributeConfig("id", "Active Substance", true, "{{dossier.attribute.ActiveSubstance}}", DossierAttributeType.TEXT, dossierTemplateId); - DossierAttributeConfig dossierAttributeConfig2 = new DossierAttributeConfig("id2", "Rapporteur Member State", false,"{{dossier.attribute.RapporteurMemberState}}", DossierAttributeType.TEXT, dossierTemplateId); + DossierAttributeConfig dossierAttributeConfig2 = new DossierAttributeConfig("id2", "Rapporteur Member State", false, "{{dossier.attribute.RapporteurMemberState}}", DossierAttributeType.TEXT, dossierTemplateId); DossierAttributeConfig dossierAttributeConfig3 = new DossierAttributeConfig("id3", "Dossier Name", true, "{{dossier.attribute.Name}}", DossierAttributeType.TEXT, dossierTemplateId); DossierAttributeConfig dossierAttributeConfig4 = new DossierAttributeConfig("id4", "Company", false, "{{dossier.attribute.Company}}", DossierAttributeType.TEXT, dossierTemplateId); DossierAttributeConfig dossierAttributeConfig5 = new DossierAttributeConfig("id5", "Date", true, "{{dossier.attribute.Date}}", DossierAttributeType.DATE, dossierTemplateId); @@ -385,7 +375,7 @@ public class RedactionReportIntegrationTest { when(dossierAttributesClient.getDossierAttributes("dossierId")).thenReturn(List.of(dossierAttribute, dossierAttribute2, dossierAttribute3, dossierAttribute4, dossierAttribute5, dossierAttribute6)); - FileAttributeConfig fileAttributeConfig =new FileAttributeConfig("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "", "Document Title", true, true, false, false, "{{file.attribute.placeholder}}", FileAttributeType.TEXT, dossierTemplateId); + FileAttributeConfig fileAttributeConfig = new FileAttributeConfig("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "", "Document Title", true, true, false, false, "{{file.attribute.placeholder}}", FileAttributeType.TEXT, dossierTemplateId); when(fileAttributesConfigClient.getFileAttributeConfigs(dossierTemplateId)).thenReturn(List.of(fileAttributeConfig)); Map attributeIdToValue = new HashMap(); diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/PlaceholderTest.docx b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/PlaceholderTest.docx new file mode 100644 index 0000000..a41f327 Binary files /dev/null and b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/PlaceholderTest.docx differ diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/PlaceholderTest.xlsx b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/PlaceholderTest.xlsx new file mode 100644 index 0000000..e984c82 Binary files /dev/null and b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/PlaceholderTest.xlsx differ