From b9ac93aae92270edb13bf9e055c94e39f5fdfb57 Mon Sep 17 00:00:00 2001 From: deiflaender Date: Wed, 2 Sep 2020 13:45:53 +0200 Subject: [PATCH] RED-231: Implemented logic --- .../redaction-report-service-api-v1/pom.xml | 5 ++ .../report/v1/api/model/FileRedactionLog.java | 17 ++++ .../v1/api/model/MultiFileRedactionLog.java | 17 ++++ .../report/v1/api/model/ReportResult.java | 13 +++ .../api/resource/RedactionReportResource.java | 17 ++++ .../pom.xml | 15 ++++ .../controller/RedactionReportController.java | 23 +++++ .../service/ReportGenerationService.java | 79 ++++++++++++++++++ .../v1/server/utils/ResourceLoader.java | 24 ++++++ .../main/resources/templates/Appendix A2.docx | Bin 0 -> 88479 bytes .../RedactionReportIntegrationTest.java | 39 ++++++++- .../src/test/resources/files/RedactionLog.txt | 1 + 12 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/FileRedactionLog.java create mode 100644 redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/MultiFileRedactionLog.java create mode 100644 redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportResult.java create mode 100644 redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/RedactionReportResource.java create mode 100644 redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/RedactionReportController.java create mode 100644 redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java create mode 100644 redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/utils/ResourceLoader.java create mode 100644 redaction-report-service-v1/redaction-report-service-server-v1/src/main/resources/templates/Appendix A2.docx create mode 100644 redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/files/RedactionLog.txt 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..2d525be 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 @@ -14,6 +14,11 @@ 1.0-SNAPSHOT + + com.iqser.red.service + redaction-service-api-v1 + 1.1.1 + diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/FileRedactionLog.java b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/FileRedactionLog.java new file mode 100644 index 0000000..adcffd8 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/FileRedactionLog.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.redaction.report.v1.api.model; + +import com.iqser.red.service.redaction.v1.model.RedactionLog; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FileRedactionLog { + + private String filename; + private RedactionLog redactionLog; + +} diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/MultiFileRedactionLog.java b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/MultiFileRedactionLog.java new file mode 100644 index 0000000..23e0cc1 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/MultiFileRedactionLog.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.redaction.report.v1.api.model; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MultiFileRedactionLog { + + private List FileRedactionLogs = new ArrayList<>(); + +} diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportResult.java b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportResult.java new file mode 100644 index 0000000..d10d383 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/model/ReportResult.java @@ -0,0 +1,13 @@ +package com.iqser.red.service.redaction.report.v1.api.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ReportResult { + + private byte[] document; +} diff --git a/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/RedactionReportResource.java b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/RedactionReportResource.java new file mode 100644 index 0000000..89d20f3 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-api-v1/src/main/java/com/iqser/red/service/redaction/report/v1/api/resource/RedactionReportResource.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.redaction.report.v1.api.resource; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.iqser.red.service.redaction.report.v1.api.model.MultiFileRedactionLog; +import com.iqser.red.service.redaction.report.v1.api.model.ReportResult; + +public interface RedactionReportResource { + + String SERVICE_NAME = "redaction-report-service-v1"; + + @PostMapping(value = "/generate", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ReportResult generateReport(@RequestBody MultiFileRedactionLog multiFileRedactionLog); + +} diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml b/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml index a168bda..ca9d1ef 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml +++ b/redaction-report-service-v1/redaction-report-service-server-v1/pom.xml @@ -19,6 +19,21 @@ redaction-report-service-api-v1 ${project.version} + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + org.apache.poi + poi-scratchpad + 4.1.2 + com.iqser.gin4.commons spring-commons diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/RedactionReportController.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/RedactionReportController.java new file mode 100644 index 0000000..7a0a1cc --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/controller/RedactionReportController.java @@ -0,0 +1,23 @@ +package com.iqser.red.service.redaction.report.v1.server.controller; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.redaction.report.v1.api.model.MultiFileRedactionLog; +import com.iqser.red.service.redaction.report.v1.api.model.ReportResult; +import com.iqser.red.service.redaction.report.v1.api.resource.RedactionReportResource; +import com.iqser.red.service.redaction.report.v1.server.service.ReportGenerationService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class RedactionReportController implements RedactionReportResource { + + private final ReportGenerationService reportGenerationService; + + public ReportResult generateReport(@RequestBody MultiFileRedactionLog multiFileRedactionLog){ + return new ReportResult(reportGenerationService.generateReport(multiFileRedactionLog)); + } + +} diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java new file mode 100644 index 0000000..cc1a4e7 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ReportGenerationService.java @@ -0,0 +1,79 @@ +package com.iqser.red.service.redaction.report.v1.server.service; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +import javax.annotation.PostConstruct; + +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.redaction.report.v1.api.model.MultiFileRedactionLog; +import com.iqser.red.service.redaction.report.v1.server.utils.ResourceLoader; + +@Service +public class ReportGenerationService { + + private byte[] template; + + + @PostConstruct + public void init() { + + template = ResourceLoader.load("templates/Appendix A2.docx"); + } + + + public byte[] generateReport(MultiFileRedactionLog multiFileRedactionLog) { + + try (ByteArrayInputStream is = new ByteArrayInputStream(template)) { + XWPFDocument doc = new XWPFDocument(is); + doc = addTableRows(doc, multiFileRedactionLog); + return toByteArray(doc); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + + private XWPFDocument addTableRows(XWPFDocument doc, MultiFileRedactionLog multiFileRedactionLog) { + + XWPFTable table = doc.getTables().get(1); + + multiFileRedactionLog.getFileRedactionLogs().forEach(fileRedactionLog -> { + fileRedactionLog.getRedactionLog().getRedactionLogEntry().forEach(redactionLogEntry -> { + Set pages = new HashSet<>(); + redactionLogEntry.getPositions().forEach(position -> { + pages.add(position.getPage()); + }); + pages.forEach(page -> { + XWPFTableRow row = table.createRow(); + row.getCell(0).setText(fileRedactionLog.getFilename()); + row.getCell(1).setText(String.valueOf(page)); + row.getCell(2).setText(String.valueOf(redactionLogEntry.getSectionNumber())); + row.getCell(3).setText(redactionLogEntry.getReason()); + }); + + }); + }); + + return doc; + } + + + private byte[] toByteArray(XWPFDocument doc) throws FileNotFoundException, IOException { + + try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { + doc.write(byteArrayOutputStream); + doc.close(); + return byteArrayOutputStream.toByteArray(); + } + } + +} \ No newline at end of file diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/utils/ResourceLoader.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/utils/ResourceLoader.java new file mode 100644 index 0000000..23f1b96 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/utils/ResourceLoader.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.redaction.report.v1.server.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class ResourceLoader { + + public byte[] load(String classpathPath) { + + URL resource = ResourceLoader.class.getClassLoader().getResource(classpathPath); + if (resource == null) { + throw new IllegalArgumentException("could not load classpath resource: " + classpathPath); + } + try (InputStream is = resource.openStream()){ + return is.readAllBytes(); + } catch (IOException e){ + throw new IllegalArgumentException("could not load classpath resource: " + classpathPath, e); + } + } +} diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/resources/templates/Appendix A2.docx b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/resources/templates/Appendix A2.docx new file mode 100644 index 0000000000000000000000000000000000000000..5e485b3266d397aeaadb6eedef399cc0543594c6 GIT binary patch literal 88479 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%0DCw8Y*1 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 literal 0 HcmV?d00001 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 b02a17c..44b1b19 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,16 +1,53 @@ package com.iqser.red.service.redaction.report.v1.server; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; 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.core.io.ClassPathResource; import org.springframework.test.context.junit4.SpringRunner; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.redaction.report.v1.api.model.FileRedactionLog; +import com.iqser.red.service.redaction.report.v1.api.model.MultiFileRedactionLog; +import com.iqser.red.service.redaction.report.v1.api.model.ReportResult; +import com.iqser.red.service.redaction.report.v1.server.controller.RedactionReportController; +import com.iqser.red.service.redaction.v1.model.RedactionLog; + @RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = DEFINED_PORT) public class RedactionReportIntegrationTest { + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private RedactionReportController redactionReportController; + + @Test - public void testServiceTemplate() { + public void testReportGeneration() throws IOException { + + ClassPathResource redactionLogResource = new ClassPathResource("files/RedactionLog.txt"); + + RedactionLog redactionLog = objectMapper.readValue(redactionLogResource.getInputStream(), RedactionLog.class); + + FileRedactionLog fileRedactionLog = new FileRedactionLog("Metholachlor 1", redactionLog); + MultiFileRedactionLog multiFileRedactionLog = new MultiFileRedactionLog(List.of(fileRedactionLog)); + + ReportResult reportResult = redactionReportController.generateReport(multiFileRedactionLog); + + try (FileOutputStream fileOutputStream = new FileOutputStream("/tmp/document.docx")) { + fileOutputStream.write(reportResult.getDocument()); + } + assertThat(true).isTrue(); } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/files/RedactionLog.txt b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/files/RedactionLog.txt new file mode 100644 index 0000000..38abcc4 --- /dev/null +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/files/RedactionLog.txt @@ -0,0 +1 @@ +{"redactionLogEntry":[{"id":"3080535605f06a5a397c4a9a5e501e9e","type":"address","value":"Regina Dorn","reason":"Applicant information was found","redacted":true,"section":"1.2.1 Name and address of applicant(s) for approval of the active substance","color":[0.0,1.0,1.0],"positions":[{"topLeft":{"x":147.86,"y":226.28998},"width":32.17697,"height":11.017679,"page":1},{"topLeft":{"x":181.79697,"y":226.28998},"width":23.68721,"height":11.017679,"page":1}],"sectionNumber":3,"manual":false,"hint":false},{"id":"b54d906a78a3988c54c67f188acab849","type":"address","value":"Schwarzwaldallee 215 P.O. Box CH-4002 Basel Switzerland","reason":"Applicant information was found","redacted":true,"section":"1.2.1 Name and address of applicant(s) for approval of the active substance","color":[0.0,1.0,1.0],"positions":[{"topLeft":{"x":147.86,"y":289.52997},"width":81.095245,"height":11.017679,"page":1},{"topLeft":{"x":230.73732,"y":289.52997},"width":17.438568,"height":11.017679,"page":1},{"topLeft":{"x":147.86,"y":276.93},"width":20.562881,"height":11.017679,"page":1},{"topLeft":{"x":170.18288,"y":276.93},"width":19.359528,"height":11.017679,"page":1},{"topLeft":{"x":147.86,"y":264.21002},"width":41.950012,"height":11.017679,"page":1},{"topLeft":{"x":191.57,"y":264.21002},"width":25.519852,"height":11.017679,"page":1},{"topLeft":{"x":147.86,"y":251.60999},"width":53.649796,"height":11.017679,"page":1}],"sectionNumber":3,"manual":false,"hint":false},{"id":"7b4ff6e32a8bdaa7de5dcdeb13ff8edd","type":"address","value":"regina.dorn@syngenta.com","reason":"Applicant information was found","redacted":true,"section":"1.2.1 Name and address of applicant(s) for approval of the active substance","color":[0.0,1.0,1.0],"positions":[{"topLeft":{"x":147.86,"y":188.34003},"width":122.451065,"height":11.017679,"page":1}],"sectionNumber":3,"manual":false,"hint":false},{"id":"c357d6781fb4bb7e7020a67dbc63763c","type":"address","value":"Syngenta Crop Protection AG","reason":"Applicant information was found","redacted":true,"section":"1.2.1 Name and address of applicant(s) for approval of the active substance","color":[0.0,1.0,1.0],"positions":[{"topLeft":{"x":147.86,"y":302.25},"width":41.88115,"height":11.017679,"page":1},{"topLeft":{"x":191.50114,"y":302.25},"width":23.080002,"height":11.017679,"page":1},{"topLeft":{"x":216.34114,"y":302.25},"width":46.23088,"height":11.017679,"page":1},{"topLeft":{"x":264.2106,"y":302.25},"width":16.886566,"height":11.017679,"page":1}],"sectionNumber":3,"manual":false,"hint":false},{"id":"946a2cc404d6568d34b1ca9a4c688ec9","type":"address","value":"+41 (61) 323 6358","reason":"Applicant information was found","redacted":true,"section":"1.2.1 Name and address of applicant(s) for approval of the active substance","color":[0.0,1.0,1.0],"positions":[{"topLeft":{"x":147.86,"y":213.65997},"width":18.266571,"height":11.017679,"page":1},{"topLeft":{"x":167.88657,"y":213.65997},"width":19.315353,"height":11.017679,"page":1},{"topLeft":{"x":188.99504,"y":213.65997},"width":17.438568,"height":11.017679,"page":1},{"topLeft":{"x":208.1936,"y":213.65997},"width":23.080017,"height":11.017679,"page":1}],"sectionNumber":3,"manual":false,"hint":false},{"id":"687171974a4fc3aa0f43ec2118256590","type":"address","value":"+41 (61) 323 6155","reason":"Applicant information was found","redacted":true,"section":"1.2.1 Name and address of applicant(s) for approval of the active substance","color":[0.0,1.0,1.0],"positions":[{"topLeft":{"x":147.86,"y":200.94},"width":18.266571,"height":11.017679,"page":1},{"topLeft":{"x":167.88657,"y":200.94},"width":19.315353,"height":11.017679,"page":1},{"topLeft":{"x":188.99504,"y":200.94},"width":17.438568,"height":11.017679,"page":1},{"topLeft":{"x":208.1936,"y":200.94},"width":23.080017,"height":11.017679,"page":1}],"sectionNumber":3,"manual":false,"hint":false}]} \ No newline at end of file