RED-2531 Added endpoint and implementation for finding templates by placeholder
This commit is contained in:
parent
3a7456802b
commit
cc367f1d93
@ -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>
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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}}"));
|
||||
}
|
||||
|
||||
}
|
||||
@ -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();
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user