You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/06/14 14:01:13 UTC

[commons-io] branch master updated: [IO-773] RegexFileFilter is no longer Serializable.

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 ea1cbedd [IO-773] RegexFileFilter is no longer Serializable.
ea1cbedd is described below

commit ea1cbedd64cfe97fc98f6ef58baaae1125e0b0cd
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Jun 14 10:01:06 2022 -0400

    [IO-773] RegexFileFilter is no longer Serializable.
---
 src/changes/changes.xml                            |  3 ++
 .../commons/io/filefilter/RegexFileFilter.java     |  3 +-
 .../commons/io/filefilter/RegexFileFilterTest.java | 43 +++++++++++++++++-----
 3 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7c0336aa..5ce75a7b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -171,6 +171,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action issue="IO-768" dev="ggregory" type="fix" due-to="Marcono1234, Michael Osipov">
         Add reserved Windows file names CONIN$ and CONOUT$ to FileSystem #355.
       </action>
+      <action issue="IO-773" dev="ggregory" type="fix" due-to="Dominik Reinarz, Gary Gregory">
+        RegexFileFilter is no longer Serializable.
+      </action>
       <!-- ADD -->
       <action type="add" dev="ggregory" due-to="Gary Gregory">
         Add GitHub coverage.yml.
diff --git a/src/main/java/org/apache/commons/io/filefilter/RegexFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/RegexFileFilter.java
index 946a8e04..0cf2a282 100644
--- a/src/main/java/org/apache/commons/io/filefilter/RegexFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/RegexFileFilter.java
@@ -104,8 +104,9 @@ public class RegexFileFilter extends AbstractFileFilter implements Serializable
      * @param pattern regular expression to match.
      * @throws IllegalArgumentException if the pattern is null.
      */
+    @SuppressWarnings("unchecked")
     public RegexFileFilter(final Pattern pattern) {
-        this(pattern, p -> p.getFileName().toString());
+        this(pattern, (Function<Path, String> & Serializable) p -> p.getFileName().toString());
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/io/filefilter/RegexFileFilterTest.java b/src/test/java/org/apache/commons/io/filefilter/RegexFileFilterTest.java
index 17d0870b..e04a5a82 100644
--- a/src/test/java/org/apache/commons/io/filefilter/RegexFileFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/RegexFileFilterTest.java
@@ -17,15 +17,21 @@
 package org.apache.commons.io.filefilter;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.File;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.function.Function;
 import java.util.regex.Pattern;
 
 import org.apache.commons.io.IOCase;
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -65,9 +71,21 @@ public class RegexFileFilterTest {
         }
     }
 
+    private RegexFileFilter assertSerializable(final RegexFileFilter serializable) throws IOException {
+        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+            try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
+                oos.writeObject(serializable);
+            }
+            baos.flush();
+            assertTrue(baos.toByteArray().length > 0);
+        }
+        return serializable;
+    }
+
     @Test
-    public void testRegex() {
-        IOFileFilter filter = new RegexFileFilter("^.*[tT]est(-\\d+)?\\.java$");
+    public void testRegex() throws IOException {
+        RegexFileFilter filter = new RegexFileFilter("^.*[tT]est(-\\d+)?\\.java$");
+        assertSerializable(filter);
         assertFiltering(filter, new File("Test.java"), true);
         assertFiltering(filter, new File("test-10.java"), true);
         assertFiltering(filter, new File("test-.java"), false);
@@ -77,6 +95,7 @@ public class RegexFileFilterTest {
         assertFiltering(filter, new File("test-.java").toPath(), false);
 
         filter = new RegexFileFilter("^[Tt]est.java$");
+        assertSerializable(filter);
         assertFiltering(filter, new File("Test.java"), true);
         assertFiltering(filter, new File("test.java"), true);
         assertFiltering(filter, new File("tEST.java"), false);
@@ -86,6 +105,7 @@ public class RegexFileFilterTest {
         assertFiltering(filter, new File("tEST.java").toPath(), false);
 
         filter = new RegexFileFilter(Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE));
+        assertSerializable(filter);
         assertFiltering(filter, new File("Test.java"), true);
         assertFiltering(filter, new File("test.java"), true);
         assertFiltering(filter, new File("tEST.java"), true);
@@ -95,6 +115,7 @@ public class RegexFileFilterTest {
         assertFiltering(filter, new File("tEST.java").toPath(), true);
 
         filter = new RegexFileFilter("^test.java$", Pattern.CASE_INSENSITIVE);
+        assertSerializable(filter);
         assertFiltering(filter, new File("Test.java"), true);
         assertFiltering(filter, new File("test.java"), true);
         assertFiltering(filter, new File("tEST.java"), true);
@@ -104,6 +125,7 @@ public class RegexFileFilterTest {
         assertFiltering(filter, new File("tEST.java").toPath(), true);
 
         filter = new RegexFileFilter("^test.java$", IOCase.INSENSITIVE);
+        assertSerializable(filter);
         assertFiltering(filter, new File("Test.java"), true);
         assertFiltering(filter, new File("test.java"), true);
         assertFiltering(filter, new File("tEST.java"), true);
@@ -115,21 +137,24 @@ public class RegexFileFilterTest {
 
     @Test
     public void testRegexEdgeCases() {
-        assertThrows(IllegalArgumentException.class, () -> new RegexFileFilter((String) null));
-        assertThrows(IllegalArgumentException.class, () -> new RegexFileFilter(null, Pattern.CASE_INSENSITIVE));
-        assertThrows(IllegalArgumentException.class, () -> new RegexFileFilter(null, IOCase.INSENSITIVE));
-        assertThrows(IllegalArgumentException.class, () -> new RegexFileFilter((java.util.regex.Pattern) null));
+        assertThrows(IllegalArgumentException.class, () -> assertSerializable(new RegexFileFilter((String) null)));
+        assertThrows(IllegalArgumentException.class, () -> assertSerializable(new RegexFileFilter(null, Pattern.CASE_INSENSITIVE)));
+        assertThrows(IllegalArgumentException.class, () -> assertSerializable(new RegexFileFilter(null, IOCase.INSENSITIVE)));
+        assertThrows(IllegalArgumentException.class, () -> assertSerializable(new RegexFileFilter((java.util.regex.Pattern) null)));
     }
 
     /**
      * Tests https://issues.apache.org/jira/browse/IO-733.
+     * @throws IOException
      */
+    @SuppressWarnings("unchecked")
     @Test
-    public void testRegexFileNameOnly() {
+    public void testRegexFileNameOnly() throws IOException {
         final Path path = Paths.get("folder", "Foo.java");
         final String patternStr = "Foo.*";
-        assertFiltering(new RegexFileFilter(patternStr), path, true);
-        assertFiltering(new RegexFileFilter(Pattern.compile(patternStr), Path::toString), path, false);
+        assertFiltering(assertSerializable(new RegexFileFilter(patternStr)), path, true);
+        assertFiltering(assertSerializable(new RegexFileFilter(Pattern.compile(patternStr), (Function<Path, String> & Serializable) Path::toString)), path,
+            false);
     }
 
 }