diff --git a/.gitignore b/.gitignore index 549e00a..5b60bf8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,12 @@ target/ !**/src/main/**/target/ !**/src/test/**/target/ +### maven build ### +*.class +/out/ +**/out/ +**/target/ + ### STS ### .apt_generated .classpath diff --git a/layoutparser-service/layoutparser-service-internal-api/pom.xml b/layoutparser-service/layoutparser-service-internal-api/pom.xml index 9b61b69..d52ccc6 100755 --- a/layoutparser-service/layoutparser-service-internal-api/pom.xml +++ b/layoutparser-service/layoutparser-service-internal-api/pom.xml @@ -2,8 +2,8 @@ - 4.0.0 + 4.0.0 com.knecon.fforesight @@ -12,9 +12,6 @@ layoutparser-service-internal-api - 1.0.0 - - pom @@ -29,21 +26,4 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/data/TableOfContentsData.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/data/TableOfContentsData.java index 3172b70..738dd1a 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/data/TableOfContentsData.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/data/TableOfContentsData.java @@ -5,8 +5,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Stream; -import javax.management.openmbean.InvalidKeyException; - import com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes.NodeType; import lombok.AccessLevel; @@ -23,15 +21,15 @@ import lombok.experimental.FieldDefaults; @FieldDefaults(level = AccessLevel.PRIVATE) public class TableOfContentsData { - List entries; + EntryData root; public EntryData get(List tocId) { - if (tocId.size() < 1) { - throw new InvalidKeyException(String.format("ClassificationSection Identifier: \"%s\" is not valid.", tocId)); + if (tocId.isEmpty()) { + return root; } - EntryData entry = entries.get(tocId.get(0)); + EntryData entry = root.subEntries.get(tocId.get(0)); for (int id : tocId.subList(1, tocId.size())) { entry = entry.subEntries().get(id); } @@ -41,7 +39,7 @@ public class TableOfContentsData { public Stream streamAllEntries() { - return entries.stream().flatMap(TableOfContentsData::flatten); + return Stream.concat(Stream.of(root), root.subEntries.stream()).flatMap(TableOfContentsData::flatten); } diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/DocumentGraph.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/DocumentGraph.java index 72ff2d6..1803b48 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/DocumentGraph.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/DocumentGraph.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import com.knecon.fforesight.service.layoutparser.internal.api.graph.entity.EntityNode; +import com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes.NodeType; import com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes.PageNode; import com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes.SectionNode; import com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes.SemanticNode; @@ -20,11 +21,13 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; @Data @Builder @AllArgsConstructor +@NoArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE) public class DocumentGraph implements SemanticNode { @@ -42,7 +45,7 @@ public class DocumentGraph implements SemanticNode { public List getMainSections() { - return tableOfContents.entries.stream().filter(entry -> entry.node() instanceof SectionNode).map(entry -> (SectionNode) entry.node()).collect(Collectors.toList()); + return streamChildren().filter(node -> node instanceof SectionNode).map(node -> (SectionNode) node).collect(Collectors.toList()); } @@ -74,14 +77,14 @@ public class DocumentGraph implements SemanticNode { private Stream streamAllNodes() { - return tableOfContents.streamEntriesInOrder().map(TableOfContents.Entry::node); + return tableOfContents.streamAllEntriesInOrder().map(TableOfContents.Entry::node); } @Override public String toString() { - return tableOfContents.toString(); + return NodeType.DOCUMENT + ": " + buildTextBlock().buildSummary(); } diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/TableOfContents.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/TableOfContents.java index b0fa0f0..14318bf 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/TableOfContents.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/TableOfContents.java @@ -1,10 +1,11 @@ package com.knecon.fforesight.service.layoutparser.internal.api.graph; +import static java.lang.String.format; + import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.NoSuchElementException; import java.util.stream.Stream; import com.google.common.hash.Hashing; @@ -19,22 +20,22 @@ import lombok.Data; @Data public class TableOfContents { - List entries; + private final Entry root; - public TableOfContents() { + public TableOfContents(DocumentGraph documentGraph) { - entries = new LinkedList<>(); + root = Entry.builder().tocId(Collections.emptyList()).type(NodeType.DOCUMENT).children(new LinkedList<>()).node(documentGraph).build(); } public TextBlock buildTextBlock() { - return streamEntriesInOrder().map(Entry::node).filter(SemanticNode::isTerminal).map(SemanticNode::getTerminalTextBlock).collect(new TextBlockCollector()); + return streamAllEntriesInOrder().map(Entry::node).filter(SemanticNode::isTerminal).map(SemanticNode::getTerminalTextBlock).collect(new TextBlockCollector()); } - public List createNewEntryAndReturnId(NodeType nodeType, SemanticNode node) { + public List createNewMainEntryAndReturnId(NodeType nodeType, SemanticNode node) { return createNewChildEntryAndReturnId(Collections.emptyList(), nodeType, node); } @@ -42,27 +43,25 @@ public class TableOfContents { public List createNewChildEntryAndReturnId(List parentId, NodeType nodeType, SemanticNode node) { - List newId; - if (entryExists(parentId)) { - Entry parent = getEntryById(parentId); - newId = new LinkedList<>(parentId); - newId.add(parent.children().size()); - parent.children().add(Entry.builder().tocId(newId).node(node).type(nodeType).children(new LinkedList<>()).build()); - } else { - newId = List.of(entries.size()); - entries.add(Entry.builder().tocId(newId).node(node).type(nodeType).children(new LinkedList<>()).build()); + if (!entryExists(parentId)) { + throw new UnsupportedOperationException(format("parentId %s does not exist!", parentId)); } + Entry parent = getEntryById(parentId); + List newId = new LinkedList<>(parentId); + newId.add(parent.children().size()); + parent.children().add(Entry.builder().tocId(newId).node(node).type(nodeType).children(new LinkedList<>()).build()); + return newId; } private boolean entryExists(List tocId) { - if (tocId.size() < 1) { - return false; + if (tocId.isEmpty()) { + return root != null; } - Entry entry = entries.get(tocId.get(0)); + Entry entry = root.children.get(tocId.get(0)); for (int id : tocId.subList(1, tocId.size())) { if (id >= entry.children.size() || 0 > id) { return false; @@ -75,22 +74,17 @@ public class TableOfContents { public Entry getParentEntryById(List tocId) { - List parentIds = getParentId(tocId); - if (parentIds.size() < 1) { - throw new NoSuchElementException(String.format("Node with tocId \"%s\" has no parent!", tocId)); - } - return getEntryById(parentIds); + return getEntryById(getParentId(tocId)); } public boolean hasParentById(List tocId) { - List parentId = getParentId(tocId); - return entryExists(parentId); + return entryExists(getParentId(tocId)); } - public Stream streamChildren(List tocId) { + public Stream streamChildrenNodes(List tocId) { return getEntryById(tocId).children().stream().map(Entry::node); } @@ -98,13 +92,22 @@ public class TableOfContents { private static List getParentId(List tocId) { + if (tocId.isEmpty()) { + throw new UnsupportedOperationException("Root has no parent!"); + } + if (tocId.size() < 2) { + return Collections.emptyList(); + } return tocId.subList(0, tocId.size() - 1); } public Entry getEntryById(List tocId) { - Entry entry = entries.get(tocId.get(0)); + if (tocId.isEmpty()) { + return root; + } + Entry entry = root.children.get(tocId.get(0)); for (int id : tocId.subList(1, tocId.size())) { entry = entry.children().get(id); } @@ -112,13 +115,19 @@ public class TableOfContents { } - public Stream streamEntriesInOrder() { + public Stream streamMainEntries() { - return entries.stream().flatMap(TableOfContents::flatten); + return root.children.stream(); } - public Stream streamSubEntriesInOrder(List parentId) { + public Stream streamAllEntriesInOrder() { + + return Stream.of(root).flatMap(TableOfContents::flatten); + } + + + public Stream streamAllSubEntriesInOrder(List parentId) { return Stream.of(getEntryById(parentId)).flatMap(TableOfContents::flatten); } @@ -127,13 +136,13 @@ public class TableOfContents { @Override public String toString() { - return String.join("\n", streamEntriesInOrder().map(Entry::toString).toList()); + return String.join("\n", streamAllEntriesInOrder().map(Entry::toString).toList()); } public String toString(List id) { - return String.join("\n", streamSubEntriesInOrder(id).map(Entry::toString).toList()); + return String.join("\n", streamAllSubEntriesInOrder(id).map(Entry::toString).toList()); } diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/NodeType.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/NodeType.java index df2f63b..a85c4aa 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/NodeType.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/NodeType.java @@ -1,6 +1,7 @@ package com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes; public enum NodeType { + DOCUMENT, SECTION, HEADLINE, PARAGRAPH, diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/SemanticNode.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/SemanticNode.java index bd24328..5937555 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/SemanticNode.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/graph/nodes/SemanticNode.java @@ -205,7 +205,7 @@ public interface SemanticNode { */ default Stream streamChildren() { - return getTableOfContents().streamChildren(getTocId()); + return getTableOfContents().streamChildrenNodes(getTocId()); } @@ -216,7 +216,7 @@ public interface SemanticNode { */ default Stream streamAllSubNodes() { - return getTableOfContents().streamSubEntriesInOrder(getTocId()).map(TableOfContents.Entry::node); + return getTableOfContents().streamAllSubEntriesInOrder(getTocId()).map(TableOfContents.Entry::node); } diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentDataMapper.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentDataMapper.java index 4fc78a9..231eddd 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentDataMapper.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentDataMapper.java @@ -48,7 +48,7 @@ public class DocumentDataMapper { private TableOfContentsData toTableOfContentsData(TableOfContents tableOfContents) { - return new TableOfContentsData(tableOfContents.getEntries().stream().map(this::toEntryData).toList()); + return new TableOfContentsData(toEntryData(tableOfContents.getRoot())); } diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentGraphMapper.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentGraphMapper.java index e3683db..43e3c66 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentGraphMapper.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/mapper/DocumentGraphMapper.java @@ -38,8 +38,10 @@ public class DocumentGraphMapper { public DocumentGraph toDocumentGraph(DocumentData documentData) { + + DocumentGraph documentGraph = new DocumentGraph(); Context context = new Context(documentData, - new TableOfContents(), + new TableOfContents(documentGraph), new LinkedList<>(), new LinkedList<>(), Arrays.stream(documentData.getAtomicTextBlocks()).toList(), @@ -47,13 +49,12 @@ public class DocumentGraphMapper { context.pages.addAll(Arrays.stream(documentData.getPages()).map(this::buildPage).toList()); - context.tableOfContents.setEntries(buildEntries(documentData.getTableOfContents().getEntries(), context)); + context.tableOfContents.getRoot().children().addAll(buildEntries(documentData.getTableOfContents().getRoot().subEntries(), context)); + + documentGraph.setTableOfContents(context.tableOfContents); + documentGraph.setPages(new HashSet<>(context.pages)); + documentGraph.setNumberOfPages(documentData.getPages().length); - DocumentGraph documentGraph = DocumentGraph.builder() - .numberOfPages(documentData.getPages().length) - .pages(new HashSet<>(context.pages)) - .tableOfContents(context.tableOfContents) - .build(); documentGraph.setTextBlock(documentGraph.buildTextBlock()); return documentGraph; } diff --git a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/services/EntityInsertionService.java b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/services/EntityInsertionService.java index 1b67b32..c4b83c3 100644 --- a/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/services/EntityInsertionService.java +++ b/layoutparser-service/layoutparser-service-internal-api/src/main/java/com.knecon.fforesight.service.layoutparser.internal.api/services/EntityInsertionService.java @@ -1,5 +1,6 @@ package com.knecon.fforesight.service.layoutparser.internal.api.services; +import java.util.Collections; import java.util.NoSuchElementException; import java.util.Set; @@ -21,9 +22,7 @@ public class EntityInsertionService { public void addEntityToGraph(EntityNode entity, TableOfContents tableOfContents) { try { - SemanticNode containingNode = tableOfContents.getEntries() - .stream() - .map(TableOfContents.Entry::node) + SemanticNode containingNode = tableOfContents.streamChildrenNodes(Collections.emptyList()) .filter(node -> node.buildTextBlock().containsBoundary(entity.getBoundary())) .findFirst() .orElseThrow(() -> new NoSuchElementException("No containing Node found!")); @@ -37,7 +36,6 @@ public class EntityInsertionService { addToNodeEntitySets(entity); } catch (NoSuchElementException e) { - entityEnrichmentService.enrichEntity(entity, tableOfContents.buildTextBlock()); entity.removeFromGraph(); } } diff --git a/layoutparser-service/layoutparser-service-processor/pom.xml b/layoutparser-service/layoutparser-service-processor/pom.xml index c9e1b73..4a0bd02 100644 --- a/layoutparser-service/layoutparser-service-processor/pom.xml +++ b/layoutparser-service/layoutparser-service-processor/pom.xml @@ -10,94 +10,78 @@ layoutparser-service-processor - 1.0.0 - com.iqser.red.service persistence-service-internal-api-v1 2.36.0 - com.knecon.fforesight layoutparser-service-internal-api ${project.version} - - - com.iqser.red.commons - spring-commons - 6.2.0 - - com.iqser.red.commons storage-commons 1.13.0 - + + com.iqser.red.commons + spring-commons + 6.2.0 + com.dslplatform dsl-json-java8 1.10.0 - org.apache.pdfbox pdfbox ${pdfbox.version} - org.apache.pdfbox pdfbox-tools ${pdfbox.version} - com.google.guava guava 31.1-jre - com.fasterxml.jackson.module jackson-module-afterburner ${jackson.version} - com.fasterxml.jackson.datatype jackson-datatype-jsr310 ${jackson.version} - org.springframework.boot spring-boot-starter-security ${spring.version} - org.springframework.boot spring-boot-starter-web ${spring.version} - org.projectlombok lombok true - org.springframework.cloud spring-cloud-starter-openfeign 4.0.2 - org.springframework.boot spring-boot-starter-amqp @@ -105,22 +89,6 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - spring-milestones diff --git a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/factory/DocumentGraphFactory.java b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/factory/DocumentGraphFactory.java index 217212f..95d54b6 100644 --- a/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/factory/DocumentGraphFactory.java +++ b/layoutparser-service/layoutparser-service-processor/src/main/java/com/knecon/fforesight/service/layoutparser/processor/factory/DocumentGraphFactory.java @@ -52,15 +52,17 @@ public class DocumentGraphFactory { public DocumentGraph buildDocumentGraph(ClassificationDocument document) { TextBlockFactory textBlockFactory = new TextBlockFactory(); - Context context = new Context(new TableOfContents(), new HashMap<>(), new LinkedList<>(), new LinkedList<>(), textBlockFactory); + DocumentGraph documentGraph = new DocumentGraph(); + Context context = new Context(new TableOfContents(documentGraph), new HashMap<>(), new LinkedList<>(), new LinkedList<>(), textBlockFactory); document.getPages().stream().map(this::buildPage).forEach(page -> context.pages().put(page, new AtomicInteger(1))); document.getSections().stream().flatMap(section -> section.getImages().stream()).forEach(image -> context.images().add(image)); addSections(document, context); addHeaderAndFooterToEachPage(document, context); - DocumentGraph documentGraph = DocumentGraph.builder().numberOfPages(context.pages.size()).pages(context.pages.keySet()).tableOfContents(context.tableOfContents).build(); - + documentGraph.setNumberOfPages(context.pages.size()); + documentGraph.setPages(context.pages.keySet()); + documentGraph.setTableOfContents(context.tableOfContents); documentGraph.setTextBlock(documentGraph.buildTextBlock()); return documentGraph; } @@ -82,7 +84,7 @@ public class DocumentGraphFactory { List tocId; if (parentNode == null) { - tocId = context.tableOfContents.createNewEntryAndReturnId(NodeType.SECTION, sectionNode); + tocId = context.tableOfContents.createNewMainEntryAndReturnId(NodeType.SECTION, sectionNode); } else { tocId = context.tableOfContents.createNewChildEntryAndReturnId(parentNode.getTocId(), NodeType.SECTION, sectionNode); } @@ -309,7 +311,7 @@ public class DocumentGraphFactory { footer, context, page); - List tocId = context.tableOfContents().createNewEntryAndReturnId(NodeType.FOOTER, footer); + List tocId = context.tableOfContents().createNewMainEntryAndReturnId(NodeType.FOOTER, footer); footer.setTocId(tocId); footer.setTerminalTextBlock(textBlock); page.setFooter(footer); @@ -325,7 +327,7 @@ public class DocumentGraphFactory { context, 0, page); - List tocId = context.tableOfContents().createNewEntryAndReturnId(NodeType.HEADER, header); + List tocId = context.tableOfContents().createNewMainEntryAndReturnId(NodeType.HEADER, header); header.setTocId(tocId); header.setTerminalTextBlock(textBlock); page.setHeader(header); @@ -337,7 +339,7 @@ public class DocumentGraphFactory { PageNode page = getPage(pageIndex, context); FooterNode footer = FooterNode.builder().tableOfContents(context.tableOfContents()).build(); AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlock(footer, context, page); - List tocId = context.tableOfContents().createNewEntryAndReturnId(NodeType.FOOTER, footer); + List tocId = context.tableOfContents().createNewMainEntryAndReturnId(NodeType.FOOTER, footer); footer.setTocId(tocId); footer.setTerminalTextBlock(textBlock); page.setFooter(footer); @@ -349,7 +351,7 @@ public class DocumentGraphFactory { PageNode page = getPage(pageIndex, context); HeaderNode header = HeaderNode.builder().tableOfContents(context.tableOfContents()).build(); AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlock(header, 0, page); - List tocId = context.tableOfContents().createNewEntryAndReturnId(NodeType.HEADER, header); + List tocId = context.tableOfContents().createNewMainEntryAndReturnId(NodeType.HEADER, header); header.setTocId(tocId); header.setTerminalTextBlock(textBlock); page.setHeader(header); diff --git a/layoutparser-service/layoutparser-service-server/pom.xml b/layoutparser-service/layoutparser-service-server/pom.xml index c95d10a..d9372f1 100644 --- a/layoutparser-service/layoutparser-service-server/pom.xml +++ b/layoutparser-service/layoutparser-service-server/pom.xml @@ -10,7 +10,6 @@ layoutparser-service-server - 1.0.0 @@ -18,7 +17,11 @@ layoutparser-service-processor ${project.version} - + + com.iqser.red.commons + spring-commons + 6.2.0 + javax.servlet javax.servlet-api @@ -29,13 +32,11 @@ spring-cloud-starter-openfeign 4.0.2 - org.springframework.boot spring-boot-starter-amqp ${spring.version} - org.junit.jupiter junit-jupiter-api @@ -54,5 +55,28 @@ 6.0.3 test + + org.mockito + mockito-core + 5.3.0 + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/ApplicationTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/ApplicationTest.java deleted file mode 100644 index 24573c1..0000000 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/ApplicationTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.knecon.fforesight.service.layoutparser.server; - -import static org.junit.jupiter.api.Assertions.*; - -class ApplicationTest { - -} \ No newline at end of file diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/LayoutParserApplicationTests.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/ApplicationTests.java similarity index 53% rename from layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/LayoutParserApplicationTests.java rename to layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/ApplicationTests.java index a2af3fe..16489d0 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/LayoutParserApplicationTests.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/ApplicationTests.java @@ -2,7 +2,9 @@ package com.knecon.fforesight.service.layoutparser.server; import org.junit.jupiter.api.Test; -class LayoutParserApplicationTests extends BaseTest { +import com.knecon.fforesight.service.layoutparser.server.utils.BaseTest; + +class ApplicationTests extends BaseTest { @Test void contextLoads() { diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/BuildDocumentGraphTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/BuildDocumentGraphTest.java new file mode 100644 index 0000000..a264ecf --- /dev/null +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/BuildDocumentGraphTest.java @@ -0,0 +1,51 @@ +package com.knecon.fforesight.service.layoutparser.server.graph; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.InputStream; + +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; + +import com.knecon.fforesight.service.layoutparser.internal.api.graph.DocumentGraph; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingService; +import com.knecon.fforesight.service.layoutparser.processor.adapter.model.table.TableServiceResponse; +import com.knecon.fforesight.service.layoutparser.server.utils.BaseTest; + +import lombok.SneakyThrows; + +public class BuildDocumentGraphTest extends BaseTest { + + @Autowired + private LayoutParsingService layoutParsingService; + + @Test + public void buildMetolachlor() { + + DocumentGraph documentGraph = buildGraph("files/S-Metolachlor_RAR_01_Volume_1_2018-09-06"); + assertEquals(221, documentGraph.getPages().size()); + assertEquals(220 , documentGraph.getPages().stream().filter(page -> page.getHeader().hasText()).count()); + assertEquals(0 , documentGraph.getPages().stream().filter(page -> page.getFooter().hasText()).count()); + } + + + @SneakyThrows + protected DocumentGraph buildGraph(String filename) { + + if (filename.equals("files/S-Metolachlor_RAR_01_Volume_1_2018-09-06")) { + prepareStorage(filename + ".pdf", "cv_table_parsing_response/empty.json", "image_service_response/S-Metolachlor_RAR_01_Volume_1_2018-09-06.IMAGE_INFO.json"); + } else { + prepareStorage(filename + ".pdf"); + } + ClassPathResource fileResource = new ClassPathResource(filename + ".pdf"); + + try (InputStream inputStream = fileResource.getInputStream()) { + PDDocument pdDocument = Loader.loadPDF(inputStream); + return layoutParsingService.parseLayout(pdDocument, layoutParsingStorageService.getImagesFile(IMAGE_FILE_ID), new TableServiceResponse()); + } + } + +} diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphEntityInsertionTest.java similarity index 87% rename from layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphTest.java rename to layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphEntityInsertionTest.java index bf02e3a..3e27b20 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphEntityInsertionTest.java @@ -4,14 +4,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.wildfly.common.Assert.assertTrue; -import java.io.InputStream; import java.util.List; -import org.apache.pdfbox.Loader; -import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; import com.knecon.fforesight.service.layoutparser.internal.api.graph.Boundary; import com.knecon.fforesight.service.layoutparser.internal.api.graph.DocumentGraph; @@ -26,21 +22,13 @@ import com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes.Table import com.knecon.fforesight.service.layoutparser.internal.api.graph.nodes.TableNode; import com.knecon.fforesight.service.layoutparser.internal.api.graph.textblock.TextBlock; import com.knecon.fforesight.service.layoutparser.internal.api.services.EntityInsertionService; -import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingService; -import com.knecon.fforesight.service.layoutparser.processor.adapter.model.table.TableServiceResponse; -import com.knecon.fforesight.service.layoutparser.server.BaseTest; -import com.knecon.fforesight.service.layoutparser.server.TestEntity; +import com.knecon.fforesight.service.layoutparser.server.utils.TestEntity; -import lombok.SneakyThrows; - -public class DocumentGraphTest extends BaseTest { +public class DocumentGraphEntityInsertionTest extends BuildDocumentGraphTest { @Autowired private EntityInsertionService entityInsertionService; - @Autowired - private LayoutParsingService layoutParsingService; - @Test public void assertTextBeforeAndTextAfterForParagraphCrafted() { @@ -51,7 +39,7 @@ public class DocumentGraphTest extends BaseTest { assert start != -1; Boundary boundary = new Boundary(start, start + searchTerm.length()); - TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); + TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); entityInsertionService.addEntityToGraph(entityNode, documentGraph.getTableOfContents()); assertEquals("Expand to Hint ", entityNode.getTextBefore()); @@ -76,7 +64,7 @@ public class DocumentGraphTest extends BaseTest { assert start != -1; Boundary boundary = new Boundary(start, start + searchTerm.length()); - TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); + TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); entityInsertionService.addEntityToGraph(entityNode, documentGraph.getTableOfContents()); assertEquals("", entityNode.getTextBefore()); @@ -132,7 +120,7 @@ public class DocumentGraphTest extends BaseTest { DocumentGraph documentGraph = buildGraph("files/crafted document"); TableNode table = (TableNode) documentGraph.getTableOfContents()// - .streamEntriesInOrder()// + .streamAllEntriesInOrder()// .filter(entry -> entry.type().equals(NodeType.TABLE))// .map(TableOfContents.Entry::node)// .findFirst().orElseThrow(); @@ -162,7 +150,7 @@ public class DocumentGraphTest extends BaseTest { DocumentGraph documentGraph = buildGraph("files/S-Metolachlor_RAR_01_Volume_1_2018-09-06"); TableNode table = (TableNode) documentGraph.getTableOfContents() - .streamEntriesInOrder() + .streamAllEntriesInOrder() .filter(entry -> entry.node().getPages().stream().anyMatch(page -> page.getNumber() == 22)) .filter(entry -> entry.type().equals(NodeType.TABLE)) .map(TableOfContents.Entry::node) @@ -187,7 +175,7 @@ public class DocumentGraphTest extends BaseTest { assert start != -1; Boundary boundary = new Boundary(start, start + searchTerm.length()); - TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); + TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); entityInsertionService.addEntityToGraph(entityNode, documentGraph.getTableOfContents()); assertEquals("except Cranberry; Vegetable, ", entityNode.getTextBefore()); @@ -214,7 +202,7 @@ public class DocumentGraphTest extends BaseTest { assert start != -1; Boundary boundary = new Boundary(start, start + searchTerm.length()); - TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); + TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); entityInsertionService.addEntityToGraph(entityNode, documentGraph.getTableOfContents()); assertEquals("2.6.1 Summary of ", entityNode.getTextBefore()); @@ -240,7 +228,7 @@ public class DocumentGraphTest extends BaseTest { assert start != -1; Boundary boundary = new Boundary(start, start + searchTerm.length()); - TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); + TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); entityInsertionService.addEntityToGraph(entityNode, documentGraph.getTableOfContents()); assertEquals("2-[(2-(1-hydroxy-ethyl)-6methyl-phenyl-amino]propan-1-ol (", entityNode.getTextBefore()); @@ -258,23 +246,6 @@ public class DocumentGraphTest extends BaseTest { } - @SneakyThrows - protected DocumentGraph buildGraph(String filename) { - - if (filename.equals("files/S-Metolachlor_RAR_01_Volume_1_2018-09-06")) { - prepareStorage(filename + ".pdf", "cv_table_parsing_response/empty.json", "image_service_response/S-Metolachlor_RAR_01_Volume_1_2018-09-06.IMAGE_INFO.json"); - } else { - prepareStorage(filename + ".pdf"); - } - ClassPathResource fileResource = new ClassPathResource(filename + ".pdf"); - - try (InputStream inputStream = fileResource.getInputStream()) { - PDDocument pdDocument = Loader.loadPDF(inputStream); - return layoutParsingService.parseLayout(pdDocument, layoutParsingStorageService.getImagesFile(IMAGE_FILE_ID), new TableServiceResponse()); - } - } - - private static void assertSameOffsetInAllIntersectingNodes(String searchTerm, int start, EntityNode entityNode) { List paragraphStart = entityNode.getIntersectingNodes().stream()// @@ -293,7 +264,7 @@ public class DocumentGraphTest extends BaseTest { assert start != -1; Boundary boundary = new Boundary(start, start + searchTerm.length()); - TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); + TestEntity entityNode = TestEntity.initialEntityNode(boundary, "123", "123"); entityInsertionService.addEntityToGraph(entityNode, documentGraph.getTableOfContents()); PageNode pageNode = documentGraph.getPages().stream().filter(page -> page.getNumber() == pageNumber).findFirst().orElseThrow(); diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphMappingTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphMappingTest.java index cd0bf02..74d18fe 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphMappingTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphMappingTest.java @@ -1,31 +1,18 @@ package com.knecon.fforesight.service.layoutparser.server.graph; -import java.util.Collections; - -import org.apache.pdfbox.Loader; -import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; import com.knecon.fforesight.service.layoutparser.internal.api.data.DocumentData; import com.knecon.fforesight.service.layoutparser.internal.api.graph.DocumentGraph; import com.knecon.fforesight.service.layoutparser.internal.api.mapper.DocumentDataMapper; import com.knecon.fforesight.service.layoutparser.internal.api.mapper.DocumentGraphMapper; -import com.knecon.fforesight.service.layoutparser.processor.classification.service.PdfParsingService; -import com.knecon.fforesight.service.layoutparser.processor.factory.DocumentGraphFactory; import com.knecon.fforesight.service.layoutparser.processor.queue.LayoutParsingRequest; -import com.knecon.fforesight.service.layoutparser.server.BaseTest; import lombok.SneakyThrows; -public class DocumentGraphMappingTest extends BaseTest { +public class DocumentGraphMappingTest extends BuildDocumentGraphTest { - @Autowired - private DocumentGraphFactory documentGraphFactory; - - @Autowired - private PdfParsingService pdfParsingService; @Autowired private DocumentDataMapper documentDataMapper; @@ -38,17 +25,10 @@ public class DocumentGraphMappingTest extends BaseTest { @SneakyThrows public void testGraphMapping() { - String filename = "files/crafted document"; + DocumentGraph document = buildGraph("files/crafted document"); + LayoutParsingRequest layoutParsingRequest = buildStandardLayoutParsingRequest(); - prepareStorage(filename + ".pdf"); - ClassPathResource fileResource = new ClassPathResource(filename + ".pdf"); - LayoutParsingRequest layoutParsingRequest = prepareStorage(fileResource.getInputStream()); - PDDocument pdDocument = Loader.loadPDF(fileResource.getInputStream()); - - var classifiedDoc = pdfParsingService.parseDocument(pdDocument, Collections.emptyMap(), Collections.emptyMap()); - DocumentGraph document = documentGraphFactory.buildDocumentGraph(classifiedDoc); DocumentData documentData = documentDataMapper.toDocumentData(document); - layoutParsingStorageService.storeDocumentData(layoutParsingRequest, documentData); DocumentData documentData2 = layoutParsingStorageService.readDocumentData(layoutParsingRequest); DocumentGraph newDocumentGraph = documentGraphMapper.toDocumentGraph(documentData2); diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphVisualizationTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphVisualizationTest.java index 0e252e4..27a825c 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphVisualizationTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/graph/DocumentGraphVisualizationTest.java @@ -12,37 +12,50 @@ import org.springframework.core.io.ClassPathResource; import com.knecon.fforesight.service.layoutparser.internal.api.graph.DocumentGraph; import com.knecon.fforesight.service.layoutparser.internal.api.graph.textblock.TextBlock; -import com.knecon.fforesight.service.layoutparser.server.visualizations.PdfDraw; +import com.knecon.fforesight.service.layoutparser.server.utils.visualizations.PdfDraw; import lombok.SneakyThrows; - -@Disabled -public class DocumentGraphVisualizationTest extends DocumentGraphTest { +public class DocumentGraphVisualizationTest extends BuildDocumentGraphTest { @Test @SneakyThrows + @Disabled public void visualizeMetolachlor() { String filename = "files/S-Metolachlor_RAR_01_Volume_1_2018-09-06"; - - DocumentGraph documentGraph = buildGraph(filename); - TextBlock textBlock = documentGraph.buildTextBlock(); - - visualizeSemanticNodes(filename, documentGraph, textBlock); + visualizePdf(filename); } @Test @SneakyThrows + @Disabled public void visualizeRotatedTestDocument() { String filename = "files/RotateTestFileWithImages"; + visualizePdf(filename); + } + + + @Test + @SneakyThrows + @Disabled + public void visualizeCraftedDocument() { + + String filename = "files/crafted document"; + visualizePdf(filename); + } + + + @SneakyThrows + private void visualizePdf(String filename) { DocumentGraph documentGraph = buildGraph(filename); TextBlock textBlock = documentGraph.buildTextBlock(); visualizeSemanticNodes(filename, documentGraph, textBlock); + } diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/BaseTest.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/BaseTest.java similarity index 77% rename from layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/BaseTest.java rename to layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/BaseTest.java index 74e28c2..0922784 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/BaseTest.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/BaseTest.java @@ -1,9 +1,10 @@ -package com.knecon.fforesight.service.layoutparser.server; +package com.knecon.fforesight.service.layoutparser.server.utils; import java.io.InputStream; import java.util.Optional; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; @@ -12,6 +13,7 @@ import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; @@ -22,9 +24,12 @@ import com.iqser.red.storage.commons.service.StorageService; import com.knecon.fforesight.service.layoutparser.internal.api.mapper.DocumentDataMapper; import com.knecon.fforesight.service.layoutparser.internal.api.mapper.DocumentGraphMapper; import com.knecon.fforesight.service.layoutparser.internal.api.services.EntityEnrichmentService; +import com.knecon.fforesight.service.layoutparser.internal.api.services.EntityInsertionService; import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingStorageService; import com.knecon.fforesight.service.layoutparser.processor.multitenancy.TenantContext; +import com.knecon.fforesight.service.layoutparser.processor.multitenancy.TenantsClient; import com.knecon.fforesight.service.layoutparser.processor.queue.LayoutParsingRequest; +import com.knecon.fforesight.service.layoutparser.server.Application; import lombok.SneakyThrows; @@ -39,6 +44,9 @@ public class BaseTest { @Autowired protected StorageService storageService; + @Autowired + protected TenantsClient tenantsClient; + @MockBean private RabbitTemplate rabbitTemplate; @@ -49,6 +57,35 @@ public class BaseTest { protected final static String TEXT_FILE_ID = "texts"; protected final static String POSITION_FILE_ID = "positions"; protected final static String PAGES_FILE_ID = "pages"; + protected final static String TENANT_ID = "tenant"; + + + protected LayoutParsingRequest buildStandardLayoutParsingRequest() { + + return LayoutParsingRequest.builder() + .imagesFileStorageId(Optional.of(IMAGE_FILE_ID)) + .originFileStorageId(ORIGIN_FILE_ID) + .tablesFileStorageId(Optional.of(TABLE_FILE_ID)) + .pageFileStorageId(PAGES_FILE_ID) + .positionBlockFileStorageId(POSITION_FILE_ID) + .structureFileStorageId(STRUCTURE_FILE_ID) + .textBlockFileStorageId(TEXT_FILE_ID) + .build(); + } + + + @BeforeEach + public void setupTenantContext() { + + TenantContext.setTenantId(TENANT_ID); + } + + + @AfterEach + public void clearTenantContext() { + + TenantContext.clear(); + } @SneakyThrows @@ -115,6 +152,7 @@ public class BaseTest { @Configuration @EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) + @ComponentScan("com.knecon.fforesight.service.layoutparser") public static class TestConfiguration { @Bean @@ -125,13 +163,6 @@ public class BaseTest { } - @Bean - public EntityEnrichmentService testEntityEnrichmentService() { - - return new TestEntityEnrichmentService(); - } - - @Bean public DocumentDataMapper documentDataMapper() { @@ -145,6 +176,14 @@ public class BaseTest { return new DocumentGraphMapper(); } + + @Bean + @Autowired + public EntityInsertionService entityInsertionService(EntityEnrichmentService entityEnrichmentService) { + + return new EntityInsertionService(entityEnrichmentService); + } + } } diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/FileSystemBackedStorageService.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/FileSystemBackedStorageService.java similarity index 96% rename from layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/FileSystemBackedStorageService.java rename to layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/FileSystemBackedStorageService.java index 809cb9e..9f12673 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/FileSystemBackedStorageService.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/FileSystemBackedStorageService.java @@ -1,4 +1,4 @@ -package com.knecon.fforesight.service.layoutparser.server; +package com.knecon.fforesight.service.layoutparser.server.utils; import static java.io.File.createTempFile; @@ -14,6 +14,7 @@ import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.springframework.core.io.InputStreamResource; +import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.commons.jackson.ObjectMapperFactory; @@ -22,6 +23,7 @@ import com.iqser.red.storage.commons.service.StorageService; import lombok.SneakyThrows; +@Service public class FileSystemBackedStorageService implements StorageService { private final Map dataMap = new HashMap<>(); diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/TestEntity.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestEntity.java similarity index 98% rename from layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/TestEntity.java rename to layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestEntity.java index 22c7eec..1876606 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/TestEntity.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestEntity.java @@ -1,4 +1,4 @@ -package com.knecon.fforesight.service.layoutparser.server; +package com.knecon.fforesight.service.layoutparser.server.utils; import java.nio.charset.StandardCharsets; import java.util.HashSet; diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/TestEntityEnrichmentService.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestEntityEnrichmentService.java similarity index 96% rename from layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/TestEntityEnrichmentService.java rename to layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestEntityEnrichmentService.java index 76a54c1..5336872 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/TestEntityEnrichmentService.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestEntityEnrichmentService.java @@ -1,15 +1,18 @@ -package com.knecon.fforesight.service.layoutparser.server; +package com.knecon.fforesight.service.layoutparser.server.utils; import java.util.Arrays; import java.util.List; import java.util.Objects; +import org.springframework.stereotype.Service; + import com.knecon.fforesight.service.layoutparser.internal.api.graph.entity.EntityNode; import com.knecon.fforesight.service.layoutparser.internal.api.graph.textblock.TextBlock; import com.knecon.fforesight.service.layoutparser.internal.api.services.EntityEnrichmentService; import lombok.RequiredArgsConstructor; +@Service @RequiredArgsConstructor public class TestEntityEnrichmentService implements EntityEnrichmentService { diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestTenantsClient.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestTenantsClient.java new file mode 100644 index 0000000..6033996 --- /dev/null +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/TestTenantsClient.java @@ -0,0 +1,42 @@ +package com.knecon.fforesight.service.layoutparser.server.utils; + +import java.util.Collections; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; +import com.knecon.fforesight.service.layoutparser.processor.multitenancy.TenantsClient; + +@Service +public class TestTenantsClient implements TenantsClient { + + @Override + public void createTenant(TenantRequest tenantRequest) { + + } + + + @Override + public List getTenants() { + + return Collections.emptyList(); + } + + + @Override + public TenantResponse getTenant(String tenantId) { + + return null; + } + + + @Override + public JSONPrimitive getDeploymentKey(String tenantId) { + + return null; + } + +} diff --git a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/visualizations/PdfDraw.java b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/visualizations/PdfDraw.java similarity index 91% rename from layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/visualizations/PdfDraw.java rename to layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/visualizations/PdfDraw.java index 6113d09..70b1275 100644 --- a/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/visualizations/PdfDraw.java +++ b/layoutparser-service/layoutparser-service-server/src/test/java/com/knecon/fforesight/service/layoutparser/server/utils/visualizations/PdfDraw.java @@ -1,4 +1,4 @@ -package com.knecon.fforesight.service.layoutparser.server.visualizations; +package com.knecon.fforesight.service.layoutparser.server.utils.visualizations; import java.awt.Color; import java.awt.geom.Point2D; @@ -36,7 +36,7 @@ public class PdfDraw { public static void drawDocumentGraph(PDDocument document, DocumentGraph documentGraph) { - documentGraph.getTableOfContents().streamEntriesInOrder().forEach(entry -> drawNode(document, entry)); + documentGraph.getTableOfContents().streamAllEntriesInOrder().forEach(entry -> drawNode(document, entry)); } @@ -72,8 +72,11 @@ public class PdfDraw { contentStream.setLineWidth(options.getStrokeWidth()); contentStream.beginText(); - contentStream.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(30), 0, 0)); - contentStream.newLineAtOffset((float) location.getX(), (float) location.getY()); + if (rotate) { + contentStream.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(15), (float) location.getX(), (float) location.getY())); + } else { + contentStream.newLineAtOffset((float) location.getX(), (float) location.getY()); + } contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.HELVETICA), 10); contentStream.showText(string); contentStream.endText(); @@ -136,6 +139,7 @@ public class PdfDraw { private static Options buildStandardOptionsForNodes(TableOfContents.Entry entry) { return Options.builder().stroke(true).strokeColor(switch (entry.type()) { + case DOCUMENT -> Color.LIGHT_GRAY; case HEADER, FOOTER -> Color.GREEN; case PARAGRAPH -> Color.BLUE; case HEADLINE -> Color.RED;