diff options
| author | Michael Williamson <mike@zwobble.org> | 2018-01-23 20:51:30 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2018-01-23 20:51:30 +0000 |
| commit | c3c2151b4b0fc9b3226a5ec66e0f7952290f3d97 (patch) | |
| tree | d5b216ff39695e77ae77dc4ae14a5dfa8f0ef0c5 /src | |
| parent | d88693d7be4d4d439e9ba9c338fc53e39be64ef6 (diff) | |
Pass list of Relationship instances into Relationships
Diffstat (limited to 'src')
7 files changed, 62 insertions, 38 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/Relationship.java b/src/main/java/org/zwobble/mammoth/internal/docx/Relationship.java index dacd7a6..2e83d54 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Relationship.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Relationship.java @@ -1,12 +1,18 @@ package org.zwobble.mammoth.internal.docx; public class Relationship { + private final String relationshipId; private final String target; - public Relationship(String target) { + public Relationship(String relationshipId, String target) { + this.relationshipId = relationshipId; this.target = target; } + public String getRelationshipId() { + return relationshipId; + } + public String getTarget() { return target; } diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/Relationships.java b/src/main/java/org/zwobble/mammoth/internal/docx/Relationships.java index c1dd511..d4d6f2e 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Relationships.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Relationships.java @@ -1,21 +1,25 @@ package org.zwobble.mammoth.internal.docx; +import java.util.List; import java.util.Map; -import static org.zwobble.mammoth.internal.util.Maps.lookup; -import static org.zwobble.mammoth.internal.util.Maps.map; +import static org.zwobble.mammoth.internal.util.Lists.list; +import static org.zwobble.mammoth.internal.util.Maps.*; public class Relationships { - public static final Relationships EMPTY = new Relationships(map()); + public static final Relationships EMPTY = new Relationships(list()); - private final Map<String, Relationship> relationships; + private final Map<String, String> targetsByRelationshipId; - public Relationships(Map<String, Relationship> relationships) { - this.relationships = relationships; + public Relationships(List<Relationship> relationships) { + this.targetsByRelationshipId = toMap(relationships, relationship -> entry( + relationship.getRelationshipId(), + relationship.getTarget() + )); } - public Relationship findRelationshipById(String id) { - return lookup(relationships, id) - .orElseThrow(() -> new RuntimeException("Could not find relationship '" + id + "'")); + public String findTargetByRelationshipId(String relationshipId) { + return lookup(targetsByRelationshipId, relationshipId) + .orElseThrow(() -> new RuntimeException("Could not find relationship '" + relationshipId + "'")); } } diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/RelationshipsXml.java b/src/main/java/org/zwobble/mammoth/internal/docx/RelationshipsXml.java index a63065b..3b3e300 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/RelationshipsXml.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/RelationshipsXml.java @@ -1,22 +1,25 @@ package org.zwobble.mammoth.internal.docx; +import org.zwobble.mammoth.internal.util.Lists; import org.zwobble.mammoth.internal.xml.XmlElement; import java.util.Map; +import static org.zwobble.mammoth.internal.util.Lists.eagerMap; import static org.zwobble.mammoth.internal.util.Maps.entry; import static org.zwobble.mammoth.internal.util.Maps.toMap; public class RelationshipsXml { public static Relationships readRelationshipsXmlElement(XmlElement element) { - return new Relationships(toMap( + return new Relationships(eagerMap( element.findChildren("relationships:Relationship"), - RelationshipsXml::readRelationship)); + RelationshipsXml::readRelationship + )); } - private static Map.Entry<String, Relationship> readRelationship(XmlElement element) { - return entry( - element.getAttribute("Id"), - new Relationship(element.getAttribute("Target"))); + private static Relationship readRelationship(XmlElement element) { + String relationshipId = element.getAttribute("Id"); + String target = element.getAttribute("Target"); + return new Relationship(relationshipId, target); } } diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java index 412ca23..eb13a44 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -481,7 +481,7 @@ class StatefulBodyXmlReader { ReadResult childrenResult = readElements(element.getChildren()); if (relationshipId.isPresent()) { - String targetHref = relationships.findRelationshipById(relationshipId.get()).getTarget(); + String targetHref = relationships.findTargetByRelationshipId(relationshipId.get()); String href = anchor.map(fragment -> Uris.replaceFragment(targetHref, anchor.get())) .orElse(targetHref); return childrenResult.map(children -> @@ -554,7 +554,7 @@ class StatefulBodyXmlReader { String imagePath = relationshipIdToDocxPath(embedRelationshipId.get()); return readImage(imagePath, altText, () -> Archives.getInputStream(file, imagePath)); } else if (linkRelationshipId.isPresent()) { - String imagePath = relationships.findRelationshipById(linkRelationshipId.get()).getTarget(); + String imagePath = relationships.findTargetByRelationshipId(linkRelationshipId.get()); return readImage(imagePath, altText, () -> fileReader.getInputStream(imagePath)); } else { // TODO: emit warning @@ -579,8 +579,8 @@ class StatefulBodyXmlReader { } private String relationshipIdToDocxPath(String relationshipId) { - Relationship relationship = relationships.findRelationshipById(relationshipId); - return uriToZipEntryName("word", relationship.getTarget()); + String target = relationships.findTargetByRelationshipId(relationshipId); + return uriToZipEntryName("word", target); } private Optional<String> readVal(XmlElementLike element, String name) { diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index 772fdd3..690ae98 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -945,8 +945,9 @@ public class BodyXmlTests { @Test public void hyperlinkIsReadAsExternalHyperlinkIfItHasARelationshipId() { - Relationships relationships = new Relationships( - map("r42", new Relationship("http://example.com"))); + Relationships relationships = new Relationships(list( + hyperlinkRelationship("r42", "http://example.com") + )); XmlElement element = element("w:hyperlink", map("r:id", "r42"), list(runXml(list()))); assertThat( readSuccess(bodyReader(relationships), element), @@ -960,9 +961,9 @@ public class BodyXmlTests { @Test public void hyperlinkIsReadAsExternalHyperlinkIfItHasARelationshipIdAndAnAnchor() { - Relationships relationships = new Relationships( - map("r42", new Relationship("http://example.com/")) - ); + Relationships relationships = new Relationships(list( + hyperlinkRelationship("r42", "http://example.com/") + )); XmlElement element = element("w:hyperlink", map("r:id", "r42", "w:anchor", "fragment"), list(runXml(list()))); assertThat( readSuccess(bodyReader(relationships), element), @@ -972,9 +973,9 @@ public class BodyXmlTests { @Test public void hyperlinkExistingFragmentIsReplacedWhenAnchorIsSetOnExternalLink() { - Relationships relationships = new Relationships( - map("r42", new Relationship("http://example.com/#previous")) - ); + Relationships relationships = new Relationships(list( + hyperlinkRelationship("r42", "http://example.com/#previous") + )); XmlElement element = element("w:hyperlink", map("r:id", "r42", "w:anchor", "fragment"), list(runXml(list()))); assertThat( readSuccess(bodyReader(relationships), element), @@ -1176,8 +1177,9 @@ public class BodyXmlTests { } private Image readEmbeddedImage(XmlElement element) { - Relationships relationships = new Relationships(map( - IMAGE_RELATIONSHIP_ID, new Relationship("media/hat.png"))); + Relationships relationships = new Relationships(list( + imageRelationship(IMAGE_RELATIONSHIP_ID, "media/hat.png") + )); Archive file = InMemoryArchive.fromStrings(map("word/media/hat.png", IMAGE_BYTES)); return (Image) readSuccess( @@ -1202,8 +1204,9 @@ public class BodyXmlTests { @Test public void warningIfImageTypeIsUnsupportedByWebBrowsers() { XmlElement element = inlineImageXml(embeddedBlipXml(IMAGE_RELATIONSHIP_ID), ""); - Relationships relationships = new Relationships(map( - IMAGE_RELATIONSHIP_ID, new Relationship("media/hat.emf"))); + Relationships relationships = new Relationships(list( + imageRelationship(IMAGE_RELATIONSHIP_ID, "media/hat.emf") + )); Archive file = InMemoryArchive.fromStrings(map("word/media/hat.emf", IMAGE_BYTES)); ContentTypes contentTypes = new ContentTypes(map("emf", "image/x-emf"), map()); @@ -1219,8 +1222,9 @@ public class BodyXmlTests { @Test public void canReadLinkedPictures() throws IOException { XmlElement element = inlineImageXml(linkedBlipXml(IMAGE_RELATIONSHIP_ID), ""); - Relationships relationships = new Relationships(map( - IMAGE_RELATIONSHIP_ID, new Relationship("file:///media/hat.png"))); + Relationships relationships = new Relationships(list( + imageRelationship(IMAGE_RELATIONSHIP_ID, "file:///media/hat.png") + )); Image image = (Image) readSuccess( bodyReader(relationships, new InMemoryFileReader(map("file:///media/hat.png", IMAGE_BYTES))), @@ -1421,4 +1425,12 @@ public class BodyXmlTests { private static Text text(String value) { return new Text(value); } + + private static Relationship hyperlinkRelationship(String relationshipId, String target) { + return new Relationship(relationshipId, target); + } + + private static Relationship imageRelationship(String relationshipId, String target) { + return new Relationship(relationshipId, target); + } } diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsTests.java index c860ba1..3c32852 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsTests.java @@ -4,16 +4,15 @@ import org.junit.jupiter.api.Test; import org.zwobble.mammoth.internal.docx.Relationships; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.zwobble.mammoth.internal.util.Maps.map; import static org.zwobble.mammoth.tests.util.MammothAsserts.assertThrows; public class RelationshipsTests { @Test public void exceptionIsThrownIfRelationshipCannotBeFound() { - Relationships relationships = new Relationships(map()); + Relationships relationships = Relationships.EMPTY; RuntimeException exception = assertThrows( RuntimeException.class, - () -> relationships.findRelationshipById("rId5")); + () -> relationships.findTargetByRelationshipId("rId5")); assertEquals("Could not find relationship 'rId5'", exception.getMessage()); } } diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsXmlTests.java index 6313591..fb268b5 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsXmlTests.java @@ -21,6 +21,6 @@ public class RelationshipsXmlTests { Relationships relationships = readRelationshipsXmlElement(element); - assertEquals("http://example.com", relationships.findRelationshipById("rId8").getTarget()); + assertEquals("http://example.com", relationships.findTargetByRelationshipId("rId8")); } } |
