RED-2531 Added endpoint and implementation for finding templates by placeholder

This commit is contained in:
Philipp Schramm 2022-01-11 10:27:28 +01:00
parent 3a7456802b
commit cc367f1d93
10 changed files with 471 additions and 40 deletions

View File

@ -26,5 +26,11 @@
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.iqser.red.service</groupId>
<artifactId>persistence-service-api-v1</artifactId>
<version>0.151.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -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<String> getPlaceholders();
@GetMapping(value = PLACEHOLDERS_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + REPORT_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<String> getPlaceholdersOfTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@PathVariable(REPORT_TEMPLATE_ID) String reportTemplateId);
}

View File

@ -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<ReportTemplate> getReportTemplatesByPlaceholder(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@RequestBody JSONPrimitive<String> placeholder);
}

View File

@ -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<String> getPlaceholders() {
return placeholderService.getGeneralPlaceholders();
}
@Override
public List<String> getPlaceholdersOfTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@PathVariable(REPORT_TEMPLATE_ID) String reportTemplateId) {
return new ArrayList<>(placeholderService.getPlaceholdersOfTemplate(dossierTemplateId, reportTemplateId));
}
}

View File

@ -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<ReportTemplate> getReportTemplatesByPlaceholder(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId,
@RequestBody JSONPrimitive<String> placeholder) {
return placeholderService.getReportTemplatesByPlaceholder(dossierTemplateId, placeholder.getValue());
}
}

View File

@ -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<String> 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<String> getPlaceholdersOfTemplate(String dossierTemplateId, String reportTemplateId) {
ReportTemplate reportTemplate = reportTemplateClient.getReportTemplate(dossierTemplateId, reportTemplateId);
Set<String> allPlaceholders = getAllPlaceholders(dossierTemplateId);
return findGivenPlaceholdersOfTemplate(reportTemplate, allPlaceholders);
}
public List<ReportTemplate> getReportTemplatesByPlaceholder(String dossierTemplateId, String placeholder) {
List<ReportTemplate> reportTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplateId);
if (reportTemplates == null || reportTemplates.isEmpty()) {
throw new NotFoundException("For dossierTemplateId '" + dossierTemplateId + "' no report templates exist.");
}
List<ReportTemplate> result = new ArrayList<>();
for (ReportTemplate reportTemplate : reportTemplates) {
Set<String> placeholders = findGivenPlaceholdersOfTemplate(reportTemplate, new HashSet<>(Collections.singleton(placeholder)));
if (!placeholders.isEmpty()) {
result.add(reportTemplate);
}
}
return result;
}
private Set<String> findGivenPlaceholdersOfTemplate(ReportTemplate reportTemplate, Set<String> 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<String> findExcelPlaceholders(byte[] template, Set<String> allPlaceholders) {
try (ByteArrayInputStream is = new ByteArrayInputStream(template)) {
Set<String> 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<String> findWordPlaceholders(byte[] template, Set<String> allPlaceholders) {
Set<String> 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<String> getAllPlaceholders(String dossierTemplateId) {
Set<String> 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<String> allPlaceholders, Set<String> resultPlaceholders, String placeholder) {
for (String searchPlaceholder : allPlaceholders) {
if (StringUtils.contains(placeholder, searchPlaceholder)) {
resultPlaceholders.add(searchPlaceholder);
}
}
allPlaceholders.removeAll(resultPlaceholders);
}
}

View File

@ -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<String> 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<ReportTemplate> 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<String> 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<String> 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}}"));
}
}

View File

@ -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<ReportRedactionEntry> 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<String, String> attributeIdToValue = new HashMap();
@ -369,7 +359,7 @@ public class RedactionReportIntegrationTest {
List<ReportRedactionEntry> 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<String, String> attributeIdToValue = new HashMap();