From 56ad59f2ad80d9c2a1383eabf06946a209f5fccd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 27 Jan 2018 18:23:46 +0000 Subject: Find parts related to main document using main document relationships --- .../mammoth/internal/docx/DocumentReader.java | 27 ++++++++++++++---- .../mammoth/tests/docx/DocumentReaderTests.java | 33 +++++++++++++++++----- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java index 6176aec..a616aac 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/DocumentReader.java @@ -61,10 +61,18 @@ public class DocumentReader { public static class PartPaths { private final String mainDocument; private final String comments; + private final String endnotes; + private final String footnotes; + private final String numbering; + private final String styles; - public PartPaths(String mainDocument, String comments) { + public PartPaths(String mainDocument, String comments, String endnotes, String footnotes, String numbering, String styles) { this.mainDocument = mainDocument; this.comments = comments; + this.endnotes = endnotes; + this.footnotes = footnotes; + this.numbering = numbering; + this.styles = styles; } public String getMainDocument() { @@ -76,19 +84,19 @@ public class DocumentReader { } public String getEndnotes() { - return "word/endnotes.xml"; + return endnotes; } public String getFootnotes() { - return "word/footnotes.xml"; + return footnotes; } public String getNumbering() { - return "word/numbering.xml"; + return numbering; } public String getStyles() { - return "word/styles.xml"; + return styles; } } @@ -109,7 +117,14 @@ public class DocumentReader { "word/" + name + ".xml" ); - return new PartPaths(documentFilename, find.apply("comments")); + return new PartPaths( + documentFilename, + find.apply("comments"), + find.apply("endnotes"), + find.apply("footnotes"), + find.apply("numbering"), + find.apply("styles") + ); } private static Relationships readPackageRelationships(Archive archive) { diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentReaderTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentReaderTests.java index bce431a..1c07679 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentReaderTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentReaderTests.java @@ -1,7 +1,9 @@ package org.zwobble.mammoth.tests.docx; +import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestFactory; import org.zwobble.mammoth.internal.archives.Archive; import org.zwobble.mammoth.internal.archives.InMemoryArchive; import org.zwobble.mammoth.internal.documents.Document; @@ -11,10 +13,13 @@ import org.zwobble.mammoth.internal.util.PassThroughException; import org.zwobble.mammoth.internal.xml.NamespacePrefixes; import org.zwobble.mammoth.internal.xml.XmlWriter; +import java.util.List; import java.util.Optional; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasProperty; +import static org.zwobble.mammoth.internal.util.Lists.eagerFlatMap; import static org.zwobble.mammoth.internal.util.Lists.list; import static org.zwobble.mammoth.internal.util.Maps.map; import static org.zwobble.mammoth.internal.xml.XmlNodes.element; @@ -115,8 +120,23 @@ public class DocumentReaderTests { DocumentReader.PartPaths partPaths = DocumentReader.findPartPaths(archive); assertThat(partPaths.getMainDocument(), equalTo("word/document.xml")); } - @Test - public void commentsPartIsFoundUsingMainDocumentRelationships() { + + @TestFactory + public List partsRelatedToMainDocument() { + return eagerFlatMap( + list("comments", "endnotes", "footnotes", "numbering", "styles"), + name -> list( + DynamicTest.dynamicTest(name + " part is found using main document relationships", () -> { + partIsFoundUsingMainDocumentRelationships(name); + }), + DynamicTest.dynamicTest(name + " part is found using main document relationships", () -> { + whenRelationshipForPartCannotBeFoundThenFallbackIsUsed(name); + }) + ) + ); + } + + private void partIsFoundUsingMainDocumentRelationships(String name) { InMemoryArchive archive = InMemoryArchive.fromStrings(map( "_rels/.rels", XmlWriter.toString( element("Relationships", list( @@ -134,7 +154,7 @@ public class DocumentReaderTests { element("Relationship", map( "Id", "rId2", "Target", "target-path.xml", - "Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" + "Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/" + name )) )), relationshipsNamespaces @@ -143,11 +163,10 @@ public class DocumentReaderTests { )); DocumentReader.PartPaths partPaths = DocumentReader.findPartPaths(archive); - assertThat(partPaths.getComments(), equalTo("word/target-path.xml")); + assertThat(partPaths, hasProperty(name, equalTo("word/target-path.xml"))); } - @Test - public void whenRelationshipsForCommentsCannotBeFoundThenFallbackIsUsed() { + private void whenRelationshipForPartCannotBeFoundThenFallbackIsUsed(String name) { InMemoryArchive archive = InMemoryArchive.fromStrings(map( "word/document.xml", " ", "_rels/.rels", XmlWriter.toString( @@ -163,7 +182,7 @@ public class DocumentReaderTests { )); DocumentReader.PartPaths partPaths = DocumentReader.findPartPaths(archive); - assertThat(partPaths.getComments(), equalTo("word/comments.xml")); + assertThat(partPaths, hasProperty(name, equalTo("word/" + name + ".xml"))); } } } -- cgit v1.2.3