Skip to content

Commit d42b928

Browse files
author
Gary Gregory
committed
[IO-727] FilenameUtils directoryContains() should handle files with the
same prefix #217. Apply a modified PR #217 from trungPa to resolve conflicts.
1 parent a873e46 commit d42b928

4 files changed

Lines changed: 43 additions & 6 deletions

File tree

src/changes/changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ The <action> type attribute can be add,update,fix,remove.
5959
<action dev="ggregory" type="fix" due-to="Davide Angelocola">
6060
Fix usage of assertNotNull #269.
6161
</action>
62+
<action issue="IO-727" dev="ggregory" type="fix" due-to="trungPa, Gary Gregory">
63+
FilenameUtils directoryContains() should handle files with the same prefix #217.
64+
</action>
6265
<!-- ADD -->
6366
<action dev="ggregory" type="add" due-to="Gary Gregory">
6467
Add BrokenReader.INSTANCE.

src/main/java/org/apache/commons/io/FilenameUtils.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.Collection;
2424
import java.util.Deque;
2525
import java.util.List;
26-
import java.util.Objects;
2726
import java.util.regex.Matcher;
2827
import java.util.regex.Pattern;
2928

@@ -539,17 +538,22 @@ public static String concat(final String basePath, final String fullFileNameToAd
539538
* @see FileUtils#directoryContains(File, File)
540539
*/
541540
public static boolean directoryContains(final String canonicalParent, final String canonicalChild) {
542-
Objects.requireNonNull(canonicalParent, "canonicalParent");
543-
544-
if (canonicalChild == null) {
541+
if (isEmpty(canonicalParent) || isEmpty(canonicalChild)) {
545542
return false;
546543
}
547544

548545
if (IOCase.SYSTEM.checkEquals(canonicalParent, canonicalChild)) {
549546
return false;
550547
}
551548

552-
return IOCase.SYSTEM.checkStartsWith(canonicalChild, canonicalParent);
549+
final char separator = canonicalParent.charAt(0) == UNIX_SEPARATOR ? UNIX_SEPARATOR : WINDOWS_SEPARATOR;
550+
final String parentWithEndSeparator = canonicalParent.charAt(canonicalParent.length() - 1) == separator ? canonicalParent : canonicalParent + separator;
551+
552+
return IOCase.SYSTEM.checkStartsWith(canonicalChild, parentWithEndSeparator);
553+
}
554+
555+
private static boolean isEmpty(final String string) {
556+
return string == null || string.isEmpty();
553557
}
554558

555559
/**
@@ -1235,7 +1239,7 @@ public static boolean isExtension(final String fileName, final String extension)
12351239
}
12361240
requireNonNullChars(fileName);
12371241

1238-
if (extension == null || extension.isEmpty()) {
1242+
if (isEmpty(extension)) {
12391243
return indexOfExtension(fileName) == NOT_FOUND;
12401244
}
12411245
final String fileExt = getExtension(fileName);

src/test/java/org/apache/commons/io/FileUtilsDirectoryContainsTestCase.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,19 @@ public void testIO466() throws IOException {
139139
assertFalse(FileUtils.directoryContains(directory1, fooFile));
140140
}
141141

142+
@Test
143+
public void testFileHavingSamePrefixBug() throws IOException {
144+
final File foo = new File(top, "foo");
145+
final File foobar = new File(top, "foobar");
146+
final File fooTxt = new File(top, "foo.txt");
147+
foo.mkdir();
148+
foobar.mkdir();
149+
FileUtils.touch(fooTxt);
150+
151+
assertFalse(FileUtils.directoryContains(foo, foobar));
152+
assertFalse(FileUtils.directoryContains(foo, fooTxt));
153+
}
154+
142155
@Test
143156
public void testFileDoesNotExist() throws IOException {
144157
assertFalse(FileUtils.directoryContains(top, null));

src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,4 +1184,21 @@ public void testIsExtensionCollection() {
11841184
assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT"))));
11851185
assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT", "RTF"))));
11861186
}
1187+
1188+
//-----------------------------------------------------------------------
1189+
@Test
1190+
public void testDirectoryContains() throws IOException {
1191+
assertTrue(FilenameUtils.directoryContains("/foo", "/foo/bar"));
1192+
assertTrue(FilenameUtils.directoryContains("/foo/", "/foo/bar"));
1193+
assertTrue(FilenameUtils.directoryContains("C:\\foo", "C:\\foo\\bar"));
1194+
assertTrue(FilenameUtils.directoryContains("C:\\foo\\", "C:\\foo\\bar"));
1195+
1196+
assertFalse(FilenameUtils.directoryContains("/foo", "/foo"));
1197+
assertFalse(FilenameUtils.directoryContains("/foo", "/foobar"));
1198+
assertFalse(FilenameUtils.directoryContains("C:\\foo", "C:\\foobar"));
1199+
assertFalse(FilenameUtils.directoryContains("/foo", null));
1200+
assertFalse(FilenameUtils.directoryContains("", ""));
1201+
assertFalse(FilenameUtils.directoryContains("", "/foo"));
1202+
assertFalse(FilenameUtils.directoryContains("/foo", ""));
1203+
}
11871204
}

0 commit comments

Comments
 (0)