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 a8ee7b9d Add and use PathUtils.getFileNameString()
a8ee7b9d is described below

commit a8ee7b9defba5ed7c83c1fa06b4020930ea5f00e
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Sat Dec 16 16:18:34 2023 -0500

    Add and use PathUtils.getFileNameString()
---
 pom.xml                                            |  8 +++----
 src/changes/changes.xml                            |  5 +++-
 .../commons/io/file/CleaningPathVisitor.java       |  2 +-
 .../commons/io/file/DeletingPathVisitor.java       |  2 +-
 .../java/org/apache/commons/io/file/PathUtils.java | 28 ++++++++++++++++++++++
 .../commons/io/filefilter/NameFileFilter.java      |  7 +++---
 .../commons/io/filefilter/PrefixFileFilter.java    |  4 ++--
 .../commons/io/filefilter/RegexFileFilter.java     |  3 ++-
 .../commons/io/filefilter/SuffixFileFilter.java    |  7 +++---
 .../commons/io/filefilter/WildcardFileFilter.java  |  7 +++---
 .../commons/io/filefilter/WildcardFilter.java      |  9 +++----
 .../commons/io/file/DirectoryStreamFilterTest.java |  4 ++--
 .../org/apache/commons/io/file/PathUtilsTest.java  | 13 ++++++++--
 13 files changed, 72 insertions(+), 27 deletions(-)

diff --git a/pom.xml b/pom.xml
index 13acd746..9218f1bb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
-  <version>2.15.2-SNAPSHOT</version>
+  <version>2.16.0-SNAPSHOT</version>
   <name>Apache Commons IO</name>
 
   <inceptionYear>2002</inceptionYear>
@@ -317,9 +317,9 @@ file comparators, endian transformation classes, and much 
more.
     <commons.componentid>io</commons.componentid>
     <commons.module.name>org.apache.commons.io</commons.module.name>
     <commons.rc.version>RC1</commons.rc.version>
-    <commons.bc.version>2.15.0</commons.bc.version>
-    <commons.release.version>2.15.1</commons.release.version>
-    <commons.release.next>2.15.2</commons.release.next>
+    <commons.bc.version>2.15.1</commons.bc.version>
+    <commons.release.version>2.16.0</commons.release.version>
+    <commons.release.next>2.16.1</commons.release.next>
     <commons.release.desc>(requires Java 8)</commons.release.desc>
     <commons.jira.id>IO</commons.jira.id>
     <commons.jira.pid>12310477</commons.jira.pid>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 829d43cd..db042029 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -47,13 +47,16 @@ The <action> type attribute can be add,update,fix,remove.
   </properties>
 
   <body>
-    <release version="2.15.2" date="202Y-MM-DD" description="Java 8 is 
required.">
+    <release version="2.16.0" date="202Y-MM-DD" description="Java 8 is 
required.">
       <!-- Fix -->
       <action dev="ggregory" type="fix" due-to="Elliotte Rusty Harold">Fix and 
reenable testSkip_RequiredCharsets #518.</action>
       <action dev="ggregory" type="fix" issue="IO-824" due-to="Miguel Munoz, 
Gary Gregory">SymbolicLineFileFilter documentation fixes.</action>
       <action dev="ggregory" type="fix" issue="IO-795" due-to="Miguel Munoz, 
Gary Gregory">CharSequenceInputStream.reset() only works once #520.</action>
       <action dev="ggregory" type="fix" issue="IO-825" due-to="Arthur Chan, 
Gary Gregory">Add byte array size validation for methods in EndianUtils 
#521.</action>
       <action dev="ggregory" type="fix" issue="IO-825" due-to="dkdal, Gary 
Gregory">Add missing test case CircularByteBufferTest.</action>
+      <!-- Add -->
+      <action dev="ggregory" type="fix" issue="IO-825" due-to="dkdal, Gary 
Gregory">Add and use PathUtils.getFileName(Path, Function&lt;Path, 
R&gt;).</action>
+      <action dev="ggregory" type="fix" issue="IO-825" due-to="dkdal, Gary 
Gregory">Add and use PathUtils.getFileNameString().</action>
     </release>
     <release version="2.15.1" date="2023-11-24" description="Java 8 is 
required.">
       <!-- FIX -->
diff --git a/src/main/java/org/apache/commons/io/file/CleaningPathVisitor.java 
b/src/main/java/org/apache/commons/io/file/CleaningPathVisitor.java
index 79162f32..bfc034bd 100644
--- a/src/main/java/org/apache/commons/io/file/CleaningPathVisitor.java
+++ b/src/main/java/org/apache/commons/io/file/CleaningPathVisitor.java
@@ -89,7 +89,7 @@ public class CleaningPathVisitor extends CountingPathVisitor {
      * @return true to process the given path, false if not.
      */
     private boolean accept(final Path path) {
-        return Arrays.binarySearch(skip, Objects.toString(path.getFileName(), 
null)) < 0;
+        return Arrays.binarySearch(skip, PathUtils.getFileNameString(path)) < 
0;
     }
 
     @Override
diff --git a/src/main/java/org/apache/commons/io/file/DeletingPathVisitor.java 
b/src/main/java/org/apache/commons/io/file/DeletingPathVisitor.java
index aff9bcd3..fd863994 100644
--- a/src/main/java/org/apache/commons/io/file/DeletingPathVisitor.java
+++ b/src/main/java/org/apache/commons/io/file/DeletingPathVisitor.java
@@ -107,7 +107,7 @@ public class DeletingPathVisitor extends 
CountingPathVisitor {
      * @return true to process the given path, false if not.
      */
     private boolean accept(final Path path) {
-        return Arrays.binarySearch(skip, Objects.toString(path.getFileName(), 
null)) < 0;
+        return Arrays.binarySearch(skip, PathUtils.getFileNameString(path)) < 
0;
     }
 
     @Override
diff --git a/src/main/java/org/apache/commons/io/file/PathUtils.java 
b/src/main/java/org/apache/commons/io/file/PathUtils.java
index 6e3e4b1a..9f0dddb1 100644
--- a/src/main/java/org/apache/commons/io/file/PathUtils.java
+++ b/src/main/java/org/apache/commons/io/file/PathUtils.java
@@ -63,6 +63,7 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -866,6 +867,33 @@ public final class PathUtils {
         return Files.getFileAttributeView(path, DosFileAttributeView.class, 
options);
     }
 
+    /**
+     * Gets the Path's file name and apply the given function if the file name 
is non-null.
+     *
+     * @param <R> The function's result type.
+     * @param path the path to query.
+     * @param function function to apply to the file name.
+     * @return the Path's file name as a string or null.
+     * @see Path#getFileName()
+     * @since 2.16.0
+     */
+    public static <R> R getFileName(final Path path, Function<Path, R> 
function) {
+        final Path fileName = path.getFileName();
+        return fileName != null ? function.apply(fileName) : null;
+    }
+
+    /**
+     * Gets the Path's file name as a string.
+     *
+     * @param path the path to query.
+     * @return the Path's file name as a string or null.
+     * @see Path#getFileName()
+     * @since 2.16.0
+     */
+    public static String getFileNameString(final Path path) {
+        return getFileName(path, Path::toString);
+    }
+
     /**
      * Gets the file's last modified time or null if the file does not exist.
      * <p>
diff --git a/src/main/java/org/apache/commons/io/filefilter/NameFileFilter.java 
b/src/main/java/org/apache/commons/io/filefilter/NameFileFilter.java
index 2d986cfb..d9e058db 100644
--- a/src/main/java/org/apache/commons/io/filefilter/NameFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/NameFileFilter.java
@@ -26,6 +26,7 @@ import java.util.Objects;
 import java.util.stream.Stream;
 
 import org.apache.commons.io.IOCase;
+import org.apache.commons.io.file.PathUtils;
 
 /**
  * Filters file names for a certain name.
@@ -179,14 +180,14 @@ public class NameFileFilter extends AbstractFileFilter 
implements Serializable {
 
     /**
      * Checks to see if the file name matches.
-     * @param file  the File to check
+     * @param path  the File to check
      *
      * @return true if the file name matches
      * @since 2.9.0
      */
     @Override
-    public FileVisitResult accept(final Path file, final BasicFileAttributes 
attributes) {
-        return 
toFileVisitResult(acceptBaseName(Objects.toString(file.getFileName(), null)));
+    public FileVisitResult accept(final Path path, final BasicFileAttributes 
attributes) {
+        return 
toFileVisitResult(acceptBaseName(PathUtils.getFileNameString(path)));
     }
 
     private boolean acceptBaseName(final String baseName) {
diff --git 
a/src/main/java/org/apache/commons/io/filefilter/PrefixFileFilter.java 
b/src/main/java/org/apache/commons/io/filefilter/PrefixFileFilter.java
index 13f03648..c2e9f055 100644
--- a/src/main/java/org/apache/commons/io/filefilter/PrefixFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/PrefixFileFilter.java
@@ -26,6 +26,7 @@ import java.util.Objects;
 import java.util.stream.Stream;
 
 import org.apache.commons.io.IOCase;
+import org.apache.commons.io.file.PathUtils;
 
 /**
  * Filters file names for a certain prefix.
@@ -191,8 +192,7 @@ public class PrefixFileFilter extends AbstractFileFilter 
implements Serializable
      */
     @Override
     public FileVisitResult accept(final Path file, final BasicFileAttributes 
attributes) {
-        final Path fileName = file.getFileName();
-        return toFileVisitResult(accept(fileName == null ? null : 
fileName.toFile()));
+        return toFileVisitResult(accept(PathUtils.getFileName(file, 
Path::toFile)));
     }
 
     private boolean accept(final String name) {
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 757b1353..b72b1a5c 100644
--- a/src/main/java/org/apache/commons/io/filefilter/RegexFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/RegexFileFilter.java
@@ -26,6 +26,7 @@ import java.util.function.Function;
 import java.util.regex.Pattern;
 
 import org.apache.commons.io.IOCase;
+import org.apache.commons.io.file.PathUtils;
 
 /**
  * Filters files using supplied regular expression(s).
@@ -111,7 +112,7 @@ public class RegexFileFilter extends AbstractFileFilter 
implements Serializable
      */
     @SuppressWarnings("unchecked")
     public RegexFileFilter(final Pattern pattern) {
-        this(pattern, (Function<Path, String> & Serializable) p -> 
Objects.toString(p.getFileName(), null));
+        this(pattern, (Function<Path, String> & Serializable) 
PathUtils::getFileNameString);
     }
 
     /**
diff --git 
a/src/main/java/org/apache/commons/io/filefilter/SuffixFileFilter.java 
b/src/main/java/org/apache/commons/io/filefilter/SuffixFileFilter.java
index e06f5448..ac03da1a 100644
--- a/src/main/java/org/apache/commons/io/filefilter/SuffixFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/SuffixFileFilter.java
@@ -26,6 +26,7 @@ import java.util.Objects;
 import java.util.stream.Stream;
 
 import org.apache.commons.io.IOCase;
+import org.apache.commons.io.file.PathUtils;
 
 /**
  * Filters files based on the suffix (what the file name ends with).
@@ -185,14 +186,14 @@ public class SuffixFileFilter extends AbstractFileFilter 
implements Serializable
 
     /**
      * Checks to see if the file name ends with the suffix.
-     * @param file  the File to check
+     * @param path  the File to check
      *
      * @return true if the file name ends with one of our suffixes
      * @since 2.9.0
      */
     @Override
-    public FileVisitResult accept(final Path file, final BasicFileAttributes 
attributes) {
-        return toFileVisitResult(accept(Objects.toString(file.getFileName(), 
null)));
+    public FileVisitResult accept(final Path path, final BasicFileAttributes 
attributes) {
+        return toFileVisitResult(accept(PathUtils.getFileNameString(path)));
     }
 
     private boolean accept(final String name) {
diff --git 
a/src/main/java/org/apache/commons/io/filefilter/WildcardFileFilter.java 
b/src/main/java/org/apache/commons/io/filefilter/WildcardFileFilter.java
index 0b21e7a0..639feffb 100644
--- a/src/main/java/org/apache/commons/io/filefilter/WildcardFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/WildcardFileFilter.java
@@ -28,6 +28,7 @@ import java.util.stream.Stream;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOCase;
 import org.apache.commons.io.build.AbstractSupplier;
+import org.apache.commons.io.file.PathUtils;
 
 /**
  * Filters files using the supplied wildcards.
@@ -274,14 +275,14 @@ public class WildcardFileFilter extends 
AbstractFileFilter implements Serializab
     /**
      * Checks to see if the file name matches one of the wildcards.
      *
-     * @param file the file to check
+     * @param path the file to check
      *
      * @return true if the file name matches one of the wildcards.
      * @since 2.9.0
      */
     @Override
-    public FileVisitResult accept(final Path file, final BasicFileAttributes 
attributes) {
-        return toFileVisitResult(accept(Objects.toString(file.getFileName(), 
null)));
+    public FileVisitResult accept(final Path path, final BasicFileAttributes 
attributes) {
+        return toFileVisitResult(accept(PathUtils.getFileNameString(path)));
     }
 
     private boolean accept(final String name) {
diff --git a/src/main/java/org/apache/commons/io/filefilter/WildcardFilter.java 
b/src/main/java/org/apache/commons/io/filefilter/WildcardFilter.java
index 007e93ef..477a77f5 100644
--- a/src/main/java/org/apache/commons/io/filefilter/WildcardFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/WildcardFilter.java
@@ -27,6 +27,7 @@ import java.util.Objects;
 import java.util.stream.Stream;
 
 import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.file.PathUtils;
 
 /**
  * Filters files using the supplied wildcards.
@@ -154,18 +155,18 @@ public class WildcardFilter extends AbstractFileFilter 
implements Serializable {
 
     /**
      * Checks to see if the file name matches one of the wildcards.
-     * @param file the file to check
+     * @param path the file to check
      *
      * @return true if the file name matches one of the wildcards
      * @since 2.9.0
      */
     @Override
-    public FileVisitResult accept(final Path file, final BasicFileAttributes 
attributes) {
-        if (Files.isDirectory(file)) {
+    public FileVisitResult accept(final Path path, final BasicFileAttributes 
attributes) {
+        if (Files.isDirectory(path)) {
             return FileVisitResult.TERMINATE;
         }
         return toDefaultFileVisitResult(
-                Stream.of(wildcards).anyMatch(wildcard -> 
FilenameUtils.wildcardMatch(Objects.toString(file.getFileName(), null), 
wildcard)));
+                Stream.of(wildcards).anyMatch(wildcard -> 
FilenameUtils.wildcardMatch(PathUtils.getFileNameString(path), wildcard)));
 
     }
 
diff --git 
a/src/test/java/org/apache/commons/io/file/DirectoryStreamFilterTest.java 
b/src/test/java/org/apache/commons/io/file/DirectoryStreamFilterTest.java
index 60e5442b..326a9e48 100644
--- a/src/test/java/org/apache/commons/io/file/DirectoryStreamFilterTest.java
+++ b/src/test/java/org/apache/commons/io/file/DirectoryStreamFilterTest.java
@@ -44,7 +44,7 @@ public class DirectoryStreamFilterTest {
         try (DirectoryStream<Path> stream = 
Files.newDirectoryStream(PathUtils.current(), streamFilter)) {
             final Iterator<Path> iterator = stream.iterator();
             final Path path = iterator.next();
-            assertEquals(PATH_FIXTURE, path.getFileName().toString());
+            assertEquals(PATH_FIXTURE, PathUtils.getFileNameString(path));
             assertFalse(iterator.hasNext());
         }
     }
@@ -55,7 +55,7 @@ public class DirectoryStreamFilterTest {
         final DirectoryStreamFilter streamFilter = new 
DirectoryStreamFilter(pathFilter);
         assertEquals(pathFilter, streamFilter.getPathFilter());
         try (DirectoryStream<Path> stream = 
Files.newDirectoryStream(PathUtils.current(), streamFilter)) {
-            stream.forEach(path -> assertNotEquals(PATH_FIXTURE, 
path.getFileName().toString()));
+            stream.forEach(path -> assertNotEquals(PATH_FIXTURE, 
PathUtils.getFileNameString(path)));
         }
     }
 
diff --git a/src/test/java/org/apache/commons/io/file/PathUtilsTest.java 
b/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
index 622937e4..d46f5185 100644
--- a/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
+++ b/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
@@ -154,7 +154,8 @@ public class PathUtilsTest extends AbstractTempDirTest {
     @Test
     public void testCopyDirectoryForDifferentFilesystemsWithRelativePath() 
throws IOException {
         final Path archivePath = Paths.get(TEST_JAR_PATH);
-        try (FileSystem archive = openArchive(archivePath, false); final 
FileSystem targetArchive = openArchive(tempDirPath.resolve(TEST_JAR_NAME), 
true)) {
+        try (FileSystem archive = openArchive(archivePath, false);
+                final FileSystem targetArchive = 
openArchive(tempDirPath.resolve(TEST_JAR_NAME), true)) {
             final Path targetDir = targetArchive.getPath("targetDir");
             Files.createDirectory(targetDir);
             // relative jar -> relative dir
@@ -245,6 +246,14 @@ public class PathUtilsTest extends AbstractTempDirTest {
         assertEquals(symlinkedDir, 
PathUtils.createParentDirectories(symlinkedDir.resolve("child")));
     }
 
+    @Test
+    public void testGetFileNameString() {
+        assertNull(PathUtils.getFileNameString(Paths.get("/")));
+        assertEquals("", PathUtils.getFileNameString(Paths.get("")));
+        assertEquals("a", PathUtils.getFileNameString(Paths.get("a")));
+        assertEquals("a", PathUtils.getFileNameString(Paths.get("p", "a")));
+    }
+
     @Test
     public void testGetLastModifiedFileTime_File_Present() throws IOException {
         assertNotNull(PathUtils.getLastModifiedFileTime(current().toFile()));
@@ -330,7 +339,7 @@ public class PathUtilsTest extends AbstractTempDirTest {
         try (DirectoryStream<Path> stream = 
PathUtils.newDirectoryStream(current(), pathFilter)) {
             final Iterator<Path> iterator = stream.iterator();
             final Path path = iterator.next();
-            assertEquals(PATH_FIXTURE, path.getFileName().toString());
+            assertEquals(PATH_FIXTURE, PathUtils.getFileNameString(path));
             assertFalse(iterator.hasNext());
         }
     }

Reply via email to