You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ni...@apache.org on 2007/10/12 22:41:11 UTC

svn commit: r584263 - in /commons/proper/io/trunk/src: java/org/apache/commons/io/filefilter/RegexFilter.java test/org/apache/commons/io/filefilter/FileFilterTestCase.java

Author: niallp
Date: Fri Oct 12 13:41:09 2007
New Revision: 584263

URL: http://svn.apache.org/viewvc?rev=584263&view=rev
Log:
IO-74 - add new Regular Expression file IOFileFilter implementation - thanks to Oliver Siegmar for the patch

Added:
    commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java   (with props)
Modified:
    commons/proper/io/trunk/src/test/org/apache/commons/io/filefilter/FileFilterTestCase.java

Added: commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java?rev=584263&view=auto
==============================================================================
--- commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java (added)
+++ commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java Fri Oct 12 13:41:09 2007
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.io.filefilter;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Filters files using supplied regular expression(s).
+ * <p/>
+ * See java.util.regex.Pattern for regex matching rules
+ * <p/>
+ *
+ * <p/>
+ * e.g.
+ * <pre>
+ * File dir = new File(".");
+ * FileFilter fileFilter = new RegexFilter("^.*[tT]est(-\\d+)?\\.java$");
+ * File[] files = dir.listFiles(fileFilter);
+ * for (int i = 0; i < files.length; i++) {
+ *   System.out.println(files[i]);
+ * }
+ * </pre>
+ *
+ * @author Oliver Siegmar
+ * @version $Revision$
+ * @since Commons IO 1.4
+ */
+public class RegexFilter extends AbstractFileFilter {
+
+    /** The regular expression patterns that will be used to match filenames */
+    private Pattern[] patterns = null;
+
+    /**
+     * Construct a new regular expression filter for a single regular expression
+     *
+     * @param pattern regular string expression to match
+     * @throws IllegalArgumentException if the pattern is null
+     */
+    public RegexFilter(String pattern) {
+        if (pattern == null) {
+            throw new java.lang.IllegalArgumentException();
+        }
+
+        patterns = new Pattern[] { Pattern.compile(pattern) };
+    }
+
+    /**
+     * Construct a new regular expression filter for a single regular expression
+     *
+     * @param pattern regular expression to match
+     * @throws IllegalArgumentException if the pattern is null
+     */
+    public RegexFilter(Pattern pattern) {
+        if (pattern == null) {
+            throw new java.lang.IllegalArgumentException();
+        }
+
+        patterns = new Pattern[] { pattern };
+    }
+
+    /**
+     * Construct a new regular expression filter for an array of regular expressions
+     *
+     * @param patterns regular expression strings to match
+     * @throws IllegalArgumentException if the pattern array is null
+     */
+    public RegexFilter(String[] patterns) {
+        if (patterns == null) {
+            throw new java.lang.IllegalArgumentException();
+        }
+
+        this.patterns = new Pattern[patterns.length];
+        for (int i = 0; i < patterns.length; i++) {
+            this.patterns[i] = Pattern.compile(patterns[i]);
+        }
+    }
+
+    /**
+     * Construct a new regular expression filter for an array of regular expressions
+     *
+     * @param patterns regular expression to match
+     * @throws IllegalArgumentException if the pattern array is null
+     */
+    public RegexFilter(Pattern[] patterns) {
+        if (patterns == null) {
+            throw new java.lang.IllegalArgumentException();
+        }
+
+        this.patterns = patterns;
+    }
+
+    /**
+     * Construct a new regular expression filter for a list of regular expressions
+     *
+     * @param patterns list of regular expressions (either list of type
+     *                 <code>java.lang.String</code> or of type
+     *                 <code>java.util.regex.Pattern</code>) to match
+     * @throws IllegalArgumentException if the pattern list is null
+     * @throws ClassCastException if the list does not contain Strings
+     */
+    public RegexFilter(List patterns) {
+        if (patterns == null) {
+            throw new java.lang.IllegalArgumentException();
+        }
+
+        if (patterns.size() == 0)
+            return;
+
+        this.patterns = new Pattern[patterns.size()];
+
+        int i = 0;
+        for (Iterator it = patterns.iterator(); it.hasNext(); i++) {
+            Object pattern = it.next();
+            this.patterns[i] = (pattern instanceof Pattern)
+                ? (Pattern)pattern
+                : Pattern.compile(pattern.toString());
+        }
+    }
+
+    /**
+     * Checks to see if the filename matches one of the regular expressions.
+     *
+     * @param dir   the file directory
+     * @param name  the filename
+     * @return true if the filename matches one of the regular expressions
+     */
+    public boolean accept(File dir, String name) {
+        if (dir != null && new File(dir, name).isDirectory()) {
+            return false;
+        }
+
+        for (int i = 0; i < patterns.length; i++) {
+            if (patterns[i].matcher(name).matches()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks to see if the filename matches one of the regular expressions.
+     *
+     * @param file the file to check
+     * @return true if the filename matches one of the regular expressions
+     */
+    public boolean accept(File file) {
+        if (file.isDirectory()) {
+            return false;
+        }
+
+        for (int i = 0; i < patterns.length; i++) {
+            if (patterns[i].matcher(file.getName()).matches()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+}

Propchange: commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: commons/proper/io/trunk/src/test/org/apache/commons/io/filefilter/FileFilterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/org/apache/commons/io/filefilter/FileFilterTestCase.java?rev=584263&r1=584262&r2=584263&view=diff
==============================================================================
--- commons/proper/io/trunk/src/test/org/apache/commons/io/filefilter/FileFilterTestCase.java (original)
+++ commons/proper/io/trunk/src/test/org/apache/commons/io/filefilter/FileFilterTestCase.java Fri Oct 12 13:41:09 2007
@@ -23,6 +23,7 @@
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import junit.framework.TestSuite;
 import junit.textui.TestRunner;
@@ -819,6 +820,75 @@
         assertFiltering(EmptyFileFilter.EMPTY, notEmptyFile, false);
         assertFiltering(EmptyFileFilter.NOT_EMPTY, notEmptyFile, true);
         FileUtils.forceDelete(emptyDir);
+    }
+
+    public void testRegex() throws Exception {
+        IOFileFilter filter = new RegexFilter("^.*[tT]est(-\\d+)?\\.java$");
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test-10.java"), true);
+        assertFiltering(filter, new File("test-.java"), false);
+
+        filter = new RegexFilter("^[Tt]est.java$");
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test.java"), true);
+        assertFiltering(filter, new File("tEST.java"), false);
+
+        filter = new RegexFilter(Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE));
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test.java"), true);
+        assertFiltering(filter, new File("tEST.java"), true);
+
+        filter = new RegexFilter(new String[] { "^Test.java$", "^test.java$" });
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test.java"), true);
+        assertFiltering(filter, new File("tEST.java"), false);
+
+        filter = new RegexFilter(new Pattern[] {
+            Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE), Pattern.compile("^test2.java$") }
+        );
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test.java"), true);
+        assertFiltering(filter, new File("tEST.java"), true);
+        assertFiltering(filter, new File("test2.java"), true);
+        assertFiltering(filter, new File("Test2.java"), false);
+
+        List filterList = Arrays.asList(new String[] { "^Test.java$", "^test.java$" });
+        filter = new RegexFilter(filterList);
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test.java"), true);
+        assertFiltering(filter, new File("tEST.java"), false);
+
+        filterList = Arrays.asList(new Pattern[] {
+            Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE), Pattern.compile("^test2.java$") }
+        );
+        filter = new RegexFilter(filterList);
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test.java"), true);
+        assertFiltering(filter, new File("tEST.java"), true);
+        assertFiltering(filter, new File("test2.java"), true);
+        assertFiltering(filter, new File("Test2.java"), false);
+
+        filterList = new ArrayList();
+        filterList.add(Pattern.compile("^test.java$", Pattern.CASE_INSENSITIVE));
+        filterList.add("^test2.java$");
+        filter = new RegexFilter(filterList);
+        assertFiltering(filter, new File("Test.java"), true);
+        assertFiltering(filter, new File("test.java"), true);
+        assertFiltering(filter, new File("tEST.java"), true);
+        assertFiltering(filter, new File("test2.java"), true);
+        assertFiltering(filter, new File("Test2.java"), false);
+
+        assertTrue(filter.accept(new File("Test.java")));
+        assertTrue(filter.accept(new File("test.java")));
+        assertTrue(filter.accept(new File("tEST.java")));
+        assertTrue(filter.accept(new File("test2.java")));
+        assertFalse(filter.accept(new File("Test2.java")));
+
+        assertTrue(filter.accept(new File("Test.java").getParentFile(), new File("Test.java").getName()));
+        assertTrue(filter.accept(new File("test.java").getParentFile(), new File("test.java").getName()));
+        assertTrue(filter.accept(new File("tEST.java").getParentFile(), new File("tEST.java").getName()));
+        assertTrue(filter.accept(new File("test2.java").getParentFile(), new File("test2.java").getName()));
+        assertFalse(filter.accept(new File("Test2.java").getParentFile(), new File("Test2.java").getName()));
     }
 
     //-----------------------------------------------------------------------