Skip to content

Commit 2aaaa2a

Browse files
author
Niall Pemberton
committed
IO-74 - add new Regular Expression file IOFileFilter implementation - thanks to Oliver Siegmar for the patch
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/trunk@584263 13f79535-47bb-0310-9956-ffa450edef68
1 parent 9666d74 commit 2aaaa2a

2 files changed

Lines changed: 248 additions & 0 deletions

File tree

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.commons.io.filefilter;
18+
19+
import java.io.File;
20+
import java.util.Iterator;
21+
import java.util.List;
22+
import java.util.regex.Pattern;
23+
24+
/**
25+
* Filters files using supplied regular expression(s).
26+
* <p/>
27+
* See java.util.regex.Pattern for regex matching rules
28+
* <p/>
29+
*
30+
* <p/>
31+
* e.g.
32+
* <pre>
33+
* File dir = new File(".");
34+
* FileFilter fileFilter = new RegexFilter("^.*[tT]est(-\\d+)?\\.java$");
35+
* File[] files = dir.listFiles(fileFilter);
36+
* for (int i = 0; i < files.length; i++) {
37+
* System.out.println(files[i]);
38+
* }
39+
* </pre>
40+
*
41+
* @author Oliver Siegmar
42+
* @version $Revision$
43+
* @since Commons IO 1.4
44+
*/
45+
public class RegexFilter extends AbstractFileFilter {
46+
47+
/** The regular expression patterns that will be used to match filenames */
48+
private Pattern[] patterns = null;
49+
50+
/**
51+
* Construct a new regular expression filter for a single regular expression
52+
*
53+
* @param pattern regular string expression to match
54+
* @throws IllegalArgumentException if the pattern is null
55+
*/
56+
public RegexFilter(String pattern) {
57+
if (pattern == null) {
58+
throw new java.lang.IllegalArgumentException();
59+
}
60+
61+
patterns = new Pattern[] { Pattern.compile(pattern) };
62+
}
63+
64+
/**
65+
* Construct a new regular expression filter for a single regular expression
66+
*
67+
* @param pattern regular expression to match
68+
* @throws IllegalArgumentException if the pattern is null
69+
*/
70+
public RegexFilter(Pattern pattern) {
71+
if (pattern == null) {
72+
throw new java.lang.IllegalArgumentException();
73+
}
74+
75+
patterns = new Pattern[] { pattern };
76+
}
77+
78+
/**
79+
* Construct a new regular expression filter for an array of regular expressions
80+
*
81+
* @param patterns regular expression strings to match
82+
* @throws IllegalArgumentException if the pattern array is null
83+
*/
84+
public RegexFilter(String[] patterns) {
85+
if (patterns == null) {
86+
throw new java.lang.IllegalArgumentException();
87+
}
88+
89+
this.patterns = new Pattern[patterns.length];
90+
for (int i = 0; i < patterns.length; i++) {
91+
this.patterns[i] = Pattern.compile(patterns[i]);
92+
}
93+
}
94+
95+
/**
96+
* Construct a new regular expression filter for an array of regular expressions
97+
*
98+
* @param patterns regular expression to match
99+
* @throws IllegalArgumentException if the pattern array is null
100+
*/
101+
public RegexFilter(Pattern[] patterns) {
102+
if (patterns == null) {
103+
throw new java.lang.IllegalArgumentException();
104+
}
105+
106+
this.patterns = patterns;
107+
}
108+
109+
/**
110+
* Construct a new regular expression filter for a list of regular expressions
111+
*
112+
* @param patterns list of regular expressions (either list of type
113+
* <code>java.lang.String</code> or of type
114+
* <code>java.util.regex.Pattern</code>) to match
115+
* @throws IllegalArgumentException if the pattern list is null
116+
* @throws ClassCastException if the list does not contain Strings
117+
*/
118+
public RegexFilter(List patterns) {
119+
if (patterns == null) {
120+
throw new java.lang.IllegalArgumentException();
121+
}
122+
123+
if (patterns.size() == 0)
124+
return;
125+
126+
this.patterns = new Pattern[patterns.size()];
127+
128+
int i = 0;
129+
for (Iterator it = patterns.iterator(); it.hasNext(); i++) {
130+
Object pattern = it.next();
131+
this.patterns[i] = (pattern instanceof Pattern)
132+
? (Pattern)pattern
133+
: Pattern.compile(pattern.toString());
134+
}
135+
}
136+
137+
/**
138+
* Checks to see if the filename matches one of the regular expressions.
139+
*
140+
* @param dir the file directory
141+
* @param name the filename
142+
* @return true if the filename matches one of the regular expressions
143+
*/
144+
public boolean accept(File dir, String name) {
145+
if (dir != null && new File(dir, name).isDirectory()) {
146+
return false;
147+
}
148+
149+
for (int i = 0; i < patterns.length; i++) {
150+
if (patterns[i].matcher(name).matches()) {
151+
return true;
152+
}
153+
}
154+
155+
return false;
156+
}
157+
158+
/**
159+
* Checks to see if the filename matches one of the regular expressions.
160+
*
161+
* @param file the file to check
162+
* @return true if the filename matches one of the regular expressions
163+
*/
164+
public boolean accept(File file) {
165+
if (file.isDirectory()) {
166+
return false;
167+
}
168+
169+
for (int i = 0; i < patterns.length; i++) {
170+
if (patterns[i].matcher(file.getName()).matches()) {
171+
return true;
172+
}
173+
}
174+
175+
return false;
176+
}
177+
178+
}

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

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Arrays;
2424
import java.util.Date;
2525
import java.util.List;
26+
import java.util.regex.Pattern;
2627

2728
import junit.framework.TestSuite;
2829
import junit.textui.TestRunner;
@@ -821,6 +822,75 @@ public void testEmpty() throws Exception {
821822
FileUtils.forceDelete(emptyDir);
822823
}
823824

825+
public void testRegex() throws Exception {
826+
IOFileFilter filter = new RegexFilter("^.*[tT]est(-\\d+)?\\.java$");
827+
assertFiltering(filter, new File("Test.java"), true);
828+
assertFiltering(filter, new File("test-10.java"), true);
829+
assertFiltering(filter, new File("test-.java"), false);
830+
831+
filter = new RegexFilter("^[Tt]est.java$");
832+
assertFiltering(filter, new File("Test.java"), true);
833+
assertFiltering(filter, new File("test.java"), true);
834+
assertFiltering(filter, new File("tEST.java"), false);
835+
836+
filter = new RegexFilter(Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE));
837+
assertFiltering(filter, new File("Test.java"), true);
838+
assertFiltering(filter, new File("test.java"), true);
839+
assertFiltering(filter, new File("tEST.java"), true);
840+
841+
filter = new RegexFilter(new String[] { "^Test.java$", "^test.java$" });
842+
assertFiltering(filter, new File("Test.java"), true);
843+
assertFiltering(filter, new File("test.java"), true);
844+
assertFiltering(filter, new File("tEST.java"), false);
845+
846+
filter = new RegexFilter(new Pattern[] {
847+
Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE), Pattern.compile("^test2.java$") }
848+
);
849+
assertFiltering(filter, new File("Test.java"), true);
850+
assertFiltering(filter, new File("test.java"), true);
851+
assertFiltering(filter, new File("tEST.java"), true);
852+
assertFiltering(filter, new File("test2.java"), true);
853+
assertFiltering(filter, new File("Test2.java"), false);
854+
855+
List filterList = Arrays.asList(new String[] { "^Test.java$", "^test.java$" });
856+
filter = new RegexFilter(filterList);
857+
assertFiltering(filter, new File("Test.java"), true);
858+
assertFiltering(filter, new File("test.java"), true);
859+
assertFiltering(filter, new File("tEST.java"), false);
860+
861+
filterList = Arrays.asList(new Pattern[] {
862+
Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE), Pattern.compile("^test2.java$") }
863+
);
864+
filter = new RegexFilter(filterList);
865+
assertFiltering(filter, new File("Test.java"), true);
866+
assertFiltering(filter, new File("test.java"), true);
867+
assertFiltering(filter, new File("tEST.java"), true);
868+
assertFiltering(filter, new File("test2.java"), true);
869+
assertFiltering(filter, new File("Test2.java"), false);
870+
871+
filterList = new ArrayList();
872+
filterList.add(Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE));
873+
filterList.add("^test2.java$");
874+
filter = new RegexFilter(filterList);
875+
assertFiltering(filter, new File("Test.java"), true);
876+
assertFiltering(filter, new File("test.java"), true);
877+
assertFiltering(filter, new File("tEST.java"), true);
878+
assertFiltering(filter, new File("test2.java"), true);
879+
assertFiltering(filter, new File("Test2.java"), false);
880+
881+
assertTrue(filter.accept(new File("Test.java")));
882+
assertTrue(filter.accept(new File("test.java")));
883+
assertTrue(filter.accept(new File("tEST.java")));
884+
assertTrue(filter.accept(new File("test2.java")));
885+
assertFalse(filter.accept(new File("Test2.java")));
886+
887+
assertTrue(filter.accept(new File("Test.java").getParentFile(), new File("Test.java").getName()));
888+
assertTrue(filter.accept(new File("test.java").getParentFile(), new File("test.java").getName()));
889+
assertTrue(filter.accept(new File("tEST.java").getParentFile(), new File("tEST.java").getName()));
890+
assertTrue(filter.accept(new File("test2.java").getParentFile(), new File("test2.java").getName()));
891+
assertFalse(filter.accept(new File("Test2.java").getParentFile(), new File("Test2.java").getName()));
892+
}
893+
824894
//-----------------------------------------------------------------------
825895
public void testMakeDirectoryOnly() throws Exception {
826896
assertSame(DirectoryFileFilter.DIRECTORY, FileFilterUtils.makeDirectoryOnly(null));

0 commit comments

Comments
 (0)