aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-26 09:27:45 +0000
committerMichael Williamson <mike@zwobble.org>2016-03-26 09:27:45 +0000
commitabbcc3915fa783c648436ef52e15da923a246dd1 (patch)
tree2db501fd1a82dc608217623cc53b8a6b13f71bb5 /src/main/java/org
parent55ec6fed7278825bee4b6db24965b69b9c496ed5 (diff)
Lazily combine warnings in results
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/mammoth/DocumentConverter.java8
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java4
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/ReadResult.java32
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java49
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/util/MammothIterables.java30
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/util/MammothLists.java7
6 files changed, 87 insertions, 43 deletions
diff --git a/src/main/java/org/zwobble/mammoth/DocumentConverter.java b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
index d2d2cc9..ad95656 100644
--- a/src/main/java/org/zwobble/mammoth/DocumentConverter.java
+++ b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
@@ -77,7 +77,7 @@ public class DocumentConverter {
*/
public Result<String> convertToHtml(InputStream stream) throws IOException {
return withDocxFile(stream, zipFile ->
- convertToHtml(Optional.empty(), zipFile));
+ convertToHtml(Optional.empty(), zipFile)).toResult();
}
/**
@@ -85,7 +85,7 @@ public class DocumentConverter {
*/
public Result<String> convertToHtml(File file) throws IOException {
return withDocxFile(file, zipFile ->
- convertToHtml(Optional.of(file.toPath()), zipFile));
+ convertToHtml(Optional.of(file.toPath()), zipFile)).toResult();
}
private InternalResult<String> convertToHtml(Optional<Path> path, DocxFile zipFile) {
@@ -103,7 +103,7 @@ public class DocumentConverter {
*/
public Result<String> extractRawText(InputStream stream) throws IOException {
return withDocxFile(stream, zipFile ->
- extractRawText(Optional.empty(), zipFile));
+ extractRawText(Optional.empty(), zipFile)).toResult();
}
/**
@@ -113,7 +113,7 @@ public class DocumentConverter {
*/
public Result<String> extractRawText(File file) throws IOException {
return withDocxFile(file, zipFile ->
- extractRawText(Optional.of(file.toPath()), zipFile));
+ extractRawText(Optional.of(file.toPath()), zipFile)).toResult();
}
private InternalResult<String> extractRawText(Optional<Path> path, DocxFile zipFile) {
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java
index 9951cbc..0edc7a7 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java
@@ -18,7 +18,7 @@ import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
import static org.zwobble.mammoth.internal.docx.ReadResult.EMPTY_SUCCESS;
import static org.zwobble.mammoth.internal.docx.ReadResult.success;
-import static org.zwobble.mammoth.internal.util.MammothSets.set;
+import static org.zwobble.mammoth.internal.util.MammothLists.list;
import static org.zwobble.mammoth.internal.util.MammothStrings.trimLeft;
public class BodyXmlReader {
@@ -213,7 +213,7 @@ public class BodyXmlReader {
} else {
return new InternalResult<>(
Optional.of(new Style(styleId, Optional.empty())),
- set(styleType + " style with ID " + styleId + " was referenced but not defined in the document"));
+ list(styleType + " style with ID " + styleId + " was referenced but not defined in the document"));
}
}
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/ReadResult.java b/src/main/java/org/zwobble/mammoth/internal/docx/ReadResult.java
index 8f3053d..95b886f 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/ReadResult.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/ReadResult.java
@@ -1,32 +1,26 @@
package org.zwobble.mammoth.internal.docx;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
import org.zwobble.mammoth.internal.documents.DocumentElement;
import org.zwobble.mammoth.internal.results.InternalResult;
import java.util.List;
-import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Function;
+import static org.zwobble.mammoth.internal.util.MammothIterables.lazyConcat;
+import static org.zwobble.mammoth.internal.util.MammothIterables.lazyFlatMap;
+import static org.zwobble.mammoth.internal.util.MammothLists.eagerFlatMap;
import static org.zwobble.mammoth.internal.util.MammothLists.list;
-import static org.zwobble.mammoth.internal.util.MammothSets.set;
public class ReadResult {
public static final ReadResult EMPTY_SUCCESS = success(list());
public static ReadResult concat(Iterable<ReadResult> results) {
- ImmutableList.Builder<DocumentElement> elements = ImmutableList.builder();
- ImmutableList.Builder<DocumentElement> extra = ImmutableList.builder();
- ImmutableSet.Builder<String> warnings = ImmutableSet.builder();
- for (ReadResult result : results) {
- elements.addAll(result.elements);
- extra.addAll(result.extra);
- warnings.addAll(result.warnings);
- }
- return new ReadResult(elements.build(), extra.build(), warnings.build());
+ return new ReadResult(
+ eagerFlatMap(results, result -> result.elements),
+ eagerFlatMap(results, result -> result.extra),
+ lazyFlatMap(results, result -> result.warnings));
}
public static <T> ReadResult map(
@@ -37,7 +31,7 @@ public class ReadResult {
return new ReadResult(
list(function.apply(first.getValue(), second.elements)),
second.extra,
- Sets.union(first.getWarnings(), second.warnings).immutableCopy());
+ lazyConcat(first.getWarnings(), second.warnings));
}
public static ReadResult success(DocumentElement element) {
@@ -45,22 +39,22 @@ public class ReadResult {
}
public static ReadResult success(List<DocumentElement> elements) {
- return new ReadResult(elements, list(), set());
+ return new ReadResult(elements, list(), list());
}
public static ReadResult emptyWithWarning(String warning) {
- return new ReadResult(list(), list(), set(warning));
+ return new ReadResult(list(), list(), list(warning));
}
public static ReadResult withWarning(DocumentElement element, String warning) {
- return new ReadResult(list(element), list(), set(warning));
+ return new ReadResult(list(element), list(), list(warning));
}
private final List<DocumentElement> elements;
private final List<DocumentElement> extra;
- private final Set<String> warnings;
+ private final Iterable<String> warnings;
- public ReadResult(List<DocumentElement> elements, List<DocumentElement> extra, Set<String> warnings) {
+ public ReadResult(List<DocumentElement> elements, List<DocumentElement> extra, Iterable<String> warnings) {
this.elements = elements;
this.extra = extra;
this.warnings = warnings;
diff --git a/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java b/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java
index 6ca3377..35c195d 100644
--- a/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java
+++ b/src/main/java/org/zwobble/mammoth/internal/results/InternalResult.java
@@ -1,8 +1,7 @@
package org.zwobble.mammoth.internal.results;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
+import org.zwobble.mammoth.Result;
import org.zwobble.mammoth.internal.documents.Style;
import java.util.List;
@@ -11,17 +10,16 @@ import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Function;
-import static org.zwobble.mammoth.internal.util.MammothSets.set;
+import static org.zwobble.mammoth.internal.util.MammothIterables.lazyConcat;
+import static org.zwobble.mammoth.internal.util.MammothIterables.lazyFlatMap;
+import static org.zwobble.mammoth.internal.util.MammothLists.eagerMap;
+import static org.zwobble.mammoth.internal.util.MammothLists.list;
-public class InternalResult<T> implements org.zwobble.mammoth.Result<T> {
+public class InternalResult<T> {
public static <T> InternalResult<List<T>> concat(Iterable<InternalResult<T>> results) {
- ImmutableList.Builder<T> elements = ImmutableList.builder();
- ImmutableSet.Builder<String> warnings = ImmutableSet.builder();
- for (InternalResult<T> result : results) {
- elements.add(result.value);
- warnings.addAll(result.warnings);
- }
- return new InternalResult<>(elements.build(), warnings.build());
+ return new InternalResult<>(
+ eagerMap(results, result -> result.value),
+ lazyFlatMap(results, result -> result.warnings));
}
public static <T1, T2, R> InternalResult<R> map(
@@ -31,21 +29,21 @@ public class InternalResult<T> implements org.zwobble.mammoth.Result<T> {
{
return new InternalResult<>(
function.apply(first.value, second.value),
- Sets.union(first.warnings, second.warnings).immutableCopy());
+ lazyConcat(first.warnings, second.warnings));
}
public static InternalResult<Optional<Style>> empty() {
- return new InternalResult<>(Optional.empty(), set());
+ return new InternalResult<>(Optional.empty(), list());
}
public static <T> InternalResult<T> success(T value) {
- return new InternalResult<>(value, set());
+ return new InternalResult<>(value, list());
}
private final T value;
- private final Set<String> warnings;
+ private final Iterable<String> warnings;
- public InternalResult(T value, Set<String> warnings) {
+ public InternalResult(T value, Iterable<String> warnings) {
this.value = value;
this.warnings = warnings;
}
@@ -54,7 +52,7 @@ public class InternalResult<T> implements org.zwobble.mammoth.Result<T> {
return value;
}
- public Set<String> getWarnings() {
+ public Iterable<String> getWarnings() {
return warnings;
}
@@ -66,6 +64,21 @@ public class InternalResult<T> implements org.zwobble.mammoth.Result<T> {
InternalResult<R> intermediateResult = function.apply(value);
return new InternalResult<>(
intermediateResult.value,
- Sets.union(warnings, intermediateResult.warnings).immutableCopy());
+ lazyConcat(warnings, intermediateResult.warnings));
+ }
+
+ public Result<T> toResult() {
+ Set<String> warnings = ImmutableSet.copyOf(this.warnings);
+ return new Result<T>() {
+ @Override
+ public T getValue() {
+ return value;
+ }
+
+ @Override
+ public Set<String> getWarnings() {
+ return warnings;
+ }
+ };
}
}
diff --git a/src/main/java/org/zwobble/mammoth/internal/util/MammothIterables.java b/src/main/java/org/zwobble/mammoth/internal/util/MammothIterables.java
index b9fd029..c0231e0 100644
--- a/src/main/java/org/zwobble/mammoth/internal/util/MammothIterables.java
+++ b/src/main/java/org/zwobble/mammoth/internal/util/MammothIterables.java
@@ -6,6 +6,8 @@ import java.util.Iterator;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
public class MammothIterables {
public static <T> Optional<T> tryGetLast(Iterable<T> iterable) {
@@ -39,6 +41,30 @@ public class MammothIterables {
}
}
+ public static <T, R> Iterable<R> lazyFlatMap(Iterable<T> iterable, Function<T, Iterable<R>> function) {
+ return lazyFlatten(lazyMap(iterable, function));
+ }
+
+ public static <T> Iterable<T> lazyConcat(Iterable<T> iterable1, Iterable<T> iterable2) {
+ return new Iterable<T>() {
+ @Override
+ public Iterator<T> iterator() {
+ return Stream.concat(stream(iterable1), stream(iterable2)).iterator();
+ }
+ };
+ }
+
+ public static <T> Iterable<T> lazyFlatten(Iterable<? extends Iterable<T>> iterables) {
+ return new Iterable<T>() {
+ @Override
+ public Iterator<T> iterator() {
+ return stream(iterables)
+ .flatMap(iterable -> stream(iterable))
+ .iterator();
+ }
+ };
+ }
+
private static <T, R> Iterator<R> map(Iterator<T> iterator, Function<T, R> function) {
return new Iterator<R>() {
@Override
@@ -52,4 +78,8 @@ public class MammothIterables {
}
};
}
+
+ public static <T> Stream<T> stream(Iterable<T> iterable) {
+ return StreamSupport.stream(iterable.spliterator(), false);
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/internal/util/MammothLists.java b/src/main/java/org/zwobble/mammoth/internal/util/MammothLists.java
index eff5411..aa45ebf 100644
--- a/src/main/java/org/zwobble/mammoth/internal/util/MammothLists.java
+++ b/src/main/java/org/zwobble/mammoth/internal/util/MammothLists.java
@@ -6,6 +6,9 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.zwobble.mammoth.internal.util.MammothIterables.stream;
public class MammothLists {
public static <T> List<T> list() {
@@ -47,4 +50,8 @@ public class MammothLists {
private static <T, R extends Comparable<R>> Ordering<T> orderBy(Function<T, R> getKey) {
return Ordering.from((first, second) -> getKey.apply(first).compareTo(getKey.apply(second)));
}
+
+ public static <T> List<T> toList(Iterable<T> iterable) {
+ return stream(iterable).collect(Collectors.toList());
+ }
}