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<Path, R>).</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()); } }