Skip to content

Commit eff3910

Browse files
author
Stephen Colebourne
committed
Test and fix case sensitive wildcard filter
git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/io/trunk@418641 13f79535-47bb-0310-9956-ffa450edef68
1 parent 9b70114 commit eff3910

4 files changed

Lines changed: 121 additions & 4 deletions

File tree

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,8 @@ public static boolean wildcardMatch(String filename, String wildcardMatcher, IOC
11341134
if (caseSensitivity == null) {
11351135
caseSensitivity = IOCase.SENSITIVE;
11361136
}
1137+
filename = caseSensitivity.convertCase(filename);
1138+
wildcardMatcher = caseSensitivity.convertCase(wildcardMatcher);
11371139
String[] wcs = splitOnTokens(wildcardMatcher);
11381140
boolean anyChars = false;
11391141
int textIdx = 0;
@@ -1179,7 +1181,7 @@ public static boolean wildcardMatch(String filename, String wildcardMatcher, IOC
11791181
}
11801182
} else {
11811183
// matching from current position
1182-
if (!caseSensitivity.checkRegionMatches(filename, textIdx, wcs[wcsIdx])) {
1184+
if (!filename.startsWith(wcs[wcsIdx], textIdx)) {
11831185
// couldnt match token
11841186
break;
11851187
}

src/java/org/apache/commons/io/IOCase.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* class to compare filenames.
3232
*
3333
* @author Stephen Colebourne
34-
* @version $Id$
34+
* @version $Id: IOCase.java 417090 2006-06-25 23:18:33Z scolebourne $
3535
* @since Commons IO 1.3
3636
*/
3737
public final class IOCase implements Serializable {
@@ -189,6 +189,20 @@ public boolean checkRegionMatches(String str, int strStartIndex, String search)
189189
return str.regionMatches(!sensitive, strStartIndex, search, 0, search.length());
190190
}
191191

192+
/**
193+
* Converts the case of the input String to a standard format.
194+
* Subsequent operations can then use standard String methods.
195+
*
196+
* @param str the string to convert, null returns null
197+
* @return the lower-case version if case-insensitive
198+
*/
199+
String convertCase(String str) {
200+
if (str == null) {
201+
return null;
202+
}
203+
return sensitive ? str : str.toLowerCase();
204+
}
205+
192206
//-----------------------------------------------------------------------
193207
/**
194208
* Gets a string describing the sensitivity.

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,13 @@ public void testMatch() {
4545
assertEquals(true, FilenameUtils.wildcardMatch("Foo Bar Foo", "F*o Bar*"));
4646
assertEquals(true, FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er"));
4747
assertEquals(true, FilenameUtils.wildcardMatch("Foo", "*Foo"));
48+
assertEquals(true, FilenameUtils.wildcardMatch("BarFoo", "*Foo"));
4849
assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo*"));
50+
assertEquals(true, FilenameUtils.wildcardMatch("FooBar", "Foo*"));
51+
assertEquals(false, FilenameUtils.wildcardMatch("FOO", "*Foo"));
52+
assertEquals(false, FilenameUtils.wildcardMatch("BARFOO", "*Foo"));
4953
assertEquals(false, FilenameUtils.wildcardMatch("FOO", "Foo*"));
54+
assertEquals(false, FilenameUtils.wildcardMatch("FOOBAR", "Foo*"));
5055
}
5156

5257
public void testMatchOnSystem() {
@@ -63,8 +68,13 @@ public void testMatchOnSystem() {
6368
assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo Bar Foo", "F*o Bar*"));
6469
assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Adobe Acrobat Installer", "Ad*er"));
6570
assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo", "*Foo"));
71+
assertEquals(true, FilenameUtils.wildcardMatchOnSystem("BarFoo", "*Foo"));
6672
assertEquals(true, FilenameUtils.wildcardMatchOnSystem("Foo", "Foo*"));
73+
assertEquals(true, FilenameUtils.wildcardMatchOnSystem("FooBar", "Foo*"));
74+
assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "*Foo"));
75+
assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("BARFOO", "*Foo"));
6776
assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "Foo*"));
77+
assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOOBAR", "Foo*"));
6878
}
6979

7080
public void testMatchCaseSpecified() {
@@ -82,9 +92,23 @@ public void testMatchCaseSpecified() {
8292
assertEquals(true, FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er", IOCase.SENSITIVE));
8393
assertEquals(true, FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE));
8494
assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE));
95+
assertEquals(true, FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE));
96+
assertEquals(true, FilenameUtils.wildcardMatch("BarFoo", "*Foo", IOCase.SENSITIVE));
97+
assertEquals(true, FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE));
98+
assertEquals(true, FilenameUtils.wildcardMatch("FooBar", "Foo*", IOCase.SENSITIVE));
99+
100+
assertEquals(false, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SENSITIVE));
101+
assertEquals(false, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SENSITIVE));
85102
assertEquals(false, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SENSITIVE));
103+
assertEquals(false, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SENSITIVE));
104+
assertEquals(true, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.INSENSITIVE));
105+
assertEquals(true, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.INSENSITIVE));
86106
assertEquals(true, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.INSENSITIVE));
107+
assertEquals(true, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.INSENSITIVE));
108+
assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SYSTEM));
109+
assertEquals(WINDOWS, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SYSTEM));
87110
assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SYSTEM));
111+
assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SYSTEM));
88112
}
89113

90114
public void testSplitOnTokens() {

src/test/org/apache/commons/io/filefilter/FileFilterTestCase.java

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@
2727
import junit.textui.TestRunner;
2828

2929
import org.apache.commons.io.FileUtils;
30+
import org.apache.commons.io.IOCase;
3031
import org.apache.commons.io.testtools.FileBasedTestCase;
3132

3233
/**
3334
* Used to test FileFilterUtils.
3435
*/
3536
public class FileFilterTestCase extends FileBasedTestCase {
3637

38+
private static final boolean WINDOWS = (File.separatorChar == '\\');
39+
3740
public FileFilterTestCase(String name) {
3841
super(name);
3942
}
@@ -320,7 +323,7 @@ public void testOr() throws Exception {
320323
assertEquals(true, f.getFileFilters().isEmpty());
321324
}
322325

323-
public void testWildcard() throws Exception {
326+
public void testDeprecatedWildcard() throws Exception {
324327
IOFileFilter filter = new WildcardFilter("*.txt");
325328
List patternList = Arrays.asList( new String[] { "*.txt", "*.xml", "*.gif" } );
326329
IOFileFilter listFilter = new WildcardFilter( patternList );
@@ -380,7 +383,81 @@ public void testWildcard() throws Exception {
380383
// expected
381384
}
382385
}
383-
386+
387+
public void testWildcard() throws Exception {
388+
IOFileFilter filter = new WildcardFileFilter("*.txt");
389+
assertFiltering(filter, new File("log.txt"), true);
390+
assertFiltering(filter, new File("log.TXT"), false);
391+
392+
filter = new WildcardFileFilter("*.txt", IOCase.SENSITIVE);
393+
assertFiltering(filter, new File("log.txt"), true);
394+
assertFiltering(filter, new File("log.TXT"), false);
395+
396+
filter = new WildcardFileFilter("*.txt", IOCase.INSENSITIVE);
397+
assertFiltering(filter, new File("log.txt"), true);
398+
assertFiltering(filter, new File("log.TXT"), true);
399+
400+
filter = new WildcardFileFilter("*.txt", IOCase.SYSTEM);
401+
assertFiltering(filter, new File("log.txt"), true);
402+
assertFiltering(filter, new File("log.TXT"), WINDOWS);
403+
404+
filter = new WildcardFileFilter("*.txt", (IOCase) null);
405+
assertFiltering(filter, new File("log.txt"), true);
406+
assertFiltering(filter, new File("log.TXT"), false);
407+
408+
filter = new WildcardFileFilter(new String[] {"*.java", "*.class"});
409+
assertFiltering(filter, new File("Test.java"), true);
410+
assertFiltering(filter, new File("Test.class"), true);
411+
assertFiltering(filter, new File("Test.jsp"), false);
412+
413+
filter = new WildcardFileFilter(new String[] {"*.java", "*.class"}, IOCase.SENSITIVE);
414+
assertFiltering(filter, new File("Test.java"), true);
415+
assertFiltering(filter, new File("Test.JAVA"), false);
416+
417+
filter = new WildcardFileFilter(new String[] {"*.java", "*.class"}, IOCase.INSENSITIVE);
418+
assertFiltering(filter, new File("Test.java"), true);
419+
assertFiltering(filter, new File("Test.JAVA"), true);
420+
421+
filter = new WildcardFileFilter(new String[] {"*.java", "*.class"}, IOCase.SYSTEM);
422+
assertFiltering(filter, new File("Test.java"), true);
423+
assertFiltering(filter, new File("Test.JAVA"), WINDOWS);
424+
425+
filter = new WildcardFileFilter(new String[] {"*.java", "*.class"}, (IOCase) null);
426+
assertFiltering(filter, new File("Test.java"), true);
427+
assertFiltering(filter, new File("Test.JAVA"), false);
428+
429+
List patternList = Arrays.asList( new String[] { "*.txt", "*.xml", "*.gif" } );
430+
IOFileFilter listFilter = new WildcardFileFilter( patternList );
431+
assertFiltering(listFilter, new File("Test.txt"), true);
432+
assertFiltering(listFilter, new File("Test.xml"), true);
433+
assertFiltering(listFilter, new File("Test.gif"), true);
434+
assertFiltering(listFilter, new File("Test.bmp"), false);
435+
436+
File txtFile = new File( "test.txt" );
437+
File bmpFile = new File( "test.bmp" );
438+
File dir = new File( "src/java" );
439+
assertTrue( listFilter.accept( txtFile ) );
440+
assertTrue( !listFilter.accept( bmpFile ) );
441+
assertTrue( !listFilter.accept( dir ) );
442+
443+
assertTrue( listFilter.accept( txtFile.getParentFile(), txtFile.getName() ) );
444+
assertTrue( !listFilter.accept( bmpFile.getParentFile(), bmpFile.getName() ) );
445+
assertTrue( !listFilter.accept( dir.getParentFile(), dir.getName() ) );
446+
447+
try {
448+
new WildcardFileFilter((String) null);
449+
fail();
450+
} catch (IllegalArgumentException ex) {}
451+
try {
452+
new WildcardFileFilter((String[]) null);
453+
fail();
454+
} catch (IllegalArgumentException ex) {}
455+
try {
456+
new WildcardFileFilter((List) null);
457+
fail();
458+
} catch (IllegalArgumentException ex) {}
459+
}
460+
384461
public void testDelegateFileFilter() throws Exception {
385462
OrFileFilter orFilter = new OrFileFilter();
386463
File testFile = new File( "test.txt" );

0 commit comments

Comments
 (0)