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 <garydgreg...@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<String>) </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()));