aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-13 18:18:33 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-13 18:18:33 +0000
commita431972f98d98114dc9a5a65a3fbaf68967a8161 (patch)
tree5a4e6f29a884ca1091b5a8f4d5c5a4f1558b2233 /src/main/java/org/zwobble
parentcfff129846046a2549f8c78f6de458b9f4183f43 (diff)
Add result objects
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java7
-rw-r--r--src/main/java/org/zwobble/mammoth/Result.java34
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java41
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java7
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java16
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/ReadResult.java44
6 files changed, 116 insertions, 33 deletions
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java
index 05080cf..7282082 100644
--- a/src/main/java/org/zwobble/mammoth/Mammoth.java
+++ b/src/main/java/org/zwobble/mammoth/Mammoth.java
@@ -13,15 +13,16 @@ import java.util.zip.ZipFile;
import static com.google.common.collect.Iterables.transform;
public class Mammoth {
- public static String convertToHtml(File file) {
+ public static Result<String> convertToHtml(File file) {
try (ZipFile zipFile = new ZipFile(file)) {
ZipEntry entry = zipFile.getEntry("word/document.xml");
XmlElement documentXml = OfficeXml.parseXml(zipFile.getInputStream(entry));
Styles styles = Styles.EMPTY;
Numbering numbering = Numbering.EMPTY;
- Document document = new DocumentXmlReader(new BodyXmlReader(styles, numbering)).readElement(documentXml);
- return convertToHtml(document);
+ DocumentXmlReader reader = new DocumentXmlReader(new BodyXmlReader(styles, numbering));
+ return reader.readElement(documentXml)
+ .map(Mammoth::convertToHtml);
} catch (IOException e) {
throw new UnsupportedOperationException("Should return a result of failure");
}
diff --git a/src/main/java/org/zwobble/mammoth/Result.java b/src/main/java/org/zwobble/mammoth/Result.java
new file mode 100644
index 0000000..0665364
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/Result.java
@@ -0,0 +1,34 @@
+package org.zwobble.mammoth;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.function.Function;
+
+public class Result<T> {
+ public static <T> Result<List<T>> concat(Iterable<Result<T>> results) {
+ ImmutableList.Builder<T> elements = ImmutableList.builder();
+ for (Result<T> result : results) {
+ elements.add(result.value);
+ }
+ return new Result<>(elements.build());
+ }
+
+ public static <T> Result<T> success(T value) {
+ return new Result<>(value);
+ }
+
+ private final T value;
+
+ public Result(T value) {
+ this.value = value;
+ }
+
+ public T getValue() {
+ return value;
+ }
+
+ public <R> Result<R> map(Function<T, R> function) {
+ return new Result<>(function.apply(value));
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
index 334f925..26958dd 100644
--- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
@@ -1,17 +1,17 @@
package org.zwobble.mammoth.docx;
-import com.google.common.collect.ImmutableList;
import org.zwobble.mammoth.documents.*;
import org.zwobble.mammoth.util.MammothOptionals;
import org.zwobble.mammoth.xml.XmlElement;
import org.zwobble.mammoth.xml.XmlElementLike;
import org.zwobble.mammoth.xml.XmlNode;
-import java.util.List;
import java.util.Optional;
-import static com.google.common.collect.Iterables.*;
-import static org.zwobble.mammoth.util.MammothLists.list;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.transform;
+import static org.zwobble.mammoth.docx.ReadResult.EMPTY_SUCCESS;
+import static org.zwobble.mammoth.docx.ReadResult.success;
public class BodyXmlReader {
private final Styles styles;
@@ -22,38 +22,37 @@ public class BodyXmlReader {
this.numbering = numbering;
}
- public List<DocumentElement> readElement(XmlElement element) {
+ public ReadResult readElement(XmlElement element) {
switch (element.getName()) {
case "w:t":
- return list(new Text(element.innerText()));
+ return success(new Text(element.innerText()));
case "w:r":
- return list(new Run(readElements(element.children())));
+ return readElements(element.children()).map(Run::new);
case "w:p":
- return list(readParagraph(element));
+ return readParagraph(element);
case "w:pPr":
- return list();
+ return EMPTY_SUCCESS;
default:
// TODO: emit warning
- return list();
+ return EMPTY_SUCCESS;
}
}
- public List<DocumentElement> readElements(Iterable<XmlNode> nodes) {
- return ImmutableList.copyOf(
- concat(
- transform(
- filter(nodes, XmlElement.class),
- this::readElement)));
+ public ReadResult readElements(Iterable<XmlNode> nodes) {
+ return ReadResult.concat(
+ transform(
+ filter(nodes, XmlElement.class),
+ this::readElement));
}
- private Paragraph readParagraph(XmlElement element) {
+ private ReadResult readParagraph(XmlElement element) {
XmlElementLike properties = element.findChildOrEmpty("w:pPr");
- return new Paragraph(
- readParagraphStyle(properties),
- readNumbering(properties),
- readElements(element.children()));
+ Optional<Style> paragraphStyle = readParagraphStyle(properties);
+ Optional<NumberingLevel> numbering = readNumbering(properties);
+ return readElements(element.children())
+ .map(children -> new Paragraph(paragraphStyle, numbering, children));
}
private Optional<Style> readParagraphStyle(XmlElementLike properties) {
diff --git a/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java
index 0b51774..98570f2 100644
--- a/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/docx/DocumentXmlReader.java
@@ -1,5 +1,6 @@
package org.zwobble.mammoth.docx;
+import org.zwobble.mammoth.Result;
import org.zwobble.mammoth.documents.Document;
import org.zwobble.mammoth.xml.XmlElement;
@@ -10,8 +11,10 @@ public class DocumentXmlReader {
this.bodyReader = bodyReader;
}
- public Document readElement(XmlElement element) {
+ public Result<Document> readElement(XmlElement element) {
XmlElement body = element.findChild("w:body");
- return new Document(bodyReader.readElements(body.children()));
+ return bodyReader.readElements(body.children())
+ .toResult()
+ .map(Document::new);
}
}
diff --git a/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java
index 06d17ca..7cd0419 100644
--- a/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/docx/NotesXmlReader.java
@@ -1,6 +1,6 @@
package org.zwobble.mammoth.docx;
-import com.google.common.collect.ImmutableList;
+import org.zwobble.mammoth.Result;
import org.zwobble.mammoth.documents.Note;
import org.zwobble.mammoth.xml.XmlElement;
@@ -18,9 +18,9 @@ public class NotesXmlReader {
this.noteType = noteType;
}
- public List<Note> readElement(XmlElement element) {
+ public Result<List<Note>> readElement(XmlElement element) {
Iterable<XmlElement> elements = filter(element.findChildren("w:" + noteType), this::isNoteElement);
- return ImmutableList.copyOf(transform(elements, this::readNoteElement));
+ return Result.concat(transform(elements, this::readNoteElement));
}
private boolean isNoteElement(XmlElement element) {
@@ -33,9 +33,11 @@ public class NotesXmlReader {
return type.equals("continuationSeparator") || type.equals("separator");
}
- private Note readNoteElement(XmlElement element) {
- return new Note(
- element.getAttribute("w:id"),
- bodyReader.readElements(element.children()));
+ private Result<Note> readNoteElement(XmlElement element) {
+ return bodyReader.readElements(element.children())
+ .toResult()
+ .map(children -> new Note(
+ element.getAttribute("w:id"),
+ children));
}
}
diff --git a/src/main/java/org/zwobble/mammoth/docx/ReadResult.java b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java
new file mode 100644
index 0000000..f3eb7ce
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java
@@ -0,0 +1,44 @@
+package org.zwobble.mammoth.docx;
+
+import com.google.common.collect.ImmutableList;
+import org.zwobble.mammoth.Result;
+import org.zwobble.mammoth.documents.DocumentElement;
+
+import java.util.List;
+import java.util.function.Function;
+
+import static org.zwobble.mammoth.util.MammothLists.list;
+
+public class ReadResult {
+ public static final ReadResult EMPTY_SUCCESS = success(list());
+
+ public static ReadResult concat(Iterable<ReadResult> results) {
+ ImmutableList.Builder<DocumentElement> elements = ImmutableList.builder();
+ for (ReadResult result : results) {
+ elements.addAll(result.elements);
+ }
+ return new ReadResult(elements.build());
+ }
+
+ public static ReadResult success(DocumentElement element) {
+ return success(list(element));
+ }
+
+ public static ReadResult success(List<DocumentElement> elements) {
+ return new ReadResult(elements);
+ }
+
+ private final List<DocumentElement> elements;
+
+ public ReadResult(List<DocumentElement> elements) {
+ this.elements = elements;
+ }
+
+ public ReadResult map(Function<List<DocumentElement>, DocumentElement> function) {
+ return new ReadResult(list(function.apply(elements)));
+ }
+
+ public Result<List<DocumentElement>> toResult() {
+ return new Result<>(elements);
+ }
+}