aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2018-01-23 20:58:26 +0000
committerMichael Williamson <mike@zwobble.org>2018-01-23 20:58:26 +0000
commitd54918c26a0e6eae954eaa2052c7e8ec546c3409 (patch)
tree52e24f8179e8177e36476bf068f354daf0698e56
parentc3c2151b4b0fc9b3226a5ec66e0f7952290f3d97 (diff)
Read relationship type
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/Relationship.java8
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/Relationships.java9
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/RelationshipsXml.java8
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java4
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/RelationshipsXmlTests.java52
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")
+ );
+ }
}