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 <gardgreg...@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", "")); + } }