diff options
| author | Michael Williamson <mike@zwobble.org> | 2018-01-23 20:58:26 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2018-01-23 20:58:26 +0000 |
| commit | d54918c26a0e6eae954eaa2052c7e8ec546c3409 (patch) | |
| tree | 52e24f8179e8177e36476bf068f354daf0698e56 | |
| parent | c3c2151b4b0fc9b3226a5ec66e0f7952290f3d97 (diff) | |
Read relationship type
5 files changed, 70 insertions, 11 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 2e83d54..65974d3 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Relationship.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Relationship.java @@ -3,10 +3,12 @@ package org.zwobble.mammoth.internal.docx; public class Relationship { private final String relationshipId; private final String target; + private final String type; - public Relationship(String relationshipId, String target) { + public Relationship(String relationshipId, String target, String type) { this.relationshipId = relationshipId; this.target = target; + this.type = type; } public String getRelationshipId() { @@ -16,4 +18,8 @@ public class Relationship { public String getTarget() { return target; } + + public String getType() { + return type; + } } 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 d4d6f2e..bfd3fc3 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Relationships.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Relationships.java @@ -10,16 +10,25 @@ public class Relationships { public static final Relationships EMPTY = new Relationships(list()); private final Map<String, String> targetsByRelationshipId; + private final Map<String, List<String>> targetsByType; public Relationships(List<Relationship> relationships) { this.targetsByRelationshipId = toMap(relationships, relationship -> entry( relationship.getRelationshipId(), relationship.getTarget() )); + this.targetsByType = toMultiMap(relationships, relationship -> entry( + relationship.getType(), + relationship.getTarget() + )); } public String findTargetByRelationshipId(String relationshipId) { return lookup(targetsByRelationshipId, relationshipId) .orElseThrow(() -> new RuntimeException("Could not find relationship '" + relationshipId + "'")); } + + public List<String> findTargetsByType(String type) { + return lookup(targetsByType, type).orElse(list()); + } } 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 3b3e300..55862c9 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/RelationshipsXml.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/RelationshipsXml.java @@ -1,13 +1,8 @@ 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) { @@ -20,6 +15,7 @@ public class RelationshipsXml { private static Relationship readRelationship(XmlElement element) { String relationshipId = element.getAttribute("Id"); String target = element.getAttribute("Target"); - return new Relationship(relationshipId, target); + String type = element.getAttribute("Type"); + return new Relationship(relationshipId, target, type); } } 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 690ae98..9a15676 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -1427,10 +1427,10 @@ public class BodyXmlTests { } private static Relationship hyperlinkRelationship(String relationshipId, String target) { - return new Relationship(relationshipId, target); + return new Relationship(relationshipId, target, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"); } private static Relationship imageRelationship(String relationshipId, String target) { - return new Relationship(relationshipId, target); + return new Relationship(relationshipId, target, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); } } 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 fb268b5..e896dd1 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsXmlTests.java @@ -12,15 +12,63 @@ import static org.zwobble.mammoth.internal.xml.XmlNodes.element; public class RelationshipsXmlTests { @Test - public void targetIsReadFromRelationshipElement() { + public void relationshipTargetsCanBeFoundById() { XmlElement element = element("relationship:Relationships", list( element("relationships:Relationship", map( "Id", "rId8", "Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", - "Target", "http://example.com")))); + "Target", "http://example.com" + )), + element("relationships:Relationship", map( + "Id", "rId2", + "Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", + "Target", "http://example.net" + )) + )); Relationships relationships = readRelationshipsXmlElement(element); assertEquals("http://example.com", relationships.findTargetByRelationshipId("rId8")); } + + @Test + public void relationshipTargetsCanBeFoundByType() { + XmlElement element = element("relationship:Relationships", list( + element("relationships:Relationship", map( + "Id", "rId2", + "Target", "docProps/core.xml", + "Type", "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" + )), + element("relationships:Relationship", map( + "Id", "rId1", + "Target", "word/document.xml", + "Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" + )), + element("relationships:Relationship", map( + "Id", "rId3", + "Target", "word/document2.xml", + "Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" + )) + )); + + Relationships relationships = readRelationshipsXmlElement(element); + + assertEquals( + list("word/document.xml", "word/document2.xml"), + relationships.findTargetsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument") + ); + } + + @Test + public void whenThereAreNoRelationshipsOfRequestedTypeThenEmptyListIsReturned() { + + XmlElement element = element("relationship:Relationships"); + + Relationships relationships = readRelationshipsXmlElement(element); + + assertEquals( + list(), + relationships.findTargetsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument") + ); + } } |
