diff options
Diffstat (limited to 'src/main/java/org')
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()); + } } |
