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/12/22 01:34:48 UTC
(commons-io) branch master updated (08bf6d00 -> 87ef9556)
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git
from 08bf6d00 [IO-808] Internal refactoring
new 7d44bb77 More tests and NPE-proofing
new 87ef9556 Avoid NullPointerException in file filters
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
src/changes/changes.xml | 15 +++++++++++
src/main/java/org/apache/commons/io/IOCase.java | 5 +---
.../java/org/apache/commons/io/file/PathUtils.java | 2 +-
.../io/filefilter/CanExecuteFileFilter.java | 4 +--
.../commons/io/filefilter/CanReadFileFilter.java | 4 +--
.../commons/io/filefilter/CanWriteFileFilter.java | 4 +--
.../commons/io/filefilter/DirectoryFileFilter.java | 4 +--
.../commons/io/filefilter/EmptyFileFilter.java | 6 +++++
.../commons/io/filefilter/FileFileFilter.java | 4 +--
.../commons/io/filefilter/HiddenFileFilter.java | 4 +--
.../commons/io/filefilter/NameFileFilter.java | 2 +-
.../io/filefilter/PathMatcherFileFilter.java | 1 +
.../commons/io/filefilter/SizeFileFilter.java | 2 +-
.../java/org/apache/commons/io/IOCaseTest.java | 6 ++---
.../org/apache/commons/io/file/PathUtilsTest.java | 11 ++++++++
.../commons/io/filefilter/FileFilterTest.java | 31 ++++++++++++++++++++--
16 files changed, 81 insertions(+), 24 deletions(-)
(commons-io) 02/02: Avoid NullPointerException in file filters
Posted by gg...@apache.org.
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
commit 87ef9556055b6b4f970f89deac4e0592eb569de1
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Dec 21 20:34:36 2023 -0500
Avoid NullPointerException in file filters
---
src/changes/changes.xml | 15 +++++++++++
src/main/java/org/apache/commons/io/IOCase.java | 5 +---
.../io/filefilter/CanExecuteFileFilter.java | 4 +--
.../commons/io/filefilter/CanReadFileFilter.java | 4 +--
.../commons/io/filefilter/CanWriteFileFilter.java | 4 +--
.../commons/io/filefilter/DirectoryFileFilter.java | 4 +--
.../commons/io/filefilter/EmptyFileFilter.java | 6 +++++
.../commons/io/filefilter/FileFileFilter.java | 4 +--
.../commons/io/filefilter/HiddenFileFilter.java | 4 +--
.../commons/io/filefilter/NameFileFilter.java | 2 +-
.../io/filefilter/PathMatcherFileFilter.java | 1 +
.../commons/io/filefilter/SizeFileFilter.java | 2 +-
.../java/org/apache/commons/io/IOCaseTest.java | 6 ++---
.../commons/io/filefilter/FileFilterTest.java | 31 ++++++++++++++++++++--
14 files changed, 69 insertions(+), 23 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 141b9970..56c4bf74 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -57,6 +57,21 @@ The <action> type attribute can be add,update,fix,remove.
<action dev="ggregory" type="fix" issue="IO-781" due-to="Elliotte Rusty Harold">Make CharSequenceInputStream.available() more correct in the face of multibyte encodings #525.</action>
<action dev="ggregory" type="fix" issue="IO-781" due-to="Elliotte Rusty Harold">Remove unreachable code in AbstractIOFileFilterTest #526.</action>
<action dev="ggregory" type="fix" issue="IO-808" due-to="Elliotte Rusty Harold">Rationalize and unify checking for existence of files and directories #529.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in IOCase.checkEquals(String, String) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in CanExecuteFileFilter.accept(File) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in CanExecuteFileFilter.accept(Path, BasicFileAttributes) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in CanReadFileFilter.accept(File) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in CanReadFileFilter.accept(Path, BasicFileAttributes) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in CanWriteFileFilter.accept(File) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in CanWriteFileFilter.accept(Path, BasicFileAttributes) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in DirectoryFileFilter.accept(File) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in DirectoryFileFilter.accept(Path, BasicFileAttributes) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in EmptyFileFilter.accept(File) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in EmptyFileFilter.accept(Path, BasicFileAttributes) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in FileFileFilter.accept(File) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in FileFileFilter.accept(Path, BasicFileAttributes) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in HiddenFileFilter.accept(File) on null input.</action>
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Avoid NullPointerException in HiddenFileFilter.accept(Path, BasicFileAttributes) on null input.</action>
<!-- Add -->
<action dev="ggregory" type="fix" due-to="Gary Gregory">Add and use PathUtils.getFileName(Path, Function<Path, R>).</action>
<action dev="ggregory" type="fix" due-to="Gary Gregory">Add and use PathUtils.getFileNameString().</action>
diff --git a/src/main/java/org/apache/commons/io/IOCase.java b/src/main/java/org/apache/commons/io/IOCase.java
index cc425609..1eabc9e9 100644
--- a/src/main/java/org/apache/commons/io/IOCase.java
+++ b/src/main/java/org/apache/commons/io/IOCase.java
@@ -167,12 +167,9 @@ public enum IOCase {
* @param str1 the first string to compare, not null
* @param str2 the second string to compare, not null
* @return true if equal using the case rules
- * @throws NullPointerException if either string is null
*/
public boolean checkEquals(final String str1, final String str2) {
- Objects.requireNonNull(str1, "str1");
- Objects.requireNonNull(str2, "str2");
- return sensitive ? str1.equals(str2) : str1.equalsIgnoreCase(str2);
+ return str1 == str2 || str1 != null && (sensitive ? str1.equals(str2) : str1.equalsIgnoreCase(str2));
}
/**
diff --git a/src/main/java/org/apache/commons/io/filefilter/CanExecuteFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/CanExecuteFileFilter.java
index 9bd55e4a..b128ec0e 100644
--- a/src/main/java/org/apache/commons/io/filefilter/CanExecuteFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/CanExecuteFileFilter.java
@@ -82,7 +82,7 @@ public class CanExecuteFileFilter extends AbstractFileFilter implements Serializ
*/
@Override
public boolean accept(final File file) {
- return file.canExecute();
+ return file != null && file.canExecute();
}
/**
@@ -94,7 +94,7 @@ public class CanExecuteFileFilter extends AbstractFileFilter implements Serializ
*/
@Override
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
- return toFileVisitResult(Files.isExecutable(file));
+ return toFileVisitResult(file != null && Files.isExecutable(file));
}
}
diff --git a/src/main/java/org/apache/commons/io/filefilter/CanReadFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/CanReadFileFilter.java
index a1efdcc9..266ea353 100644
--- a/src/main/java/org/apache/commons/io/filefilter/CanReadFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/CanReadFileFilter.java
@@ -92,7 +92,7 @@ public class CanReadFileFilter extends AbstractFileFilter implements Serializabl
*/
@Override
public boolean accept(final File file) {
- return file.canRead();
+ return file != null && file.canRead();
}
/**
@@ -104,7 +104,7 @@ public class CanReadFileFilter extends AbstractFileFilter implements Serializabl
*/
@Override
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
- return toFileVisitResult(Files.isReadable(file));
+ return toFileVisitResult(file != null && Files.isReadable(file));
}
}
diff --git a/src/main/java/org/apache/commons/io/filefilter/CanWriteFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/CanWriteFileFilter.java
index 842007bf..24bf6481 100644
--- a/src/main/java/org/apache/commons/io/filefilter/CanWriteFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/CanWriteFileFilter.java
@@ -80,7 +80,7 @@ public class CanWriteFileFilter extends AbstractFileFilter implements Serializab
*/
@Override
public boolean accept(final File file) {
- return file.canWrite();
+ return file != null && file.canWrite();
}
/**
@@ -92,7 +92,7 @@ public class CanWriteFileFilter extends AbstractFileFilter implements Serializab
*/
@Override
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
- return toFileVisitResult(Files.isWritable(file));
+ return toFileVisitResult(file != null && Files.isWritable(file));
}
}
diff --git a/src/main/java/org/apache/commons/io/filefilter/DirectoryFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/DirectoryFileFilter.java
index b02d8ffe..04ee8858 100644
--- a/src/main/java/org/apache/commons/io/filefilter/DirectoryFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/DirectoryFileFilter.java
@@ -97,7 +97,7 @@ public class DirectoryFileFilter extends AbstractFileFilter implements Serializa
*/
@Override
public boolean accept(final File file) {
- return file.isDirectory();
+ return file != null && file.isDirectory();
}
/**
@@ -109,7 +109,7 @@ public class DirectoryFileFilter extends AbstractFileFilter implements Serializa
*/
@Override
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
- return toFileVisitResult(Files.isDirectory(file));
+ return toFileVisitResult(file != null && Files.isDirectory(file));
}
}
diff --git a/src/main/java/org/apache/commons/io/filefilter/EmptyFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/EmptyFileFilter.java
index 86686e5a..f5d23281 100644
--- a/src/main/java/org/apache/commons/io/filefilter/EmptyFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/EmptyFileFilter.java
@@ -104,6 +104,9 @@ public class EmptyFileFilter extends AbstractFileFilter implements Serializable
*/
@Override
public boolean accept(final File file) {
+ if (file == null) {
+ return true;
+ }
if (file.isDirectory()) {
final File[] files = file.listFiles();
return IOUtils.length(files) == 0;
@@ -120,6 +123,9 @@ public class EmptyFileFilter extends AbstractFileFilter implements Serializable
*/
@Override
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
+ if (file == null) {
+ return toFileVisitResult(true);
+ }
return get(() -> {
if (Files.isDirectory(file)) {
try (Stream<Path> stream = Files.list(file)) {
diff --git a/src/main/java/org/apache/commons/io/filefilter/FileFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/FileFileFilter.java
index 83c69cfa..d75c3971 100644
--- a/src/main/java/org/apache/commons/io/filefilter/FileFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/FileFileFilter.java
@@ -97,7 +97,7 @@ public class FileFileFilter extends AbstractFileFilter implements Serializable {
*/
@Override
public boolean accept(final File file) {
- return file.isFile();
+ return file != null && file.isFile();
}
/**
@@ -109,7 +109,7 @@ public class FileFileFilter extends AbstractFileFilter implements Serializable {
*/
@Override
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
- return toFileVisitResult(Files.isRegularFile(file));
+ return toFileVisitResult(file != null && Files.isRegularFile(file));
}
}
diff --git a/src/main/java/org/apache/commons/io/filefilter/HiddenFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/HiddenFileFilter.java
index 86ef0d31..c340c43c 100644
--- a/src/main/java/org/apache/commons/io/filefilter/HiddenFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/HiddenFileFilter.java
@@ -101,7 +101,7 @@ public class HiddenFileFilter extends AbstractFileFilter implements Serializable
*/
@Override
public boolean accept(final File file) {
- return file.isHidden();
+ return file == null || file.isHidden();
}
/**
@@ -114,7 +114,7 @@ public class HiddenFileFilter extends AbstractFileFilter implements Serializable
*/
@Override
public FileVisitResult accept(final Path file, final BasicFileAttributes attributes) {
- return get(() -> toFileVisitResult(Files.isHidden(file)));
+ return get(() -> toFileVisitResult(file == null || Files.isHidden(file)));
}
}
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 d9e058db..27569feb 100644
--- a/src/main/java/org/apache/commons/io/filefilter/NameFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/NameFileFilter.java
@@ -163,7 +163,7 @@ public class NameFileFilter extends AbstractFileFilter implements Serializable {
*/
@Override
public boolean accept(final File file) {
- return acceptBaseName(file.getName());
+ return file != null && acceptBaseName(file.getName());
}
/**
diff --git a/src/main/java/org/apache/commons/io/filefilter/PathMatcherFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/PathMatcherFileFilter.java
index 76b73eb3..aa796a1c 100644
--- a/src/main/java/org/apache/commons/io/filefilter/PathMatcherFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/PathMatcherFileFilter.java
@@ -44,6 +44,7 @@ public class PathMatcherFileFilter extends AbstractFileFilter {
public boolean accept(final File file) {
return file != null && matches(file.toPath());
}
+
@Override
public boolean matches(final Path path) {
return pathMatcher.matches(path);
diff --git a/src/main/java/org/apache/commons/io/filefilter/SizeFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/SizeFileFilter.java
index cdb8d9b7..8fd73282 100644
--- a/src/main/java/org/apache/commons/io/filefilter/SizeFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/SizeFileFilter.java
@@ -120,7 +120,7 @@ public class SizeFileFilter extends AbstractFileFilter implements Serializable {
*/
@Override
public boolean accept(final File file) {
- return accept(file.length());
+ return accept(file != null ? file.length() : 0);
}
private boolean accept(final long length) {
diff --git a/src/test/java/org/apache/commons/io/IOCaseTest.java b/src/test/java/org/apache/commons/io/IOCaseTest.java
index a30f5da2..f8d72d6f 100644
--- a/src/test/java/org/apache/commons/io/IOCaseTest.java
+++ b/src/test/java/org/apache/commons/io/IOCaseTest.java
@@ -143,9 +143,9 @@ public class IOCaseTest {
assertFalse(IOCase.SENSITIVE.checkEquals("", "ABC"));
assertTrue(IOCase.SENSITIVE.checkEquals("", ""));
- assertThrows(NullPointerException.class, () -> IOCase.SENSITIVE.checkEquals("ABC", null));
- assertThrows(NullPointerException.class, () -> IOCase.SENSITIVE.checkEquals(null, "ABC"));
- assertThrows(NullPointerException.class, () -> IOCase.SENSITIVE.checkEquals(null, null));
+ assertFalse(IOCase.SENSITIVE.checkEquals("ABC", null));
+ assertFalse(IOCase.SENSITIVE.checkEquals(null, "ABC"));
+ assertTrue(IOCase.SENSITIVE.checkEquals(null, null));
}
@Test
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 858c4a19..b6b12d9a 100644
--- a/src/test/java/org/apache/commons/io/filefilter/FileFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/FileFilterTest.java
@@ -205,10 +205,14 @@ public class FileFilterTest extends AbstractFilterTest {
}
assertTrue(executableFile.setExecutable(true));
assertFiltering(CanExecuteFileFilter.CAN_EXECUTE, executablePath.get(), true);
+ assertFiltering(CanExecuteFileFilter.CAN_EXECUTE, (Path) null, false);
assertFiltering(CanExecuteFileFilter.CAN_EXECUTE, executableFile, true);
+ assertFiltering(CanExecuteFileFilter.CAN_EXECUTE, (File) null, false);
executableFile.setExecutable(false);
assertFiltering(CanExecuteFileFilter.CANNOT_EXECUTE, executablePath.get(), false);
+ assertFiltering(CanExecuteFileFilter.CANNOT_EXECUTE, (Path) null, false);
assertFiltering(CanExecuteFileFilter.CANNOT_EXECUTE, executableFile, false);
+ assertFiltering(CanExecuteFileFilter.CANNOT_EXECUTE, (File) null, false);
}
}
@@ -224,11 +228,17 @@ public class FileFilterTest extends AbstractFilterTest {
}
assertTrue(readOnlyFile.setReadOnly());
assertFiltering(CanReadFileFilter.CAN_READ, readOnlyFile, true);
+ assertFiltering(CanReadFileFilter.CAN_READ, (File) null, false);
assertFiltering(CanReadFileFilter.CAN_READ, readOnlyPath, true);
+ assertFiltering(CanReadFileFilter.CAN_READ, (Path) null, false);
assertFiltering(CanReadFileFilter.CANNOT_READ, readOnlyFile, false);
+ assertFiltering(CanReadFileFilter.CANNOT_READ, (File) null, true);
assertFiltering(CanReadFileFilter.CANNOT_READ, readOnlyPath, false);
+ assertFiltering(CanReadFileFilter.CANNOT_READ, (Path) null, true);
assertFiltering(CanReadFileFilter.READ_ONLY, readOnlyFile, true);
+ assertFiltering(CanReadFileFilter.READ_ONLY, (File) null, false);
assertFiltering(CanReadFileFilter.READ_ONLY, readOnlyPath, true);
+ assertFiltering(CanReadFileFilter.READ_ONLY, (Path) null, false);
readOnlyFile.delete();
}
@@ -244,11 +254,15 @@ public class FileFilterTest extends AbstractFilterTest {
}
assertTrue(readOnlyFile.setReadOnly());
assertFiltering(CanWriteFileFilter.CAN_WRITE, temporaryFolder, true);
- assertFiltering(CanWriteFileFilter.CANNOT_WRITE, temporaryFolder, false);
assertFiltering(CanWriteFileFilter.CAN_WRITE, readOnlyFile, false);
+ assertFiltering(CanWriteFileFilter.CAN_WRITE, (File) null, false);
assertFiltering(CanWriteFileFilter.CAN_WRITE, readOnlyPath, false);
+ assertFiltering(CanWriteFileFilter.CAN_WRITE, (Path) null, false);
+ assertFiltering(CanWriteFileFilter.CANNOT_WRITE, temporaryFolder, false);
assertFiltering(CanWriteFileFilter.CANNOT_WRITE, readOnlyFile, true);
assertFiltering(CanWriteFileFilter.CANNOT_WRITE, readOnlyPath, true);
+ assertFiltering(CanWriteFileFilter.CANNOT_WRITE, (File) null, true);
+ assertFiltering(CanWriteFileFilter.CANNOT_WRITE, (Path) null, true);
readOnlyFile.delete();
}
@@ -376,6 +390,9 @@ public class FileFilterTest extends AbstractFilterTest {
assertFiltering(filter, new File("LICENSE.txt"), false);
assertFiltering(filter, new File("LICENSE.txt").toPath(), false);
+ assertFiltering(filter, (File) null, false);
+ assertFiltering(filter, (Path) null, false);
+
assertSame(DirectoryFileFilter.DIRECTORY, DirectoryFileFilter.INSTANCE);
}
@@ -388,8 +405,12 @@ public class FileFilterTest extends AbstractFilterTest {
emptyDirFile.mkdirs();
assertFiltering(EmptyFileFilter.EMPTY, emptyDirFile, true);
assertFiltering(EmptyFileFilter.EMPTY, emptyDirPath, true);
+ assertFiltering(EmptyFileFilter.EMPTY, (File) null, true);
+ assertFiltering(EmptyFileFilter.EMPTY, (Path) null, true);
assertFiltering(EmptyFileFilter.NOT_EMPTY, emptyDirFile, false);
assertFiltering(EmptyFileFilter.NOT_EMPTY, emptyDirPath, false);
+ assertFiltering(EmptyFileFilter.NOT_EMPTY, (File) null, false);
+ assertFiltering(EmptyFileFilter.NOT_EMPTY, (Path) null, false);
// Empty File
final File emptyFile = new File(emptyDirFile, "empty-file.txt");
@@ -479,6 +500,7 @@ public class FileFilterTest extends AbstractFilterTest {
// XXX: This test presumes the current working dir is the base dir of the source checkout.
final IOFileFilter filter = FileFileFilter.INSTANCE;
+ assertFiltering(filter, (File) null, false);
assertFiltering(filter, new File("src/"), false);
assertFiltering(filter, new File("src/").toPath(), false);
assertFiltering(filter, new File("src/java/"), false);
@@ -713,8 +735,10 @@ public class FileFilterTest extends AbstractFilterTest {
final Path path = temporaryFolder.toPath();
assertFiltering(HiddenFileFilter.HIDDEN, temporaryFolder, false);
assertFiltering(HiddenFileFilter.HIDDEN, path, false);
+ assertFiltering(HiddenFileFilter.HIDDEN, (Path) null, true);
assertFiltering(HiddenFileFilter.VISIBLE, temporaryFolder, true);
assertFiltering(HiddenFileFilter.VISIBLE, path, true);
+ assertFiltering(HiddenFileFilter.VISIBLE, (Path) null, false);
}
@Test
@@ -1037,7 +1061,10 @@ public class FileFilterTest extends AbstractFilterTest {
@Test
public void testNameFilter() throws IOException {
- assertFooBarFileFiltering(new NameFileFilter("foo", "bar"));
+ final NameFileFilter filter = new NameFileFilter("foo", "bar");
+ assertFooBarFileFiltering(filter);
+ assertFiltering(filter, (File) null, false);
+ assertFiltering(filter, (Path) null, false);
}
@Test
(commons-io) 01/02: More tests and NPE-proofing
Posted by gg...@apache.org.
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
commit 7d44bb77c7a541f51b8c784c006b36f8d6b206e6
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Dec 21 18:06:16 2023 -0500
More tests and NPE-proofing
---
src/main/java/org/apache/commons/io/file/PathUtils.java | 2 +-
src/test/java/org/apache/commons/io/file/PathUtilsTest.java | 11 +++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
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 9f0dddb1..29af5800 100644
--- a/src/main/java/org/apache/commons/io/file/PathUtils.java
+++ b/src/main/java/org/apache/commons/io/file/PathUtils.java
@@ -878,7 +878,7 @@ public final class PathUtils {
* @since 2.16.0
*/
public static <R> R getFileName(final Path path, Function<Path, R> function) {
- final Path fileName = path.getFileName();
+ final Path fileName = path != null ? path.getFileName() : null;
return fileName != null ? function.apply(fileName) : null;
}
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 d46f5185..c27c39de 100644
--- a/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
+++ b/src/test/java/org/apache/commons/io/file/PathUtilsTest.java
@@ -246,6 +246,17 @@ public class PathUtilsTest extends AbstractTempDirTest {
assertEquals(symlinkedDir, PathUtils.createParentDirectories(symlinkedDir.resolve("child")));
}
+ @Test
+ public void testGetFileName() {
+ assertNull(PathUtils.getFileName(null, null));
+ assertNull(PathUtils.getFileName(null, Path::toString));
+ assertNull(PathUtils.getFileName(Paths.get("/"), Path::toString));
+ assertNull(PathUtils.getFileName(Paths.get("/"), Path::toString));
+ assertEquals("", PathUtils.getFileName(Paths.get(""), Path::toString));
+ assertEquals("a", PathUtils.getFileName(Paths.get("a"), Path::toString));
+ assertEquals("a", PathUtils.getFileName(Paths.get("p", "a"), Path::toString));
+ }
+
@Test
public void testGetFileNameString() {
assertNull(PathUtils.getFileNameString(Paths.get("/")));