You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Niall Pemberton (JIRA)" <ji...@apache.org> on 2007/10/13 03:57:51 UTC

[jira] Issue Comment Edited: (IO-66) [IO] FilenameFilter that uses regular expressions (upload)

    [ https://issues.apache.org/jira/browse/IO-66?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12534426 ] 

niallp edited comment on IO-66 at 10/12/07 6:56 PM:
-------------------------------------------------------------

The regular expression filter implementation from IO-74 has been implemented - see:

http://svn.apache.org/viewvc/commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFileFilter.java?view=log

      was (Author: niallp):
    The regular expression filter implementation from IO-74 has been implemented - see:

http://svn.apache.org/viewvc/commons/proper/io/trunk/src/java/org/apache/commons/io/filefilter/RegexFilter.java?view=log
  
> [IO] FilenameFilter that uses regular expressions (upload)
> ----------------------------------------------------------
>
>                 Key: IO-66
>                 URL: https://issues.apache.org/jira/browse/IO-66
>             Project: Commons IO
>          Issue Type: Improvement
>          Components: Filters
>         Environment: Operating System: Windows XP
> Platform: All
>            Reporter: analogue
>            Priority: Minor
>             Fix For: 1.4
>
>
> I was in need of a FilenameFilter that observed case-sensetivity and couldn't
> find anything in the existing commons-io library to meet this requirement. So,
> I've thrown together RegexFileFilter and an accompanying unit test to fill the
> void. Please add/apply to commons-io as necessary.
> -sp
> I don't see a way to attach files so heres the cut-n-paste:
> ================================================================================
> /*
>  * Copyright 2002-2004 The Apache Software Foundation.
>  * 
>  * Licensed 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.io.IOException;
> import org.apache.commons.io.filefilter.AbstractFileFilter;
> import org.apache.regexp.RE;
> import org.apache.regexp.RESyntaxException;
> /**
>  * Filters files based on a regular expression that is matched against the 
>  * entire filename (including drive, path, and name). Of particular note about
>  * this filter is the ability to express case-sensetivity. 
>  *  
>  * <p>
>  * For example, to retrieve and print all files that contain the string
>  * <code>"xyz"</code> in the current directory, the regular expression 
>  * <code>".*xyz.*"</code> can be used:
>  *
>  * <pre>
>  * File dir = new File(".");
>  * String[] files = dir.list(new RegexFileFilter(".*xyz.*", true));
>  * for (int i = 0; i &lt; files.length; i++) {
>  *     System.out.println(files[i]);
>  * }
>  * </pre>
>  * 
>  * To match using case-insensetivity, 
>  * <code>new RegexFileFilter(".*xyz.*", false)</code> would be appropriate.
>  * 
>  * @author Semir Patel
>  */
> public class RegexFileFilter extends AbstractFileFilter {
>     
>     //--------------------------------------------------------------------------
>     // Fields
>     //--------------------------------------------------------------------------
>     
>     /** 
>      * Regular expression matcher. 
>      */
>     private RE regExp;
>     
>     //--------------------------------------------------------------------------
>     // Constructors
>     //--------------------------------------------------------------------------
>     
>     /**
>      * Creates a file filter that applies a regular expression to the entire
>      * path + name of a file's absolute location.
>      * 
>      * @param regExp Regular expression to match.
>      * @param matchCase Set to true to match using case sensetivity, false 
>      *        otherwise.
>      * @throws RESyntaxException if the regular expression is invalid.
>      */
>     public RegexFileFilter(String regExp, boolean matchCase)
>         throws RESyntaxException {
>         
>         this.regExp = new RE(regExp, 
>             matchCase ? RE.MATCH_NORMAL: RE.MATCH_CASEINDEPENDENT);        
>     }
>     //--------------------------------------------------------------------------
>     // Overrides AbstractFileFilter
>     //--------------------------------------------------------------------------
>     
>     /**
>      * Accepts by matching the filename against a regular expression.
>      * 
>      * @throws RuntimeException if an IOException occurs.
>      * @see org.apache.commons.io.filefilter.AbstractFileFilter#accept(
>      *      java.io.File)
>      */
>     public boolean accept(File file) {
>         
>         try {
>             return regExp.match(file.getCanonicalPath());
>         }
>         catch (IOException e) {
>             
>             // TODO: Follow commons-io existing practice...
>             throw new RuntimeException(e);
>         }
>     }
> }
> ==========================================================================
> /*
>  * Copyright 2002-2004 The Apache Software Foundation.
>  * 
>  * Licensed 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 junit.framework.TestCase;
> import junit.textui.TestRunner;
> import org.apache.commons.io.FileUtils;
> import org.apache.regexp.RESyntaxException;
> /**
>  * Unit test for {@link RegexFileFilterTest}.
>  * 
>  * @author Semir Patel
>  */
> public class RegexFileFilterTest extends TestCase {
>     
>     //--------------------------------------------------------------------------
>     // Constants
>     //--------------------------------------------------------------------------
>     /**
>      * Temporary file names that unit tests will use for verification.
>      */
>     private static final String[] FILENAMES = new String[] {
>         "EVENT.java",
>     };
>     //--------------------------------------------------------------------------
>     // Fields
>     //--------------------------------------------------------------------------
>     
>     /** 
>      * Test directory for filtering files. 
>      */
>     private File testDir;
>     
>     //--------------------------------------------------------------------------
>     // Main
>     //--------------------------------------------------------------------------
>     
>     /** 
>      * Entrypoint.
>      * 
>      * @param args None recognized.
>      */
>     public static void main(String[] args)
>     {
>         TestRunner.run(RegexFileFilterTest.class);
>     }
>     //--------------------------------------------------------------------------
>     // Overrides TestCase
>     //--------------------------------------------------------------------------
>     
>     /** 
>      * Create a temporary directory with files to use for testing.
>      */
>     protected void setUp() throws Exception {
>         
>         File tmpDir = new File(System.getProperty("java.io.tmpdir"));
>         testDir = File.createTempFile("temp", "", tmpDir);
>         testDir.delete();
>         
>         assertTrue(
>             "test dir creation failed for " + testDir.getCanonicalPath(), 
>             testDir.mkdirs()); 
>         
>         for (int i = 0; i < FILENAMES.length; i++)
>             FileUtils.writeStringToFile(
>                 new File(testDir, FILENAMES[i]), "testing" + i, "UTF-8");
>     }
>     
>     /**
>      * Clean up temporary directory.
>      */
>     protected void tearDown() throws Exception {
>         FileUtils.forceDelete(testDir);
>         super.tearDown();
>     }
>    
>     //--------------------------------------------------------------------------
>     // Case Insensetive 
>     //--------------------------------------------------------------------------
>     
>     public void testAccept_CaseInsensetive_NotFound() throws Exception {
>         IOFileFilter filter = new RegexFileFilter("bogus", false);
>         
>         String matches[] = testDir.list(filter);
>         assertEquals("No matches should have been found", 0, matches.length);
>     } 
>     
>     public void testAccept_CaseInsensetive_CaseMatch() throws Exception {
>         IOFileFilter filter = new RegexFileFilter("EVENT", false);
>         
>         String matches[] = testDir.list(filter);
>         assertEquals("One match should have been found", 1, matches.length);
>         assertEquals("One match should have been found", "EVENT.java", matches[0]);
>     } 
>     
>     public void testAccept_CaseInsensetive_CaseMismatch() throws Exception {
>         IOFileFilter filter = new RegexFileFilter("event", false);
>         
>         String matches[] = testDir.list(filter);
>         assertEquals("One match should have been found", 1, matches.length);
>         assertEquals("One match should have been found", "EVENT.java", matches[0]);
>     }
>     
>     //--------------------------------------------------------------------------
>     // Case Sensetive 
>     //--------------------------------------------------------------------------
>     
>     public void testAccept_CaseSensetive_NotFound() throws Exception {
>         IOFileFilter filter = new RegexFileFilter("bogus", true);
>         
>         String matches[] = testDir.list(filter);
>         assertEquals("No matches should have been found", 0, matches.length);
>     } 
>     
>     public void testAccept_CaseSensetive_ExactMatch() throws Exception {
>         IOFileFilter filter = new RegexFileFilter("EVENT", true);
>         
>         String matches[] = testDir.list(filter);
>         assertEquals("One match should have been found", 1, matches.length);
>         assertEquals("One match should have been found", "EVENT.java", matches[0]);
>     } 
>     
>     public void testAccept_CaseSensetive_CaseMismatch() throws Exception {
>         IOFileFilter filter = new RegexFileFilter("event", true);
>         
>         String matches[] = testDir.list(filter);
>         assertEquals("No matches should have been found", 0, matches.length);
>     } 
>     
>     //--------------------------------------------------------------------------
>     // Negative Unit Tests
>     //--------------------------------------------------------------------------
>     
>     /**
>      * Make sure constructor blows up on invalid regular expressions.
>      */
>     public void testConstructor_Invalid_RegExp() {
>         
>         try {
>             RegexFileFilter filter = new RegexFileFilter("*", true);
>             fail("Expected exception on invalid regular expression");
>         }
>         catch (RESyntaxException rese) {
>             // Success
>         }
>     }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.