Uploaded image for project: 'Commons IO'
  1. Commons IO
  2. IO-66

[IO] FilenameFilter that uses regular expressions (upload)

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Minor
    • Resolution: Duplicate
    • None
    • 1.4
    • Filters
    • None
    • Operating System: Windows XP
      Platform: All

    • 32761

    Description

      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 < 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 }

      }
      }

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              analogue analogue
              Votes:
              2 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: