From abbcc3915fa783c648436ef52e15da923a246dd1 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 26 Mar 2016 09:27:45 +0000 Subject: Lazily combine warnings in results --- .../org/zwobble/mammoth/DocumentConverter.java | 8 ++-- .../mammoth/internal/docx/BodyXmlReader.java | 4 +- .../zwobble/mammoth/internal/docx/ReadResult.java | 32 ++++++-------- .../mammoth/internal/results/InternalResult.java | 49 ++++++++++++++-------- .../mammoth/internal/util/MammothIterables.java | 30 +++++++++++++ .../mammoth/internal/util/MammothLists.java | 7 ++++ 6 files changed, 87 insertions(+), 43 deletions(-) (limited to 'src/main/java/org/zwobble') 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 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 convertToHtml(File file) throws IOException { return withDocxFile(file, zipFile -> - convertToHtml(Optional.of(file.toPath()), zipFile)); + convertToHtml(Optional.of(file.toPath()), zipFile)).toResult(); } private InternalResult convertToHtml(Optional path, DocxFile zipFile) { @@ -103,7 +103,7 @@ public class DocumentConverter { */ public Result 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 extractRawText(File file) throws IOException { return withDocxFile(file, zipFile -> - extractRawText(Optional.of(file.toPath()), zipFile)); + extractRawText(Optional.of(file.toPath()), zipFile)).toResult(); } private InternalResult extractRawText(Optional 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 results) { - ImmutableList.Builder elements = ImmutableList.builder(); - ImmutableList.Builder extra = ImmutableList.builder(); - ImmutableSet.Builder 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 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 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 elements; private final List extra; - private final Set warnings; + private final Iterable warnings; - public ReadResult(List elements, List extra, Set warnings) { + public ReadResult(List elements, List extra, Iterable 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 implements org.zwobble.mammoth.Result { +public class InternalResult { public static InternalResult> concat(Iterable> results) { - ImmutableList.Builder elements = ImmutableList.builder(); - ImmutableSet.Builder warnings = ImmutableSet.builder(); - for (InternalResult 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 InternalResult map( @@ -31,21 +29,21 @@ public class InternalResult implements org.zwobble.mammoth.Result { { return new InternalResult<>( function.apply(first.value, second.value), - Sets.union(first.warnings, second.warnings).immutableCopy()); + lazyConcat(first.warnings, second.warnings)); } public static InternalResult> empty() { - return new InternalResult<>(Optional.empty(), set()); + return new InternalResult<>(Optional.empty(), list()); } public static InternalResult success(T value) { - return new InternalResult<>(value, set()); + return new InternalResult<>(value, list()); } private final T value; - private final Set warnings; + private final Iterable warnings; - public InternalResult(T value, Set warnings) { + public InternalResult(T value, Iterable warnings) { this.value = value; this.warnings = warnings; } @@ -54,7 +52,7 @@ public class InternalResult implements org.zwobble.mammoth.Result { return value; } - public Set getWarnings() { + public Iterable getWarnings() { return warnings; } @@ -66,6 +64,21 @@ public class InternalResult implements org.zwobble.mammoth.Result { InternalResult intermediateResult = function.apply(value); return new InternalResult<>( intermediateResult.value, - Sets.union(warnings, intermediateResult.warnings).immutableCopy()); + lazyConcat(warnings, intermediateResult.warnings)); + } + + public Result toResult() { + Set warnings = ImmutableSet.copyOf(this.warnings); + return new Result() { + @Override + public T getValue() { + return value; + } + + @Override + public Set 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 Optional tryGetLast(Iterable iterable) { @@ -39,6 +41,30 @@ public class MammothIterables { } } + public static Iterable lazyFlatMap(Iterable iterable, Function> function) { + return lazyFlatten(lazyMap(iterable, function)); + } + + public static Iterable lazyConcat(Iterable iterable1, Iterable iterable2) { + return new Iterable() { + @Override + public Iterator iterator() { + return Stream.concat(stream(iterable1), stream(iterable2)).iterator(); + } + }; + } + + public static Iterable lazyFlatten(Iterable> iterables) { + return new Iterable() { + @Override + public Iterator iterator() { + return stream(iterables) + .flatMap(iterable -> stream(iterable)) + .iterator(); + } + }; + } + private static Iterator map(Iterator iterator, Function function) { return new Iterator() { @Override @@ -52,4 +78,8 @@ public class MammothIterables { } }; } + + public static Stream stream(Iterable 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 List list() { @@ -47,4 +50,8 @@ public class MammothLists { private static > Ordering orderBy(Function getKey) { return Ordering.from((first, second) -> getKey.apply(first).compareTo(getKey.apply(second))); } + + public static List toList(Iterable iterable) { + return stream(iterable).collect(Collectors.toList()); + } } -- cgit v1.2.3