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 2021/09/03 18:18:53 UTC
[commons-io] 03/03: [IO-727] FilenameUtils directoryContains()
should handle files with the same prefix #217.
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 d42b9286eb7a534f1b2b6243858ff7ef6fcac14c
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Sep 3 14:18:47 2021 -0400
[IO-727] FilenameUtils directoryContains() should handle files with the
same prefix #217.
Apply a modified PR #217 from trungPa to resolve conflicts.
---
src/changes/changes.xml | 3 +++
src/main/java/org/apache/commons/io/FilenameUtils.java | 16 ++++++++++------
.../commons/io/FileUtilsDirectoryContainsTestCase.java | 13 +++++++++++++
.../org/apache/commons/io/FilenameUtilsTestCase.java | 17 +++++++++++++++++
4 files changed, 43 insertions(+), 6 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 850dfdd..0ed1e69 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -59,6 +59,9 @@ The <action> type attribute can be add,update,fix,remove.
<action dev="ggregory" type="fix" due-to="Davide Angelocola">
Fix usage of assertNotNull #269.
</action>
+ <action issue="IO-727" dev="ggregory" type="fix" due-to="trungPa, Gary Gregory">
+ FilenameUtils directoryContains() should handle files with the same prefix #217.
+ </action>
<!-- ADD -->
<action dev="ggregory" type="add" due-to="Gary Gregory">
Add BrokenReader.INSTANCE.
diff --git a/src/main/java/org/apache/commons/io/FilenameUtils.java b/src/main/java/org/apache/commons/io/FilenameUtils.java
index b577748..6edb92c 100644
--- a/src/main/java/org/apache/commons/io/FilenameUtils.java
+++ b/src/main/java/org/apache/commons/io/FilenameUtils.java
@@ -23,7 +23,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Deque;
import java.util.List;
-import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -539,9 +538,7 @@ public class FilenameUtils {
* @see FileUtils#directoryContains(File, File)
*/
public static boolean directoryContains(final String canonicalParent, final String canonicalChild) {
- Objects.requireNonNull(canonicalParent, "canonicalParent");
-
- if (canonicalChild == null) {
+ if (isEmpty(canonicalParent) || isEmpty(canonicalChild)) {
return false;
}
@@ -549,7 +546,14 @@ public class FilenameUtils {
return false;
}
- return IOCase.SYSTEM.checkStartsWith(canonicalChild, canonicalParent);
+ final char separator = canonicalParent.charAt(0) == UNIX_SEPARATOR ? UNIX_SEPARATOR : WINDOWS_SEPARATOR;
+ final String parentWithEndSeparator = canonicalParent.charAt(canonicalParent.length() - 1) == separator ? canonicalParent : canonicalParent + separator;
+
+ return IOCase.SYSTEM.checkStartsWith(canonicalChild, parentWithEndSeparator);
+ }
+
+ private static boolean isEmpty(final String string) {
+ return string == null || string.isEmpty();
}
/**
@@ -1235,7 +1239,7 @@ public class FilenameUtils {
}
requireNonNullChars(fileName);
- if (extension == null || extension.isEmpty()) {
+ if (isEmpty(extension)) {
return indexOfExtension(fileName) == NOT_FOUND;
}
final String fileExt = getExtension(fileName);
diff --git a/src/test/java/org/apache/commons/io/FileUtilsDirectoryContainsTestCase.java b/src/test/java/org/apache/commons/io/FileUtilsDirectoryContainsTestCase.java
index 6ac3f51..89a320e 100644
--- a/src/test/java/org/apache/commons/io/FileUtilsDirectoryContainsTestCase.java
+++ b/src/test/java/org/apache/commons/io/FileUtilsDirectoryContainsTestCase.java
@@ -140,6 +140,19 @@ public class FileUtilsDirectoryContainsTestCase {
}
@Test
+ public void testFileHavingSamePrefixBug() throws IOException {
+ final File foo = new File(top, "foo");
+ final File foobar = new File(top, "foobar");
+ final File fooTxt = new File(top, "foo.txt");
+ foo.mkdir();
+ foobar.mkdir();
+ FileUtils.touch(fooTxt);
+
+ assertFalse(FileUtils.directoryContains(foo, foobar));
+ assertFalse(FileUtils.directoryContains(foo, fooTxt));
+ }
+
+ @Test
public void testFileDoesNotExist() throws IOException {
assertFalse(FileUtils.directoryContains(top, null));
final File file = new File("DOESNOTEXIST");
diff --git a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
index c0790b2..fc39d66 100644
--- a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
+++ b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
@@ -1184,4 +1184,21 @@ public class FilenameUtilsTestCase {
assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT"))));
assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT", "RTF"))));
}
+
+ //-----------------------------------------------------------------------
+ @Test
+ public void testDirectoryContains() throws IOException {
+ assertTrue(FilenameUtils.directoryContains("/foo", "/foo/bar"));
+ assertTrue(FilenameUtils.directoryContains("/foo/", "/foo/bar"));
+ assertTrue(FilenameUtils.directoryContains("C:\\foo", "C:\\foo\\bar"));
+ assertTrue(FilenameUtils.directoryContains("C:\\foo\\", "C:\\foo\\bar"));
+
+ assertFalse(FilenameUtils.directoryContains("/foo", "/foo"));
+ assertFalse(FilenameUtils.directoryContains("/foo", "/foobar"));
+ assertFalse(FilenameUtils.directoryContains("C:\\foo", "C:\\foobar"));
+ assertFalse(FilenameUtils.directoryContains("/foo", null));
+ assertFalse(FilenameUtils.directoryContains("", ""));
+ assertFalse(FilenameUtils.directoryContains("", "/foo"));
+ assertFalse(FilenameUtils.directoryContains("/foo", ""));
+ }
}