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 <[email protected]>
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());
}
}