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 2023/06/30 00:50:51 UTC

[commons-io] branch master updated: IOFileFilter now also extends java.nio.file.PathMatcher

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 fc555985 IOFileFilter now also extends java.nio.file.PathMatcher
fc555985 is described below

commit fc55598500b678bef559c74dd3a277c3a6868a57
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Jun 29 20:50:45 2023 -0400

    IOFileFilter now also extends java.nio.file.PathMatcher
---
 src/changes/changes.xml                            |  3 +++
 .../apache/commons/io/filefilter/IOFileFilter.java | 23 +++++++++++++++++-----
 .../commons/io/filefilter/AbstractFilterTest.java  | 13 ++++++++----
 .../commons/io/filefilter/FileFilterTest.java      | 16 +++++++++++++++
 .../io/filefilter/IOFileFilterAbstractTest.java    |  8 +++++++-
 .../commons/io/filefilter/RegexFileFilterTest.java |  8 +++++++-
 .../io/filefilter/SymbolicLinkFileFilterTest.java  | 17 ++++++++++++----
 .../io/filefilter/WildcardFileFilterTest.java      | 11 ++++++++---
 8 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index fbcc6d58..1ce68660 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -79,6 +79,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="add" due-to="Gary Gregory">
         Add Uncheck.get(IOSupplier, Supplier&lt;String&gt;)
       </action>
+      <action dev="ggregory" type="add" due-to="Gary Gregory">
+        IOFileFilter now also extends java.nio.file.PathMatcher.
+      </action>
       <!-- FIX -->
       <action dev="ggregory" type="fix" issue="IO-799" due-to="Jeroen van der Vegt, Gary Gregory">
         ReaderInputStream.read() throws an exception instead of returning -1 when called again after returning -1.
diff --git a/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java
index 72abc5dc..f13b3adf 100644
--- a/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/IOFileFilter.java
@@ -21,6 +21,7 @@ import java.io.FileFilter;
 import java.io.FilenameFilter;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Path;
+import java.nio.file.PathMatcher;
 import java.nio.file.attribute.BasicFileAttributes;
 
 import org.apache.commons.io.file.PathFilter;
@@ -30,7 +31,7 @@ import org.apache.commons.io.file.PathFilter;
  *
  * @since 1.0
  */
-public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter {
+public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter, PathMatcher {
 
     /**
      * An empty String array.
@@ -38,7 +39,7 @@ public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter {
     String[] EMPTY_STRING_ARRAY = {};
 
     /**
-     * Checks to see if the File should be accepted by this filter.
+     * Tests if a File should be accepted by this filter.
      * <p>
      * Defined in {@link java.io.FileFilter}.
      * </p>
@@ -50,7 +51,7 @@ public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter {
     boolean accept(File file);
 
     /**
-     * Checks to see if the File should be accepted by this filter.
+     * Tests if a File should be accepted by this filter.
      * <p>
      * Defined in {@link java.io.FilenameFilter}.
      * </p>
@@ -63,7 +64,7 @@ public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter {
     boolean accept(File dir, String name);
 
     /**
-     * Checks to see if the Path should be accepted by this filter.
+     * Checks to see if a Path should be accepted by this filter.
      *
      * @param path the Path to check.
      * @return true if this path matches the test.
@@ -71,7 +72,7 @@ public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter {
      */
     @Override
     default FileVisitResult accept(final Path path, final BasicFileAttributes attributes) {
-        return AbstractFileFilter.toDefaultFileVisitResult(accept(path.toFile()));
+        return AbstractFileFilter.toDefaultFileVisitResult(path != null && accept(path.toFile()));
     }
 
     /**
@@ -85,6 +86,18 @@ public interface IOFileFilter extends FileFilter, FilenameFilter, PathFilter {
         return new AndFileFilter(this, fileFilter);
     }
 
+    /**
+     * Tests if a Path should be accepted by this filter.
+     *
+     * @param path the Path to check.
+     * @return true if this path matches the test.
+     * @since 2.14.0
+     */
+    @Override
+    default boolean matches(final Path path) {
+        return accept(path, null) != FileVisitResult.TERMINATE;
+    }
+
     /**
      * Creates a new "not" filter with this filter.
      *
diff --git a/src/test/java/org/apache/commons/io/filefilter/AbstractFilterTest.java b/src/test/java/org/apache/commons/io/filefilter/AbstractFilterTest.java
index 4ed27be3..3014b315 100644
--- a/src/test/java/org/apache/commons/io/filefilter/AbstractFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/AbstractFilterTest.java
@@ -50,9 +50,10 @@ public class AbstractFilterTest {
 
         if (file != null && file.getParentFile() != null) {
             assertEquals(expected, filter.accept(file.getParentFile(), file.getName()),
-                "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for " + file);
+                    "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for " + file);
         } else if (file == null) {
-            assertEquals(expected, filter.accept(file), "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
+            assertEquals(expected, filter.accept(null), "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
+            assertEquals(expected, filter.matches(null), "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
         }
         assertNotNull(filter.toString());
     }
@@ -66,10 +67,14 @@ public class AbstractFilterTest {
 
         if (path != null && path.getParent() != null) {
             assertEquals(expectedFileVisitResult, filter.accept(path, null),
-                "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
+                    "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
+            assertEquals(expectedFileVisitResult != FileVisitResult.TERMINATE, filter.matches(path),
+                    "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
         } else if (path == null) {
             assertEquals(expectedFileVisitResult, filter.accept(path, null),
-                "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for null");
+                    "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for null");
+            assertEquals(expectedFileVisitResult != FileVisitResult.TERMINATE, filter.matches(path),
+                    "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for null");
         }
         assertNotNull(filter.toString());
     }
diff --git a/src/test/java/org/apache/commons/io/filefilter/FileFilterTest.java b/src/test/java/org/apache/commons/io/filefilter/FileFilterTest.java
index 3b8f4bcd..9aa39b72 100644
--- a/src/test/java/org/apache/commons/io/filefilter/FileFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/FileFilterTest.java
@@ -328,9 +328,14 @@ public class FileFilterTest extends AbstractFilterTest {
         assertFiltering(listFilter, new File("Test.gif").toPath(), true);
         assertFiltering(listFilter, new File("Test.bmp").toPath(), false);
 
+        // File
         assertTrue(listFilter.accept(txtFile));
         assertFalse(listFilter.accept(bmpFile));
         assertFalse(listFilter.accept(dirFile));
+        // Path
+        assertTrue(listFilter.matches(txtPath));
+        assertFalse(listFilter.matches(bmpPath));
+        assertFalse(listFilter.matches(dirPath));
         //
         assertEquals(FileVisitResult.CONTINUE, listFilter.accept(txtPath, null));
         assertEquals(FileVisitResult.TERMINATE, listFilter.accept(bmpPath, null));
@@ -1109,9 +1114,11 @@ public class FileFilterTest extends AbstractFilterTest {
 
         assertTrue(orFilter.accept(testFile.getParentFile(), testFile.getName()));
         assertEquals(FileVisitResult.CONTINUE, orFilter.accept(testPath, null));
+        assertTrue(orFilter.matches(testPath));
         orFilter.removeFileFilter(trueFilter);
         assertFalse(orFilter.accept(testFile.getParentFile(), testFile.getName()));
         assertEquals(FileVisitResult.TERMINATE, orFilter.accept(testPath, null));
+        assertFalse(orFilter.matches(testPath));
 
         assertThrows(NullPointerException.class, () -> new OrFileFilter(falseFilter, null));
     }
@@ -1165,6 +1172,9 @@ public class FileFilterTest extends AbstractFilterTest {
         //
         assertEquals(FileVisitResult.CONTINUE, filter.accept(testPath, null));
         assertEquals(FileVisitResult.TERMINATE, filter.accept(fredPath, null));
+        //
+        assertTrue(filter.matches(testPath));
+        assertFalse(filter.matches(fredPath));
 
         final List<String> prefixes = Arrays.asList("foo", "fre");
         final IOFileFilter listFilter = new PrefixFileFilter(prefixes);
@@ -1174,6 +1184,9 @@ public class FileFilterTest extends AbstractFilterTest {
         //
         assertEquals(FileVisitResult.TERMINATE, listFilter.accept(testPath, null));
         assertEquals(FileVisitResult.CONTINUE, listFilter.accept(fredPath, null));
+        //
+        assertFalse(listFilter.matches(testPath));
+        assertTrue(listFilter.matches(fredPath));
 
         assertThrows(NullPointerException.class, () -> new PrefixFileFilter((String) null));
         assertThrows(NullPointerException.class, () -> new PrefixFileFilter((String[]) null));
@@ -1348,6 +1361,9 @@ public class FileFilterTest extends AbstractFilterTest {
         //
         assertEquals(FileVisitResult.CONTINUE, filter.accept(testPath, null));
         assertEquals(FileVisitResult.TERMINATE, filter.accept(fredPath, null));
+        //
+        assertTrue(filter.matches(testPath));
+        assertFalse(filter.matches(fredPath));
 
         final List<String> prefixes = Arrays.asList("ood", "red");
         final IOFileFilter listFilter = new SuffixFileFilter(prefixes);
diff --git a/src/test/java/org/apache/commons/io/filefilter/IOFileFilterAbstractTest.java b/src/test/java/org/apache/commons/io/filefilter/IOFileFilterAbstractTest.java
index 5009ec5d..60e109cf 100644
--- a/src/test/java/org/apache/commons/io/filefilter/IOFileFilterAbstractTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/IOFileFilterAbstractTest.java
@@ -93,6 +93,8 @@ public abstract class IOFileFilterAbstractTest {
     public static void assertFileFiltering(final int testNumber, final IOFileFilter filter, final File file, final boolean expected) {
         assertEquals(expected, filter.accept(file),
                 "test " + testNumber + " Filter(File) " + filter.getClass().getName() + " not " + expected + " for " + file);
+        assertEquals(expected, filter.matches(file.toPath()),
+                "test " + testNumber + " Filter(File) " + filter.getClass().getName() + " not " + expected + " for " + file);
     }
 
     public static void assertFilenameFiltering(final int testNumber, final IOFileFilter filter, final File file, final boolean expected) {
@@ -107,14 +109,18 @@ public abstract class IOFileFilterAbstractTest {
         assertEquals(expected, filter.accept(file),
             "test " + testNumber + " Filter(File) " + filter.getClass().getName() + " not " + expected + " for " + file);
         assertEquals(expected, filter.accept(file.toPath(), null),
-            "test " + testNumber + " Filter(File) " + filter.getClass().getName() + " not " + expected + " for " + file);
+                "test " + testNumber + " Filter(File) " + filter.getClass().getName() + " not " + expected + " for " + file);
 
         if (file != null && file.getParentFile() != null) {
             assertEquals(expected, filter.accept(file.getParentFile(), file.getName()),
                     "test " + testNumber + " Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for " + file);
+            assertEquals(expected, filter.matches(file.toPath()),
+                    "test " + testNumber + " Filter(File) " + filter.getClass().getName() + " not " + expected + " for " + file);
         } else if (file == null) {
             assertEquals(expected, filter.accept(file),
                     "test " + testNumber + " Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
+            assertEquals(expected, filter.matches(null),
+                    "test " + testNumber + " Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
         }
     }
 
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 e80ec10d..c0571299 100644
--- a/src/test/java/org/apache/commons/io/filefilter/RegexFileFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/RegexFileFilterTest.java
@@ -49,9 +49,13 @@ public class RegexFileFilterTest {
         if (file != null && file.getParentFile() != null) {
             assertEquals(expected, filter.accept(file.getParentFile(), file.getName()),
                     "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for " + file);
+            assertEquals(expected, filter.matches(file.toPath()),
+                    "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for " + file);
         } else if (file == null) {
             assertEquals(expected, filter.accept(file),
                     "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
+            assertEquals(expected, filter.matches(null),
+                    "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
         }
         // Just don't blow up
         assertNotNull(filter.toString());
@@ -62,7 +66,9 @@ public class RegexFileFilterTest {
         // the Path passed in is not null
         final FileVisitResult expectedFileVisitResult = AbstractFileFilter.toDefaultFileVisitResult(expected);
         assertEquals(expectedFileVisitResult, filter.accept(path, null),
-            "Filter(Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
+                "Filter(Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
+        assertEquals(expectedFileVisitResult != FileVisitResult.TERMINATE, filter.matches(path),
+                "Filter(Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
 
         if (path != null && path.getParent() != null) {
             assertEquals(expectedFileVisitResult, filter.accept(path, null),
diff --git a/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java b/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java
index 380ad0cb..49478a8b 100644
--- a/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java
@@ -56,7 +56,8 @@ public class SymbolicLinkFileFilterTest {
     private static Path targetDirPath; // hard directory Path
     private static Path testLinkDirPath; // symbolic link to hardDirectory
     private static File testLinkDirFile;
-    private static File missingFile; // non-existent file
+    private static File missingFileFile; // non-existent file
+    private static Path missingFilePath; // non-existent file
     private static SymbolicLinkFileFilter filter;
 
     // Mock filter for testing on Windows.
@@ -127,7 +128,8 @@ public class SymbolicLinkFileFilterTest {
         targetDirFile = targetDirPath.toFile();
         testLinkDirPath = symbolicLinkCreator.apply(parentDirectoryPath.resolve(DIRECTORY_LINK_NAME), targetDirPath);
         testLinkDirFile = testLinkDirPath.toFile();
-        missingFile = new File(parentDirectoryPath.toFile(), MISSING);
+        missingFileFile = new File(parentDirectoryPath.toFile(), MISSING);
+        missingFilePath = missingFileFile.toPath();
     }
 
     @Test
@@ -147,7 +149,7 @@ public class SymbolicLinkFileFilterTest {
 
     @Test
     public void testFileFilter_missingFile() {
-        assertFalse(filter.accept(missingFile));
+        assertFalse(filter.accept(missingFileFile));
     }
 
     @Test
@@ -183,30 +185,37 @@ public class SymbolicLinkFileFilterTest {
     @Test
     public void testPathFilter_HardDirectory() {
         assertEquals(FileVisitResult.TERMINATE, filter.accept(targetDirPath, null));
+        assertFalse(filter.matches(targetDirPath));
     }
 
     @Test
     public void testPathFilter_HardFile() {
         assertEquals(FileVisitResult.TERMINATE, filter.accept(testTargetPath, null));
+        assertFalse(filter.matches(testTargetPath));
     }
 
     @Test
     public void testPathFilter_Link() {
         assertEquals(FileVisitResult.CONTINUE, filter.accept(testLinkPath, null));
+        assertTrue(filter.matches(testLinkPath));
+
     }
 
     @Test
     public void testPathFilter_missingFile() {
-        assertEquals(FileVisitResult.TERMINATE, filter.accept(missingFile.toPath(), null));
+        assertEquals(FileVisitResult.TERMINATE, filter.accept(missingFilePath, null));
+        assertFalse(filter.matches(missingFilePath));
     }
 
     @Test
     public void testPathFilter_PathLink() {
         assertEquals(FileVisitResult.CONTINUE, filter.accept(testLinkDirPath, null));
+        assertTrue(filter.matches(testLinkDirPath));
     }
 
     @Test
     public void testSymbolicLinkFileFilter() {
         assertEquals(FileVisitResult.TERMINATE, SymbolicLinkFileFilter.INSTANCE.accept(PathUtils.current(), null));
+        assertFalse(filter.matches(PathUtils.current()));
     }
 }
diff --git a/src/test/java/org/apache/commons/io/filefilter/WildcardFileFilterTest.java b/src/test/java/org/apache/commons/io/filefilter/WildcardFileFilterTest.java
index b9ab69ce..af3755ae 100644
--- a/src/test/java/org/apache/commons/io/filefilter/WildcardFileFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/WildcardFileFilterTest.java
@@ -138,13 +138,18 @@ public class WildcardFileFilterTest extends AbstractFilterTest {
         final Path bmpPath = bmpFile.toPath();
         final File dirFile = new File("src/java");
         final Path dirPath = dirFile.toPath();
+        // File
         assertTrue(listFilter.accept(txtFile));
         assertFalse(listFilter.accept(bmpFile));
         assertFalse(listFilter.accept(dirFile));
+        // Path
+        assertTrue(listFilter.matches(txtPath));
+        assertFalse(listFilter.matches(bmpPath));
+        assertFalse(listFilter.matches(dirPath));
         //
-        assertEquals(FileVisitResult.CONTINUE, listFilter.accept(txtFile.toPath(), null));
-        assertEquals(FileVisitResult.TERMINATE, listFilter.accept(bmpFile.toPath(), null));
-        assertEquals(FileVisitResult.TERMINATE, listFilter.accept(dirFile.toPath(), null));
+        assertEquals(FileVisitResult.CONTINUE, listFilter.accept(txtPath, null));
+        assertEquals(FileVisitResult.TERMINATE, listFilter.accept(bmpPath, null));
+        assertEquals(FileVisitResult.TERMINATE, listFilter.accept(dirPath, null));
 
         assertTrue(listFilter.accept(txtFile.getParentFile(), txtFile.getName()));
         assertFalse(listFilter.accept(bmpFile.getParentFile(), bmpFile.getName()));