From 06630b09d27378145378e3b954b7ded1397d6117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thierry=20G=C3=B6ckel?= Date: Mon, 10 Aug 2020 12:15:19 +0200 Subject: [PATCH] RED-101: Implement table cell and row redaction --- .../v1/server/redaction/model/Section.java | 26 +++- .../service/EntityRedactionService.java | 35 ++++- .../segmentation/SectionsBuilderService.java | 55 +++++-- .../server/tableextraction/model/Table.java | 147 ++++++++++++++---- .../v1/server/RedactionIntegrationTest.java | 25 ++- .../service/EntityRedactionServiceTest.java | 133 +++++++++++++++- .../src/test/resources/drools/rules.drl | 11 ++ .../files/Minimal Examples/Single Table.pdf | Bin 0 -> 82040 bytes 8 files changed, 367 insertions(+), 65 deletions(-) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table.pdf diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java index 736ac223..a63343d7 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java @@ -3,6 +3,7 @@ package com.iqser.red.service.redaction.v1.server.redaction.model; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.regex.Pattern; @@ -10,8 +11,10 @@ import org.apache.commons.lang3.StringUtils; import lombok.Builder; import lombok.Data; +import lombok.extern.slf4j.Slf4j; @Data +@Slf4j @Builder public class Section { @@ -27,6 +30,8 @@ public class Section { private int sectionNumber; + private Map tabularData; + public boolean contains(String type) { @@ -71,7 +76,7 @@ public class Section { if (values != null) { for (String value : values) { if (StringUtils.isNotBlank(value)) { - Set found = findEntity(value.trim(), asType); + Set found = findEntities(value.trim(), asType); entities.addAll(found); } } @@ -96,7 +101,7 @@ public class Section { if (values != null) { for (String value : values) { if (value != null && StringUtils.isNotBlank(value)) { - Set found = findEntity(value.trim(), asType); + Set found = findEntities(value.trim(), asType); entities.addAll(found); } } @@ -113,7 +118,7 @@ public class Section { } - private Set findEntity(String value, String asType) { + private Set findEntities(String value, String asType) { Set found = new HashSet<>(); @@ -154,4 +159,17 @@ public class Section { return entities; } -} + + public void highlightCell(String reason) { + + String value = tabularData.get(reason); + if (value == null) { + log.warn("Could not find any data for {}.", reason); + } else { + Entity entity = findEntities(value, "some type").iterator().next(); + entity.setRedaction(false); + } + + } + +} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java index 1a023459..dbaeeae6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java @@ -7,7 +7,10 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.iqser.red.service.redaction.v1.server.classification.model.Document; @@ -44,24 +47,30 @@ public class EntityRedactionService { List tables = paragraph.getTables(); for (Table table : tables) { + List metadata = table.getHeaders(); for (List row : table.getRows()) { SearchableText searchableRow = new SearchableText(); - for (Cell column : row) { - if (column == null || column.getTextBlocks() == null) { + List cellValues = new ArrayList<>(); + for (Cell cell : row) { + if (cell == null || cell.getTextBlocks() == null) { + cellValues.add(null); continue; } - for (TextBlock textBlock : column.getTextBlocks()) { + cellValues.add(cell.getTextBlocks().get(0).getText()); + for (TextBlock textBlock : cell.getTextBlocks()) { searchableRow.addAll(textBlock.getSequences()); } } Set rowEntities = findEntities(searchableRow, table.getHeadline(), sectionNumber); + Map tabularData = toMap(metadata, cellValues); Section analysedRowSection = droolsExecutionService.executeRules(Section.builder() .entities(rowEntities) .text(searchableRow.getAsStringWithLinebreaks()) .searchText(searchableRow.toString()) .headline(table.getHeadline()) .sectionNumber(sectionNumber) + .tabularData(tabularData) .build()); documentEntities.addAll(clearAndFindPositions(analysedRowSection.getEntities(), searchableRow)); @@ -93,7 +102,8 @@ public class EntityRedactionService { for (Map.Entry> entry : sequenceOnPage.entrySet()) { classifiedDoc.getEntities() .computeIfAbsent(entry.getKey(), (x) -> new ArrayList<>()) - .add(new Entity(entity.getWord(), entity.getType(), entity.isRedaction(), entity.getRedactionReason(), entry + .add(new Entity(entity.getWord(), entity.getType(), entity.isRedaction(), + entity.getRedactionReason(), entry .getValue(), entity.getHeadline(), entity.getMatchedRule(), entity.getSectionNumber())); } } @@ -101,6 +111,12 @@ public class EntityRedactionService { } + private Map toMap(List keys, List values) { + + return IntStream.range(0, keys.size()).boxed().collect(Collectors.toMap(keys::get, values::get)); + } + + private Set clearAndFindPositions(Set entities, SearchableText text) { removeEntitiesContainedInLarger(entities); @@ -119,12 +135,14 @@ public class EntityRedactionService { private Set findEntities(SearchableText searchableText, String headline, int sectionNumber) { + Set found = new HashSet<>(); + if (StringUtils.isEmpty(searchableText.toString()) && StringUtils.isEmpty(headline)) { + return found; + } + String inputString = searchableText.toString(); String lowercaseInputString = inputString.toLowerCase(); - - Set found = new HashSet<>(); for (Map.Entry> entry : dictionaryService.getDictionary().entrySet()) { - if (dictionaryService.getCaseInsensitiveTypes().contains(entry.getKey())) { found.addAll(find(lowercaseInputString, entry.getValue(), entry.getKey(), headline, sectionNumber)); } else { @@ -151,7 +169,8 @@ public class EntityRedactionService { if (startIndex > -1 && (startIndex == 0 || Character.isWhitespace(inputString.charAt(startIndex - 1)) || isSeparator(inputString .charAt(startIndex - 1))) && (stopIndex == inputString.length() || isSeparator(inputString.charAt(stopIndex)))) { - found.add(new Entity(inputString.substring(startIndex, stopIndex), type, startIndex, stopIndex, headline, sectionNumber)); + found.add(new Entity(inputString.substring(startIndex, stopIndex), type, startIndex, stopIndex, + headline, sectionNumber)); } } while (startIndex > -1); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/SectionsBuilderService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/SectionsBuilderService.java index 04a45e91..02fb84d0 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/SectionsBuilderService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/SectionsBuilderService.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.iqser.red.service.redaction.v1.server.classification.model.Document; @@ -14,7 +16,6 @@ import com.iqser.red.service.redaction.v1.server.tableextraction.model.AbstractT import com.iqser.red.service.redaction.v1.server.tableextraction.model.Table; @Service -@SuppressWarnings("all") public class SectionsBuilderService { public void buildSections(Document document) { @@ -25,6 +26,7 @@ public class SectionsBuilderService { AbstractTextContainer prev = null; String lastHeadline = ""; + Table previousTable = null; for (Page page : document.getPages()) { for (AbstractTextContainer current : page.getTextBlocks()) { @@ -37,7 +39,7 @@ public class SectionsBuilderService { if (prev != null && current.getClassification().startsWith("H ") || !document.isHeadlines()) { - Paragraph chunkBlock = buildTextBlock(chunkWords, lastHeadline); + Paragraph chunkBlock = buildTextBlock(chunkWords, lastHeadline, previousTable); chunkBlock.setHeadline(lastHeadline); lastHeadline = current.getText(); chunkBlockList.add(chunkBlock); @@ -51,17 +53,15 @@ public class SectionsBuilderService { } } - Paragraph chunkBlock = buildTextBlock(chunkWords, lastHeadline); - if (chunkBlock != null) { - chunkBlockList.add(chunkBlock); - chunkBlock.setHeadline(lastHeadline); - } + Paragraph chunkBlock = buildTextBlock(chunkWords, lastHeadline, previousTable); + chunkBlock.setHeadline(lastHeadline); + chunkBlockList.add(chunkBlock); document.setParagraphs(chunkBlockList); } - private Paragraph buildTextBlock(List wordBlockList, String lastHeadline) { + private Paragraph buildTextBlock(List wordBlockList, String lastHeadline, Table previousTable) { Paragraph paragraph = new Paragraph(); TextBlock textBlock = null; @@ -76,19 +76,28 @@ public class SectionsBuilderService { AbstractTextContainer container = itty.next(); if (container instanceof Table) { + Table table = (Table) container; splitByTable = true; - if (previous != null && previous instanceof TextBlock && previous.getText().startsWith("Table ")) { - ((Table) container).setHeadline(previous.getText()); + if (previous != null && previous.getText().startsWith("Table ")) { + table.setHeadline(previous.getText()); } else { - ((Table) container).setHeadline("Table in: " + lastHeadline); + table.setHeadline("Table in: " + lastHeadline); + } + // Distribute header information for subsequent tables + if (previousTable != null && hasInvalidHeaderInformation(table) && hasValidHeaderInformation(previousTable)) { + if ((previousTable.isVerticalHeader() && previousTable.getRowCount() == table.getRowCount()) || previousTable + .getColCount() == table.getColCount()) { + table.setHeaders(previousTable.getHeaders()); + } } if (textBlock != null && !alreadyAdded) { paragraph.getPageBlocks().add(textBlock); alreadyAdded = true; } - paragraph.getPageBlocks().add(container); + paragraph.getPageBlocks().add(table); + previousTable = table; continue; } @@ -125,4 +134,24 @@ public class SectionsBuilderService { return paragraph; } -} + + private boolean hasValidHeaderInformation(Table table) { + + return !hasInvalidHeaderInformation(table); + } + + + private boolean hasInvalidHeaderInformation(Table table) { + + if (CollectionUtils.isEmpty(table.getHeaders())) { + return true; + } + if (table.getHeaders().stream().anyMatch(StringUtils::isEmpty)) { + return true; + } + + return false; + + } + +} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/model/Table.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/model/Table.java index 20f1fbd8..e32e58c1 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/model/Table.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/tableextraction/model/Table.java @@ -8,32 +8,44 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; import com.iqser.red.service.redaction.v1.server.classification.model.TextBlock; import com.iqser.red.service.redaction.v1.server.tableextraction.utils.Utils; import lombok.Getter; import lombok.Setter; +import lombok.extern.slf4j.Slf4j; -@SuppressWarnings("all") +@Slf4j public class Table extends AbstractTextContainer { private final TreeMap cells = new TreeMap<>(); - private RectangleSpatialIndex si = new RectangleSpatialIndex<>(); + private final RectangleSpatialIndex si = new RectangleSpatialIndex<>(); @Getter @Setter private String headline; @Getter - private int rowCount = 0; + private int rowCount; + @Getter - private int colCount = 0; + private int colCount; - private int rotation = 0; + private final int rotation; - private List> memoizedRows = null; + private List> rows; + + @Getter + @Setter + private List headers; + + @Getter + private boolean verticalHeader; public Table(List cells, Rectangle area, int rotation) { @@ -47,16 +59,83 @@ public class Table extends AbstractTextContainer { } + public List> getRows() { - if (memoizedRows == null) { - memoizedRows = computeRows(); + if (rows == null) { + rows = computeRows(); + headers = computeHeaders(); } - return memoizedRows; + return rows; } + + /** + * Detect header cells (either first row or first column): + * Column is marked as header if cell text is bold and row cell text is not bold. + * Defaults to row. + */ + private List computeHeaders() { + + boolean allBold = true; + List rowCells = rows.get(0); + for (Cell cell : rowCells) { + if (CollectionUtils.isNotEmpty(cell.getTextBlocks())) { + if (!cell.getTextBlocks().get(0).getMostPopularWordStyle().equals("bold")) { + allBold = false; + break; + } + } + } + if (!allBold) { + allBold = true; + List firstColCells = new ArrayList<>(); + for (List row : rows) { + Cell firstInRow = row.get(0); + if (CollectionUtils.isNotEmpty(firstInRow.getTextBlocks())) { + if (!firstInRow.getTextBlocks().get(0).getMostPopularWordStyle().equals("bold")) { + allBold = false; + break; + } + } + firstColCells.add(firstInRow); + } + if (allBold) { + log.info("Headers are in first column"); + verticalHeader = true; + return firstColCells.stream().map(cell -> { + if (CollectionUtils.isNotEmpty(cell.getTextBlocks())) { + return cell.getTextBlocks().get(0).getText(); + } else { + return null; + } + }).collect(Collectors.toList()); + } else { + log.info("Headers are defaulted in first row."); + return rowCells.stream().map(cell -> { + if (CollectionUtils.isNotEmpty(cell.getTextBlocks())) { + return cell.getTextBlocks().get(0).getText(); + } else { + return null; + } + }).collect(Collectors.toList()); + } + } else { + log.info("Headers are in first row."); + return rowCells.stream().map(cell -> { + if (CollectionUtils.isNotEmpty(cell.getTextBlocks())) { + return cell.getTextBlocks().get(0).getText(); + } else { + return null; + } + }).collect(Collectors.toList()); + } + + } + + private List> computeRows() { List> rows = new ArrayList<>(); @@ -93,6 +172,7 @@ public class Table extends AbstractTextContainer { } + public void add(Cell chunk, int row, int col) { rowCount = Math.max(rowCount, row + 1); @@ -103,6 +183,7 @@ public class Table extends AbstractTextContainer { } + private void addCells(List cells) { if (cells.isEmpty()) { @@ -131,14 +212,9 @@ public class Table extends AbstractTextContainer { while (rowCells.hasNext()) { Cell cell = rowCells.next(); if (i > 0) { - List> others = rowsOfCells( - si.contains( - new Rectangle(cell.getBottom(), - si.getBounds().getLeft(), - cell.getLeft() - si.getBounds().getLeft() + 1, - si.getBounds().getBottom() - cell.getBottom() - ) - )); + List> others = rowsOfCells(si.contains(new Rectangle(cell.getBottom(), si.getBounds() + .getLeft(), cell.getLeft() - si.getBounds().getLeft() + 1, si.getBounds().getBottom() - cell + .getBottom()))); for (List r : others) { jumpToColumn = Math.max(jumpToColumn, r.size()); @@ -158,7 +234,9 @@ public class Table extends AbstractTextContainer { } } + private static List> rowsOfCells(List cells) { + Cell c; float lastTop; List> rv = new ArrayList<>(); @@ -168,19 +246,10 @@ public class Table extends AbstractTextContainer { return rv; } - Collections.sort(cells, new Comparator() { - @Override - public int compare(Cell arg0, Cell arg1) { - return Double.compare(arg0.getLeft(), arg1.getLeft()); - } - }); + cells.sort(Comparator.comparingDouble(Rectangle::getLeft)); - Collections.sort(cells, Collections.reverseOrder(new Comparator() { - @Override - public int compare(Cell arg0, Cell arg1) { - return Float.compare(Utils.round(arg0.getBottom(), 2), Utils.round(arg1.getBottom(),2)); - } - })); + cells.sort(Collections.reverseOrder((arg0, arg1) -> Float.compare(Utils.round(arg0.getBottom(), 2), Utils.round(arg1 + .getBottom(), 2)))); Iterator iter = cells.iterator(); c = iter.next(); @@ -201,6 +270,7 @@ public class Table extends AbstractTextContainer { return rv; } + @Override public String getText() { @@ -237,6 +307,7 @@ public class Table extends AbstractTextContainer { return sb.toString(); } + public String getTextAsHtml() { StringBuilder sb = new StringBuilder(); @@ -270,22 +341,30 @@ public class Table extends AbstractTextContainer { return sb.toString(); } - class CellPosition implements Comparable { + + static class CellPosition implements Comparable { CellPosition(int row, int col) { + this.row = row; this.col = col; } - final int row, col; + + final int row; + final int col; + @Override public int hashCode() { + return row + 101 * col; } + @Override public boolean equals(Object obj) { + if (this == obj) { return true; } @@ -299,10 +378,12 @@ public class Table extends AbstractTextContainer { return row == other.row && col == other.col; } + @Override public int compareTo(CellPosition other) { - int rowdiff = row - other.row; - return rowdiff != 0 ? rowdiff : col - other.col; + + int rowDiff = row - other.row; + return rowDiff != 0 ? rowDiff : col - other.col; } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java index e5d41822..9e266d28 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java @@ -19,7 +19,6 @@ import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.api.KieServices; @@ -48,7 +47,6 @@ import com.iqser.red.service.redaction.v1.server.controller.RedactionController; import com.iqser.red.service.redaction.v1.server.redaction.utils.ResourceLoader; import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; -@Ignore @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = DEFINED_PORT) public class RedactionIntegrationTest { @@ -99,7 +97,7 @@ public class RedactionIntegrationTest { @Before - public void stubRulesClient() { + public void stubClients() { when(rulesClient.getVersion()).thenReturn(0L); when(rulesClient.getRules()).thenReturn(new RulesResponse(RULES)); @@ -241,6 +239,27 @@ public class RedactionIntegrationTest { System.out.println("numberOfPages: " + result.getNumberOfPages()); } + @Test + public void testTableRedaction() throws IOException { + + long start = System.currentTimeMillis(); + ClassPathResource pdfFileResource = new ClassPathResource("files/Minimal Examples/Single Table.pdf"); + + RedactionRequest request = RedactionRequest.builder() + .document(IOUtils.toByteArray(pdfFileResource.getInputStream())) + .build(); + + RedactionResult result = redactionController.redact(request); + + try (FileOutputStream fileOutputStream = new FileOutputStream("/tmp/Redacted.pdf")) { + fileOutputStream.write(result.getDocument()); + } + long end = System.currentTimeMillis(); + + System.out.println("duration: " + (end - start)); + System.out.println("numberOfPages: " + result.getNumberOfPages()); + } + @Test public void classificationTest() throws IOException { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionServiceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionServiceTest.java index 3856b882..bc067897 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionServiceTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionServiceTest.java @@ -1,36 +1,91 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.Set; +import org.apache.commons.io.IOUtils; +import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.Test; import org.junit.runner.RunWith; +import org.kie.api.KieServices; +import org.kie.api.builder.KieBuilder; +import org.kie.api.builder.KieFileSystem; +import org.kie.api.builder.KieModule; import org.kie.api.runtime.KieContainer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Bean; +import org.springframework.core.io.ClassPathResource; import org.springframework.test.context.junit4.SpringRunner; +import com.iqser.red.service.configuration.v1.api.model.DefaultColor; +import com.iqser.red.service.configuration.v1.api.model.DictionaryResponse; +import com.iqser.red.service.configuration.v1.api.model.RulesResponse; +import com.iqser.red.service.configuration.v1.api.model.TypeResponse; +import com.iqser.red.service.configuration.v1.api.model.TypeResult; +import com.iqser.red.service.redaction.v1.model.RedactionRequest; +import com.iqser.red.service.redaction.v1.server.classification.model.Document; +import com.iqser.red.service.redaction.v1.server.client.DictionaryClient; +import com.iqser.red.service.redaction.v1.server.client.RulesClient; import com.iqser.red.service.redaction.v1.server.redaction.model.Entity; +import com.iqser.red.service.redaction.v1.server.redaction.utils.ResourceLoader; +import com.iqser.red.service.redaction.v1.server.segmentation.PdfSegmentationService; @RunWith(SpringRunner.class) @SpringBootTest public class EntityRedactionServiceTest { - @MockBean - private KieContainer kieContainer; + private static final String DEFAULT_RULES = loadFromClassPath("drools/rules.drl"); + private static final String NAME_CODE = "name"; + private static final String ADDRESS_CODE = "address"; @MockBean - private DroolsExecutionService droolsExecutionService; + private DictionaryClient dictionaryClient; @MockBean - private DictionaryService dictionaryService; + private RulesClient rulesClient; @Autowired private EntityRedactionService entityRedactionService; + @Autowired + private PdfSegmentationService pdfSegmentationService; + + @TestConfiguration + public static class RedactionIntegrationTestConfiguration { + + @Bean + public KieContainer kieContainer() { + + KieServices kieServices = KieServices.Factory.get(); + + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + InputStream input = new ByteArrayInputStream(DEFAULT_RULES.getBytes(StandardCharsets.UTF_8)); + kieFileSystem.write("src/test/resources/drools/rules.drl", kieServices.getResources() + .newInputStreamResource(input)); + KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); + kieBuilder.buildAll(); + KieModule kieModule = kieBuilder.getKieModule(); + + return kieServices.newKieContainer(kieModule.getReleaseId()); + } + + } + @Test public void testNestedEntitiesRemoval() { @@ -47,4 +102,74 @@ public class EntityRedactionServiceTest { } + + @Test + public void testTableRedaction() throws IOException { + + ClassPathResource pdfFileResource = new ClassPathResource("files/Minimal Examples/Single Table.pdf"); + + RedactionRequest redactionRequest = RedactionRequest.builder() + .document(IOUtils.toByteArray(pdfFileResource.getInputStream())) + .build(); + + String tableRules = "package drools\n" + + "\n" + + "import com.iqser.red.service.redaction.v1.server.redaction.model.Section\n" + + "\n" + + "global Section section\n" + + "rule \"8: Redact Authors and Addresses in Reference Table, if it is a Vertebrate study\"\n" + + " when\n" + + " Section(tabularData != null && tabularData.size() > 0\n" + + " && tabularData.containsKey(\"Vertebrate\\nstudy Y/N\")\n" + + " && tabularData.get(\"Vertebrate\\nstudy Y/N\").equals(\"Y\")\n" + + " )\n" + + " then\n" + + " section.redact(\"name\", 8, \"Redacted because row is a vertebrate study\");\n" + + " section.redact(\"address\", 8, \"Redacted because rows is a vertebrate study\");\n" + + " section.highlightCell(\"Vertebrate\\nstudy Y/N\");\n" + + " end"; + when(rulesClient.getVersion()).thenReturn(1L); + when(rulesClient.getRules()).thenReturn(new RulesResponse(tableRules)); + TypeResponse typeResponse = TypeResponse.builder() + .types(Arrays.asList( + TypeResult.builder().type(NAME_CODE).color(new float[]{1, 1, 0}).build(), + TypeResult.builder().type(ADDRESS_CODE).color(new float[]{0, 1, 1}).build())) + .build(); + when(dictionaryClient.getAllTypes()).thenReturn(typeResponse); + DictionaryResponse dictionaryResponse = DictionaryResponse.builder() + .entries(Arrays.asList("Casey, H.W.", "O’Loughlin, C.K.", "Salamon, C.M.", "Smith, S.H.")) + .build(); + when(dictionaryClient.getDictionaryForType(NAME_CODE)).thenReturn(dictionaryResponse); + DictionaryResponse addressResponse = DictionaryResponse.builder() + .entries(Collections.singletonList("Toxigenics, Inc., Decatur, IL 62526, USA")) + .build(); + when(dictionaryClient.getDictionaryForType(ADDRESS_CODE)).thenReturn(addressResponse); + when(dictionaryClient.getDefaultColor()).thenReturn(new DefaultColor()); + try (PDDocument pdDocument = PDDocument.load(new ByteArrayInputStream(redactionRequest.getDocument()))) { + Document classifiedDoc = pdfSegmentationService.parseDocument(pdDocument); + entityRedactionService.processDocument(classifiedDoc); + assertThat(classifiedDoc.getEntities()).hasSize(1); // one page + assertThat(classifiedDoc.getEntities().get(1)).hasSize(4); // 4 out of 5 entities recognized on page 1 + } + } + + + private static String loadFromClassPath(String path) { + + URL resource = ResourceLoader.class.getClassLoader().getResource(path); + if (resource == null) { + throw new IllegalArgumentException("could not load classpath resource: drools/rules.drl"); + } + try (BufferedReader br = new BufferedReader(new InputStreamReader(resource.openStream(), StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String str; + while ((str = br.readLine()) != null) { + sb.append(str).append("\n"); + } + return sb.toString(); + } catch (IOException e) { + throw new IllegalArgumentException("could not load classpath resource: " + path, e); + } + } + } \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl index 20f24015..bb5f051c 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl @@ -99,3 +99,14 @@ rule "8: Redact contact information, if Producer is found" section.redactBetween("No:", "Fax", "address", 8, "Producer was found"); end +rule "9: Redact Authors and Addresses in Reference Table, if it is a Vertebrate study" + when + Section(tabularData != null && tabularData.size() > 0 + && tabularData.containsKey("Vertebrate\nstudy Y/N") + && tabularData.get("Vertebrate\nstudy Y/N").equals("Y") + ) + then + section.redact("name", 8, "Redacted because row is a vertebrate study"); + section.redact("address", 8, "Redacted because rows is a vertebrate study"); + section.highlightCell("Vertebrate\nstudy Y/N"); + end \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Minimal Examples/Single Table.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a11ca954de0d6e7f16dfaf9c5960f72337680a5 GIT binary patch literal 82040 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%0A_R?`airxhZlEigc~P_P9D6zT;O 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

n?sNA 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ⅇ@gtMc?_I_HS$ET9inXb)E<+@Xo(^;lS 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