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())}

Reply via email to