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