This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/master by this push:
new d87a24bf14 CAUSEWAY-3805: fixes ZipUtils can fail with 'Only DEFLATED
entries can have EXT descriptor'
d87a24bf14 is described below
commit d87a24bf1498c9974865aadea21eb02870ce516f
Author: Andi Huber <[email protected]>
AuthorDate: Wed Aug 7 08:10:35 2024 +0200
CAUSEWAY-3805: fixes ZipUtils can fail with 'Only DEFLATED entries can
have EXT descriptor'
---
.../org/apache/causeway/commons/io/ZipUtils.java | 45 +++++++++++++++++++++-
1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/commons/src/main/java/org/apache/causeway/commons/io/ZipUtils.java
b/commons/src/main/java/org/apache/causeway/commons/io/ZipUtils.java
index 9eae8351e2..8c474a0d6e 100644
--- a/commons/src/main/java/org/apache/causeway/commons/io/ZipUtils.java
+++ b/commons/src/main/java/org/apache/causeway/commons/io/ZipUtils.java
@@ -20,14 +20,20 @@ package org.apache.causeway.commons.io;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
+import java.io.File;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
+import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -127,8 +133,42 @@ public class ZipUtils {
* Returns a {@link Stream} of {@link ZipEntryDataSource}, buffered in
memory,
* which allows consumption even after the underlying zipped {@link
DataSource} was closed.
* @implNote Only partly optimized for heap usage, as it just reads all
pre-filtered data into memory,
- * but doing so, regardless of what is actually consumed later from
the returned {@link Stream}.
+ * doing so, regardless of what is actually consumed later from the
returned {@link Stream}.
*/
+ @SneakyThrows
+ public Stream<ZipEntryDataSource> streamZipEntries(
+ final @NonNull DataSource zippedSource,
+ final @NonNull ZipOptions zipOptions) {
+
+ val zipEntryDataSources = _Lists.<ZipEntryDataSource>newArrayList();
+
+ var tempFile = File.createTempFile("causeway", "zip-utils");
+ try {
+ zippedSource.tryReadAndWrite(DataSink.ofFile(tempFile), 4096);
+ try (FileSystem fs = FileSystems.newFileSystem(tempFile.toPath(),
null)) {
+ try (Stream<Path> entries = Files.walk(fs.getPath("/"))) {
+ final List<Path> filesInZip =
entries.filter(Files::isRegularFile).collect(Collectors.toList());
+ for(Path path : filesInZip) {
+ var zipEntry = new ZipEntry(path.toString());
+ if(!zipOptions.zipEntryFilter().test(zipEntry))
continue;
+ var bytes = Files.readAllBytes(path);
+ zipEntryDataSources.add(new
ZipEntryDataSource(zipEntry, bytes));
+ }
+ }
+ }
+ } finally {
+ Files.deleteIfExists(tempFile.toPath()); // cleanup
+ }
+
+ return zipEntryDataSources.stream();
+ }
+
+ /*
+ * Former implementation: did not require a temp file,
+ * but may result in Exception 'Only DEFLATED entries can have EXT
descriptor'
+ * @see https://bugs.openjdk.org/browse/JDK-8327690
+ */
+ /*
public Stream<ZipEntryDataSource> streamZipEntries(
final @NonNull DataSource zippedSource,
final @NonNull ZipOptions zipOptions) {
@@ -153,7 +193,8 @@ public class ZipUtils {
.ifFailureFail();
return zipEntryDataSources.stream();
- }
+ }*/
+
/**
* Shortcut for {@code streamZipEntries(zippedSource,
ZipOptions.builder().build())}