This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git


The following commit(s) were added to refs/heads/master by this push:
     new a44f4133 [IO-811] Files.walk() direct and indirect callers fail to 
close the returned Stream<Path>
a44f4133 is described below

commit a44f4133c4f3e28a72c5a934c7feb929da2f8a54
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Sat Sep 30 09:04:27 2023 -0400

    [IO-811] Files.walk() direct and indirect callers fail to close the
    returned Stream<Path>
    
    - Internal Javadoc
    - Release resource in test
---
 src/main/java/org/apache/commons/io/FileUtils.java |  6 +++
 .../apache/commons/io/FileUtilsListFilesTest.java  | 49 +++++++++++++++-------
 2 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/apache/commons/io/FileUtils.java 
b/src/main/java/org/apache/commons/io/FileUtils.java
index 8a8adca7..542e9b6c 100644
--- a/src/main/java/org/apache/commons/io/FileUtils.java
+++ b/src/main/java/org/apache/commons/io/FileUtils.java
@@ -3045,6 +3045,12 @@ public class FileUtils {
         return files;
     }
 
+    /**
+     * Consumes all of the given stream and <em>closes</em> it because 
FileTreeWalker.next() calls {@code top.stream().close()}.
+     *
+     * @param stream The stream to consume.
+     * @return a new List.
+     */
     private static List<File> toList(final Stream<File> stream) {
         return stream.collect(Collectors.toList());
     }
diff --git a/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java 
b/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java
index 27a81c98..10897092 100644
--- a/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java
+++ b/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java
@@ -29,6 +29,7 @@ import java.util.stream.Collectors;
 
 import org.apache.commons.io.filefilter.FileFilterUtils;
 import org.apache.commons.io.filefilter.IOFileFilter;
+import org.apache.commons.lang3.function.Consumers;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
@@ -47,6 +48,7 @@ public class FileUtilsListFilesTest {
 
     private Collection<String> filesToFilenames(final Iterator<File> files) {
         final Collection<String> fileNames = new ArrayList<>();
+        // Iterator.forEachRemaining() closes the underlying stream.
         files.forEachRemaining(f -> fileNames.add(f.getName()));
         return fileNames;
     }
@@ -88,24 +90,39 @@ public class FileUtilsListFilesTest {
         final String[] extensions = { "xml", "txt" };
 
         Iterator<File> files = FileUtils.iterateFiles(temporaryFolder, 
extensions, false);
-        Collection<String> filenames = filesToFilenames(files);
-        assertEquals(1, filenames.size());
-        assertTrue(filenames.contains("dummy-build.xml"));
-        assertFalse(filenames.contains("README"));
-        assertFalse(filenames.contains("dummy-file.txt"));
-
-        files = FileUtils.iterateFiles(temporaryFolder, extensions, true);
-        filenames = filesToFilenames(files);
-        assertEquals(4, filenames.size());
-        assertTrue(filenames.contains("dummy-file.txt"));
-        assertFalse(filenames.contains("dummy-index.html"));
+        try {
+            Collection<String> filenames = filesToFilenames(files);
+            assertEquals(1, filenames.size());
+            assertTrue(filenames.contains("dummy-build.xml"));
+            assertFalse(filenames.contains("README"));
+            assertFalse(filenames.contains("dummy-file.txt"));
+        } finally {
+            // Backstop in case filesToFilenames() failure.
+            files.forEachRemaining(Consumers.nop());
+        }
+
+        try {
+            files = FileUtils.iterateFiles(temporaryFolder, extensions, true);
+            Collection<String> filenames = filesToFilenames(files);
+            assertEquals(4, filenames.size());
+            assertTrue(filenames.contains("dummy-file.txt"));
+            assertFalse(filenames.contains("dummy-index.html"));
+        } finally {
+            // Backstop in case filesToFilenames() failure.
+            files.forEachRemaining(Consumers.nop());
+        }
 
         files = FileUtils.iterateFiles(temporaryFolder, null, false);
-        filenames = filesToFilenames(files);
-        assertEquals(2, filenames.size());
-        assertTrue(filenames.contains("dummy-build.xml"));
-        assertTrue(filenames.contains("README"));
-        assertFalse(filenames.contains("dummy-file.txt"));
+        try {
+            Collection<String> filenames = filesToFilenames(files);
+            assertEquals(2, filenames.size());
+            assertTrue(filenames.contains("dummy-build.xml"));
+            assertTrue(filenames.contains("README"));
+            assertFalse(filenames.contains("dummy-file.txt"));
+        } finally {
+            // Backstop in case filesToFilenames() failure.
+            files.forEachRemaining(Consumers.nop());
+        }
     }
 
     @Test

Reply via email to