Refactors DefaultFilters and DefaultFiltersTest to accept a filter that will return .class files.

Review at http://gwt-code-reviews.appspot.com/1336801


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9661 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/DefaultFilters.java b/dev/core/src/com/google/gwt/dev/resource/impl/DefaultFilters.java
index 48398e6..7cec82a 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/DefaultFilters.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/DefaultFilters.java
@@ -38,254 +38,92 @@
  */
 public class DefaultFilters {
 
-  private static final boolean IS_EXCLUDES = false;
-  private static final boolean IS_INCLUDES = true;
-  private static final boolean NOT_JAVA = false;
-  private static final boolean YES_JAVA = true;
+  /**
+   * Constants to represent the type of files that will be filtered.
+   */
+  public static enum FilterFileType {
+    RESOURCE_FILES(null), //
+    JAVA_FILES(".java"), //
+    CLASS_FILES(".class");
 
-  static ZipScanner getScanner(String[] includeList, String[] excludeList,
-      String[] skipList, boolean defaultExcludes, boolean caseSensitive) {
-    /*
-     * Hijack Ant's ZipScanner to handle inclusions/exclusions exactly as Ant
-     * does. We're only using its pattern-matching capabilities; the code path
-     * I'm using never tries to hit the filesystem in Ant 1.6.5.
-     */
-    ZipScanner scanner = new ZipScanner();
-    if (includeList.length > 0) {
-      scanner.setIncludes(includeList);
-    }
-    if (excludeList.length > 0 || skipList.length > 0) {
-      String[] excludeOrSkip = concatenate(excludeList, skipList);
-      scanner.setExcludes(excludeOrSkip);
-    }
-    if (defaultExcludes) {
-      scanner.addDefaultExcludes();
-    }
-    scanner.setCaseSensitive(caseSensitive);
-    scanner.init();
+    private final String suffix;
 
-    return scanner;
-  }
+    /* used when defaultExcludes is false */
+    private final ResourceFilter justThisFileTypeFilter = new ResourceFilter() {
+      public boolean allows(String path) {
+        return defaultAntIncludes.allows(path) && matches(path);
+      }
+    };    
+    
+    private final ResourceFilter defaultFilter = new ResourceFilter() {
 
-  private static String[] concatenate(String[] array1, String[] array2) {
-    String[] answer = new String[array1.length + array2.length];
-    int i = 0;
-    for (String entry : array1) {
-      answer[i++] = entry;
+      public boolean allows(String path) {
+        return getFileTypeFilter().allows(path)
+        && !defaultExcludesPattern.matcher(path).matches();
+      }
+    };
+    
+    private FilterFileType(String suffix) {
+      this.suffix = suffix;
     }
-    for (String entry : array2) {
-      answer[i++] = entry;
+    
+    public ResourceFilter getDefaultFilter() {
+      return defaultFilter;
     }
-    return answer;
+    
+    /* used when defaultExcludes is false */
+    public ResourceFilter getFileTypeFilter() {
+      return justThisFileTypeFilter;
+    }
+    
+    public String getSuffix() {
+      return suffix;
+    }
+
+    public boolean matches(String path) {
+      if (suffix == null) {
+        return true;
+      }
+      return path.endsWith(suffix);
+    }
   }
   
-  /* used when defaultExcludes is true */
-  final ResourceFilter defaultResourceFilter = new ResourceFilter() {
+  /*
+   * list copied from {@link org.apache.tools.ant.DirectoryScanner}
+   */
+  private static final String DEFAULT_EXCLUDES[] = new String[]{
+  // Miscellaneous typical temporary files
+      "**/*~", "**/#*#", "**/.#*", "**/%*%", "**/._*",
 
-    public boolean allows(String path) {
-      return defaultAntIncludes.allows(path)
-          && !defaultExcludesPattern.matcher(path).matches();
-    }
-  };
+      // CVS
+      "**/CVS", "**/CVS/**",
+      // to not hit the weird formatting error.
+      "**/.cvsignore",
 
-  /* used when defaultExcludes is true */
-  final ResourceFilter defaultJavaFilter = new ResourceFilter() {
+      // SCCS
+      "**/SCCS", "**/SCCS/**",
 
-    public boolean allows(String path) {
-      return justJavaFilter.allows(path)
-          && !defaultJavaExcludesPattern.matcher(path).matches();
-    }
+      // Visual SourceSafe
+      "**/vssver.scc",
 
-  };
-  /* used when defaultExcludes is false */
-  final ResourceFilter justResourceFilter = new ResourceFilter() {
+      // Subversion
+      "**/.svn", "**/.svn/**",
 
-    public boolean allows(String path) {
-      return defaultAntIncludes.allows(path);
-    }
-  };
+      // Mac
+      "**/.DS_Store",};
 
-  /* used when defaultExcludes is false */
-  final ResourceFilter justJavaFilter = new ResourceFilter() {
-
-    public boolean allows(String path) {
-      return defaultAntIncludes.allows(path) && isJavaFile(path);
-    }
-  };
-
-  private final Pattern defaultExcludesPattern;
-  private final Pattern defaultJavaExcludesPattern;
   // \w (word character), ., $, /, -, *, ~, #, %
-  private final Pattern antPattern = Pattern.compile("^[\\w\\.\\$/\\-\\*~#%]*$");
+  private static final Pattern antPattern = Pattern.compile("^[\\w\\.\\$/\\-\\*~#%]*$");
+
+  private static final Pattern defaultExcludesPattern = getPatternFromAntStrings(DEFAULT_EXCLUDES);
 
   // accepts all but paths starting with '/'. Default include list is '**'
-  private final ResourceFilter defaultAntIncludes = new ResourceFilter() {
+  private static final ResourceFilter defaultAntIncludes = new ResourceFilter() {
     public boolean allows(String path) {
       return path.charAt(0) != '/';
     }
   };
 
-  private final ResourceFilter rejectAll = new ResourceFilter() {
-    public boolean allows(String path) {
-      return false;
-    }
-  };
-
-  public DefaultFilters() {
-
-    /*
-     * list copied from {@link org.apache.tools.ant.DirectoryScanner}
-     */
-    String defaultExcludes[] = new String[] {
-    // Miscellaneous typical temporary files
-        "**/*~", "**/#*#", "**/.#*", "**/%*%", "**/._*",
-
-        // CVS
-        "**/CVS", "**/CVS/**",
-        // to not hit the weird formatting error.
-        "**/.cvsignore",
-
-        // SCCS
-        "**/SCCS", "**/SCCS/**",
-
-        // Visual SourceSafe
-        "**/vssver.scc",
-
-        // Subversion
-        "**/.svn", "**/.svn/**",
-
-        // Mac
-        "**/.DS_Store",};
-
-    defaultExcludesPattern = getPatternFromAntStrings(defaultExcludes);
-
-    String defaultExcludesJava[] = new String[] {
-    // Miscellaneous typical temporary files
-        "**/.#*", "**/._*",
-
-        // CVS
-        "**/CVS/**",
-
-        // SCCS
-        "**/SCCS/**",
-
-        // Subversion
-        "**/.svn/**",};
-    defaultJavaExcludesPattern = getPatternFromAntStrings(defaultExcludesJava);
-  }
-
-  public ResourceFilter customJavaFilter(String includeList[],
-      String excludeList[], String skipList[], boolean defaultExcludes,
-      boolean caseSensitive) {
-    return getCustomFilter(includeList, excludeList, skipList, defaultExcludes,
-        caseSensitive, YES_JAVA);
-  }
-
-  public ResourceFilter customResourceFilter(String includeList[],
-      String excludeList[], String[] skipList, boolean defaultExcludes,
-      boolean caseSensitive) {
-
-    return getCustomFilter(includeList, excludeList, skipList, defaultExcludes,
-        caseSensitive, NOT_JAVA);
-  }
-
-  /**
-   * return a customResourceFiter that handles all the argument. If unable to
-   * create a customResourceFilter that handles the arguments, catchAll is used
-   * as the final ResourceFilter.
-   */
-  ResourceFilter customFilterWithCatchAll(final String includeList[],
-      final String excludeList[], final String skipList[],
-      final boolean defaultExcludes, final ResourceFilter catchAll,
-      final boolean isJava) {
-
-    assert includeList.length > 0 || excludeList.length > 0 || skipList.length > 0;
-
-    final ResourceFilter includeFilter = getFilterPart(includeList, IS_INCLUDES);
-    final ResourceFilter excludeFilter = getFilterPart(concatenate(excludeList, skipList),
-        IS_EXCLUDES);
-
-    if (includeFilter == null || excludeFilter == null) {
-      return catchAll;
-    }
-    // another common-case
-    ResourceFilter filter = new ResourceFilter() {
-      public boolean allows(String path) {
-        // do not handle the case when pattern ends in '/'
-        if (path.endsWith("/")) {
-          return catchAll.allows(path);
-        }
-        return isPathAllowedByDefaults(path, defaultExcludes, isJava)
-            && includeFilter.allows(path) && !excludeFilter.allows(path);
-      }
-
-      private boolean isPathAllowedByDefaults(String path,
-          boolean defaultExcludes, boolean isJava) {
-        if (defaultExcludes) {
-          return isJava ? !defaultJavaExcludesPattern.matcher(path).matches()
-              && isJavaFile(path)
-              : !defaultExcludesPattern.matcher(path).matches();
-        }
-        return isJava ? isJavaFile(path) : true;
-      }
-    };
-    return filter;
-  }
-
-  ResourceFilter getCustomFilter(final String includeList[],
-      final String excludeList[], final String skipList[],
-      final boolean defaultExcludes, final boolean caseSensitive,
-      final boolean isJava) {
-    if (includeList.length == 0 && excludeList.length == 0 &&
-        skipList.length == 0 && caseSensitive) {
-      // optimize for the common case.
-      return getMatchingDefaultFilter(defaultExcludes, isJava);
-    }
-
-    // don't create a catchAll in default cases
-    ResourceFilter catchAll = new ResourceFilter() {
-      ZipScanner scanner = getScanner(includeList, excludeList,
-          skipList, defaultExcludes, caseSensitive);
-
-      public boolean allows(String path) {
-        if (isJava) {
-          return isJavaFile(path) && scanner.match(path);
-        }
-        return scanner.match(path);
-      }
-    };
-
-    // for now, don't handle case sensitivity
-    if (!caseSensitive) {
-      return catchAll;
-    }
-    return customFilterWithCatchAll(includeList, excludeList, skipList, defaultExcludes,
-        catchAll, isJava);
-  }
-
-  ResourceFilter getFilterPart(final String list[], final boolean defaultValue) {
-    if (list.length == 0) {
-      return defaultValue ? defaultAntIncludes : rejectAll;
-    }
-
-    String patternStrings[] = new String[list.length];
-    int count = 0;
-    for (String antPatternString : list) {
-      String patternString = getPatternFromAntPattern(antPatternString);
-      if (patternString == null) {
-        return null;
-      }
-      patternStrings[count++] = patternString;
-    }
-
-    final Pattern pattern = getPatternFromStrings(patternStrings);
-    return new ResourceFilter() {
-      public boolean allows(String path) {
-        return pattern.matcher(path).matches();
-      }
-    };
-  }
-
   /**
    * Returns a pattern string that can be passed in Java Pattern.compile(..).
    * For spec, see <a href="http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/api/org/apache/tools/ant/DirectoryScanner.html"
@@ -305,7 +143,7 @@
    * @return a pattern string that can be passed in Java's Pattern.compile(..),
    *         null if cannot process the pattern.
    */
-  String getPatternFromAntPattern(String antPatternString) {
+  static String getPatternFromAntPattern(String antPatternString) {
     if (!antPattern.matcher(antPatternString).matches()) {
       return null;
     }
@@ -381,20 +219,43 @@
     return sb.toString();
   }
 
-  /**
-   * Obtain the appropriate resourceFilter based on defaultExcludes and isJava
-   * values. Assumptions: caseSensitive = true,and the includesList and
-   * excludesList are empty
-   */
-  private ResourceFilter getMatchingDefaultFilter(boolean defaultExcludes,
-      boolean isJava) {
-    if (defaultExcludes) {
-      return isJava ? defaultJavaFilter : defaultResourceFilter;
+  static ZipScanner getScanner(String[] includeList, String[] excludeList,
+      String[] skipList, boolean defaultExcludes, boolean caseSensitive) {
+    /*
+     * Hijack Ant's ZipScanner to handle inclusions/exclusions exactly as Ant
+     * does. We're only using its pattern-matching capabilities; the code path
+     * I'm using never tries to hit the filesystem in Ant 1.6.5.
+     */
+    ZipScanner scanner = new ZipScanner();
+    if (includeList.length > 0) {
+      scanner.setIncludes(includeList);
     }
-    return isJava ? justJavaFilter : justResourceFilter;
+    if (excludeList.length > 0 || skipList.length > 0) {
+      String[] excludeOrSkip = concatenate(excludeList, skipList);
+      scanner.setExcludes(excludeOrSkip);
+    }
+    if (defaultExcludes) {
+      scanner.addDefaultExcludes();
+    }
+    scanner.setCaseSensitive(caseSensitive);
+    scanner.init();
+
+    return scanner;
   }
 
-  private Pattern getPatternFromAntStrings(String... antPatterns) {
+  private static String[] concatenate(String[] array1, String[] array2) {
+    String[] answer = new String[array1.length + array2.length];
+    int i = 0;
+    for (String entry : array1) {
+      answer[i++] = entry;
+    }
+    for (String entry : array2) {
+      answer[i++] = entry;
+    }
+    return answer;
+  }
+  
+  private static Pattern getPatternFromAntStrings(String... antPatterns) {
     String patternStrings[] = new String[antPatterns.length];
     int count = 0;
     for (String antPatternString : antPatterns) {
@@ -408,7 +269,7 @@
     return getPatternFromStrings(patternStrings);
   }
 
-  private Pattern getPatternFromStrings(String... patterns) {
+  private static Pattern getPatternFromStrings(String... patterns) {
     StringBuffer entirePattern = new StringBuffer("^");
     int length = patterns.length;
     int count = 0;
@@ -423,7 +284,156 @@
     return Pattern.compile(entirePattern.toString());
   }
 
-  private boolean isJavaFile(String path) {
-    return path.endsWith(".java");
+  private final ResourceFilter rejectAll = new ResourceFilter() {
+    public boolean allows(String path) {
+      return false;
+    }
+  };
+
+  public ResourceFilter customClassFilesFilter(String includeList[],
+      String excludeList[], String skipList[], boolean defaultExcludes,
+      boolean caseSensitive) {
+    return getCustomFilter(includeList, excludeList, skipList, defaultExcludes,
+        caseSensitive, FilterFileType.CLASS_FILES);
+  }
+
+  public ResourceFilter customJavaFilter(String includeList[],
+      String excludeList[], String skipList[], boolean defaultExcludes,
+      boolean caseSensitive) {
+    return getCustomFilter(includeList, excludeList, skipList, defaultExcludes,
+        caseSensitive, FilterFileType.JAVA_FILES);
+  }
+
+  public ResourceFilter customResourceFilter(String includeList[],
+      String excludeList[], String[] skipList, boolean defaultExcludes,
+      boolean caseSensitive) {
+    return getCustomFilter(includeList, excludeList, skipList, defaultExcludes,
+        caseSensitive, FilterFileType.RESOURCE_FILES);
+  }
+  
+  /**
+   * Return a customResourceFiter that handles all the argument. If unable to
+   * create a customResourceFilter that handles the arguments, catchAll is used
+   * as the final ResourceFilter.
+   */
+  ResourceFilter customFilterWithCatchAll(final String includeList[],
+      final String excludeList[], final String skipList[],
+      final boolean defaultExcludes, final ResourceFilter catchAll,
+      final FilterFileType filterFileType) {
+
+    assert includeList.length > 0 || excludeList.length > 0
+        || skipList.length > 0;
+
+    final ResourceFilter includeFilter = getIncludesFilterPart(includeList);
+    final ResourceFilter excludeFilter = getExcludesFilterPart(concatenate(
+        excludeList, skipList));
+
+    if (includeFilter == null || excludeFilter == null) {
+      return catchAll;
+    }
+    // another common-case
+    ResourceFilter filter = new ResourceFilter() {
+      public boolean allows(String path) {
+        // do not handle the case when pattern ends in '/'
+        if (path.endsWith("/")) {
+          return catchAll.allows(path);
+        }
+        return isPathAllowedByDefaults(path, defaultExcludes, filterFileType)
+            && includeFilter.allows(path) && !excludeFilter.allows(path);
+      }
+
+      private boolean isPathAllowedByDefaults(String path,
+          boolean defaultExcludes, FilterFileType filterFileType) {
+        boolean fileTypeMatch = filterFileType.matches(path);
+        if (!fileTypeMatch) {
+          return false;
+        }
+        if (defaultExcludes) {
+          return !defaultExcludesPattern.matcher(path).matches();
+        }
+        return true;
+      }
+    };
+    return filter;
+  }
+
+  ResourceFilter getCustomFilter(final String includeList[],
+      final String excludeList[], final String skipList[],
+      final boolean defaultExcludes, final boolean caseSensitive,
+      final FilterFileType filterFileType) {
+    if (includeList.length == 0 && excludeList.length == 0
+        && skipList.length == 0 && caseSensitive) {
+      // optimize for the common case.
+      return getMatchingDefaultFilter(defaultExcludes, filterFileType);
+    }
+
+    // don't create a catchAll in default cases
+    ResourceFilter catchAll = new ResourceFilter() {
+      ZipScanner scanner = getScanner(includeList, excludeList, skipList,
+          defaultExcludes, caseSensitive);
+
+      public boolean allows(String path) {
+        return filterFileType.matches(path) && scanner.match(path);
+      }
+    };
+
+    // for now, don't handle case sensitivity
+    if (!caseSensitive) {
+      return catchAll;
+    }
+    return customFilterWithCatchAll(includeList, excludeList, skipList,
+        defaultExcludes, catchAll, filterFileType);
+  }
+
+  ResourceFilter getExcludesFilterPart(final String list[]) {
+    return getFilterPart(list, false);
+  }
+
+  ResourceFilter getIncludesFilterPart(final String list[]) {
+    return getFilterPart(list, true);
+  }
+
+  /**
+   * @param list patterns to add to the filter.
+   * @param isInclude Only used if the the array is empty. If <code>true</code>
+   *          treat this as an include. Otherwise, assume this is an excludes
+   *          filter and exclude all files.
+   * @return
+   */
+  private ResourceFilter getFilterPart(final String list[],
+      final boolean isInclude) {
+    if (list.length == 0) {
+      return isInclude ? defaultAntIncludes : rejectAll;
+    }
+
+    String patternStrings[] = new String[list.length];
+    int count = 0;
+    for (String antPatternString : list) {
+      String patternString = getPatternFromAntPattern(antPatternString);
+      if (patternString == null) {
+        return null;
+      }
+      patternStrings[count++] = patternString;
+    }
+
+    final Pattern pattern = getPatternFromStrings(patternStrings);
+    return new ResourceFilter() {
+      public boolean allows(String path) {
+        return pattern.matcher(path).matches();
+      }
+    };
+  }
+
+  /**
+   * Obtain the appropriate resourceFilter based on defaultExcludes and isJava
+   * values. Assumptions: caseSensitive = true,and the includesList and
+   * excludesList are empty
+   */
+  private ResourceFilter getMatchingDefaultFilter(boolean defaultExcludes,
+      FilterFileType filterFileType) {
+    if (defaultExcludes) {
+      return filterFileType.getDefaultFilter();
+    }
+    return filterFileType.getFileTypeFilter();
   }
 }
diff --git a/dev/core/test/com/google/gwt/dev/resource/impl/DefaultFiltersTest.java b/dev/core/test/com/google/gwt/dev/resource/impl/DefaultFiltersTest.java
index 3069d55..e592c6e 100644
--- a/dev/core/test/com/google/gwt/dev/resource/impl/DefaultFiltersTest.java
+++ b/dev/core/test/com/google/gwt/dev/resource/impl/DefaultFiltersTest.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.dev.resource.impl;
 
+import com.google.gwt.dev.resource.impl.DefaultFilters.FilterFileType;
+
 import junit.framework.TestCase;
 
 import org.apache.tools.ant.types.ZipScanner;
@@ -51,29 +53,39 @@
     String baseExcluded[] = mergeArrays(baseExcludedTesting, baseExcludedExact,
         baseExcludedDoubleStar);
 
-    void testAdvancedJavaPath(ResourceFilterString expected,
-        ResourceFilterString actual) {
+    void testAdvancedPath(ResourceFilterString expected,
+        ResourceFilterString actual, String suffix) {
       for (String path : mergeArrays(baseIncluded, baseExcluded, getMiscPaths(
           "testing", false).toArray(EMPTY_ARRAY),
           getMiscPaths("a/bc/de", false).toArray(EMPTY_ARRAY))) {
-        assertEquals(path + ".java", expected, actual);
+        assertEquals(path + suffix, expected, actual);
+      }      
+    }
+
+    void testAdvancedPathAnt(ResourceFilterString expected,
+        ResourceFilterString actual, String suffix) {
+      for (String path : mergeArrays(baseIncluded, baseExcluded, getMiscPaths(
+          "testing", true).toArray(EMPTY_ARRAY),
+          getMiscPaths("a/bc/de", true).toArray(EMPTY_ARRAY))) {
+        assertEquals(EXCLUDED_CHARS + path + EXCLUDED_CHARS + suffix,
+            expected, actual);
+        assertEquals(path + EXCLUDED_CHARS + suffix, expected, actual);
+        assertEquals(path + suffix, expected, actual);
       }
+      testAdvancedPath(expected, actual, suffix);
+      new BasicPaths().testBasicPath(expected, actual, suffix);
+    }
+    
+    void testAdvancedClassFilesPathAnt(ResourceFilterString expected,
+        ResourceFilterString actual) {
+      testAdvancedPathAnt(expected, actual, CLASS_FILE_SUFFIX);
     }
 
     void testAdvancedJavaPathAnt(ResourceFilterString expected,
         ResourceFilterString actual) {
-      for (String path : mergeArrays(baseIncluded, baseExcluded, getMiscPaths(
-          "testing", true).toArray(EMPTY_ARRAY),
-          getMiscPaths("a/bc/de", true).toArray(EMPTY_ARRAY))) {
-        assertEquals(excludedChars + path + excludedChars + javaSuffix,
-            expected, actual);
-        assertEquals(path + excludedChars + javaSuffix, expected, actual);
-        assertEquals(path + javaSuffix, expected, actual);
-      }
-      testAdvancedJavaPath(expected, actual);
-      new BasicPaths().testBasicJavaPath(expected, actual);
+      testAdvancedPathAnt(expected, actual, JAVA_FILE_SUFFIX);      
     }
-
+    
     void testAdvancedPath(ResourceFilterString expected,
         ResourceFilterString actual) {
       for (String path : mergeArrays(baseIncluded, baseExcluded, getMiscPaths(
@@ -89,8 +101,8 @@
           "testing", true).toArray(EMPTY_ARRAY),
           getMiscPaths("a/bc/de", true).toArray(EMPTY_ARRAY))) {
         assertEquals(path, expected, actual);
-        assertEquals(path + excludedChars, expected, actual);
-        assertEquals(excludedChars + path + excludedChars, expected, actual);
+        assertEquals(path + EXCLUDED_CHARS, expected, actual);
+        assertEquals(EXCLUDED_CHARS + path + EXCLUDED_CHARS, expected, actual);
       }
       testAdvancedPath(expected, actual);
       new BasicPaths().testBasicPath(expected, actual);
@@ -106,20 +118,20 @@
         "foo/.cvsignore", "foo/CVS", "foo/.svn", "foo/SCCS",
         "foo/bar/vssver.scc", "/foo/bar/.DS_Store"};
 
-    void testBasicJavaPath(ResourceFilterString expected,
-        ResourceFilterString actual) {
+    void testBasicPath(ResourceFilterString expected,
+        ResourceFilterString actual, String suffix) {
       for (String str : mergeArrays(baseIncluded, baseExcluded,
           baseSuffixExcluded,
           getMiscPaths("testing", true).toArray(EMPTY_ARRAY), getMiscPaths(
               "a/bc/de", true).toArray(EMPTY_ARRAY))) {
         assertEquals(str, expected, actual);
-        assertEquals(str + javaSuffix, expected, actual);
-        assertEquals(excludedChars + str, expected, actual);
-        assertEquals(excludedChars + str + excludedChars, expected, actual);
-        assertEquals(excludedChars + str + javaSuffix, expected, actual);
-        assertEquals(excludedChars + str + excludedChars + javaSuffix,
+        assertEquals(str + suffix, expected, actual);
+        assertEquals(EXCLUDED_CHARS + str, expected, actual);
+        assertEquals(EXCLUDED_CHARS + str + EXCLUDED_CHARS, expected, actual);
+        assertEquals(EXCLUDED_CHARS + str + suffix, expected, actual);
+        assertEquals(EXCLUDED_CHARS + str + EXCLUDED_CHARS + suffix,
             expected, actual);
-      }
+      }      
     }
 
     void testBasicPath(ResourceFilterString expected,
@@ -129,8 +141,8 @@
           getMiscPaths("testing", true).toArray(EMPTY_ARRAY), getMiscPaths(
               "a/bc/de", true).toArray(EMPTY_ARRAY))) {
         assertEquals(str, expected, actual);
-        assertEquals(excludedChars + str, expected, actual);
-        assertEquals(excludedChars + str + excludedChars, expected, actual);
+        assertEquals(EXCLUDED_CHARS + str, expected, actual);
+        assertEquals(EXCLUDED_CHARS + str + EXCLUDED_CHARS, expected, actual);
       }
     }
   }
@@ -146,28 +158,25 @@
       this.filter = filter;
       this.stringRepresentation = stringRepresentation;
     }
-
   }
 
   private static final String EMPTY_ARRAY[] = new String[0];
   private static final boolean DEFAULT_EXCLUDES = true;
   private static final boolean DEFAULT_INCLUDES = false;
-  private static final boolean NOT_JAVA = false;
-  private static final boolean YES_JAVA = true;
-
-  private static final String mergedPatterns[] = {
+  private static final String JAVA_FILE_SUFFIX = ".java";
+  private static final String CLASS_FILE_SUFFIX = ".class";
+  
+  private static final String MERGED_PATTERNS[] = {
       "**/testing/**", "Foo", "Bar", "fooz/**", "barz/hello/**"};
 
   // careful that the pattern is still permitted by ant.
-  private static final String excludedChars = "#~%*";
-
-  private static final String javaSuffix = ".java";
+  private static final String EXCLUDED_CHARS = "#~%*";
 
   private static void assertEquals(String path, ResourceFilterString expected,
       ResourceFilterString actual) {
     boolean scanResult = expected.filter.allows(path);
     assertEquals("String to be matched = " + path + ", actual filter = "
-        + actual.stringRepresentation + " should yied " + scanResult
+        + actual.stringRepresentation + " should yield " + scanResult
         + ", expected Filter = " + expected.stringRepresentation, scanResult,
         actual.filter.allows(path));
   }
@@ -215,26 +224,38 @@
 
   public void testEmptyFilters() {
     BasicPaths basicPaths = new BasicPaths();
-    DefaultFilters defaultFilters = new DefaultFilters();
-
+    FilterFileType fileType;
+    
     // first arg: ant filter, second arg: our custom filter
+    fileType= FilterFileType.RESOURCE_FILES;
     basicPaths.testBasicPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_EXCLUDES, NOT_JAVA, "antDefaultFilter"),
-        new ResourceFilterString(defaultFilters.defaultResourceFilter,
+        EMPTY_ARRAY, DEFAULT_EXCLUDES, fileType, "antDefaultFilter"),
+        new ResourceFilterString(fileType.getDefaultFilter(),
             "defaultFilter"));
     basicPaths.testBasicPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_INCLUDES, NOT_JAVA, "antDefaultIncludesFilter"),
-        new ResourceFilterString(defaultFilters.justResourceFilter,
+        EMPTY_ARRAY, DEFAULT_INCLUDES, fileType, "antDefaultIncludesFilter"),
+        new ResourceFilterString(fileType.getFileTypeFilter(),
             "defaultIncludesFilter"));
 
-    basicPaths.testBasicJavaPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_EXCLUDES, YES_JAVA, "antDefaultJavaFilter"),
-        new ResourceFilterString(defaultFilters.defaultJavaFilter,
-            "defaultJavaFilter"));
-    basicPaths.testBasicJavaPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_INCLUDES, YES_JAVA, "antJustJavaFilter"),
-        new ResourceFilterString(defaultFilters.justJavaFilter,
-            "justJavaFilter"));
+    fileType = FilterFileType.JAVA_FILES;
+    basicPaths.testBasicPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
+        EMPTY_ARRAY, DEFAULT_EXCLUDES, fileType, "antDefaultJavaFilter"),
+        new ResourceFilterString(fileType.getDefaultFilter(),
+            "defaultJavaFilter"), fileType.getSuffix());
+    basicPaths.testBasicPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
+        EMPTY_ARRAY, DEFAULT_INCLUDES, fileType, "antJustJavaFilter"),
+        new ResourceFilterString(fileType.getFileTypeFilter(),
+            "justJavaFilter"), fileType.getSuffix());
+    
+    fileType = FilterFileType.CLASS_FILES;
+    basicPaths.testBasicPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
+        EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES, "antDefaultClassFilesFilter"),
+        new ResourceFilterString(fileType.getDefaultFilter(),
+            "defaultClassFilesFilter"), fileType.getSuffix());
+    basicPaths.testBasicPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
+        EMPTY_ARRAY, DEFAULT_INCLUDES, FilterFileType.CLASS_FILES, "antJustClassFilesFilter"),
+        new ResourceFilterString(fileType.getFileTypeFilter(),
+            "justClassFilesFilter"), fileType.getSuffix());    
   }
 
   /**
@@ -271,10 +292,10 @@
 
       ResourceFilterString antFilterString = getAntFilter(
           new String[] {filter}, EMPTY_ARRAY, EMPTY_ARRAY, DEFAULT_EXCLUDES,
-          NOT_JAVA, "ant_" + filter);
+          FilterFileType.RESOURCE_FILES, "ant_" + filter);
       ResourceFilterString customFilterString = new ResourceFilterString(
           filters.customFilterWithCatchAll(new String[] {filter}, EMPTY_ARRAY,
-              EMPTY_ARRAY, true, null, NOT_JAVA), "custom_" + pattern);
+              EMPTY_ARRAY, true, null, FilterFileType.RESOURCE_FILES), "custom_" + pattern);
       for (String path : testPaths) {
         assertEquals(path, antFilterString, customFilterString);
       }
@@ -286,20 +307,20 @@
     ResourceFilter filter = null;
 
     // everything except those starting with '/' should be included
-    filter = new DefaultFilters().getFilterPart(EMPTY_ARRAY, true);
+    filter = new DefaultFilters().getIncludesFilterPart(EMPTY_ARRAY);
     advancedPaths.testAdvancedPath(getAntFilter(EMPTY_ARRAY, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_INCLUDES, NOT_JAVA, "antDefaultFilter"),
+        EMPTY_ARRAY, DEFAULT_INCLUDES, FilterFileType.RESOURCE_FILES, "antDefaultFilter"),
         new ResourceFilterString(filter, "defaultFilter"));
 
     // everything should be excluded
-    filter = new DefaultFilters().getFilterPart(EMPTY_ARRAY, false);
+    filter = new DefaultFilters().getExcludesFilterPart(EMPTY_ARRAY);
     advancedPaths.testAdvancedPath(getAntFilter(new String[] {"a/1/2/3"},
-        new String[] {"**", "/**"}, EMPTY_ARRAY, DEFAULT_INCLUDES, NOT_JAVA,
+        new String[] {"**", "/**"}, EMPTY_ARRAY, DEFAULT_INCLUDES, FilterFileType.RESOURCE_FILES,
         "antDefaultFilter"), new ResourceFilterString(filter, "defaultFilter"));
 
-    filter = new DefaultFilters().getFilterPart(mergedPatterns, true);
-    advancedPaths.testAdvancedPath(getAntFilter(mergedPatterns, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_INCLUDES, NOT_JAVA, "antMergedPatterns"),
+    filter = new DefaultFilters().getIncludesFilterPart(MERGED_PATTERNS);
+    advancedPaths.testAdvancedPath(getAntFilter(MERGED_PATTERNS, EMPTY_ARRAY,
+        EMPTY_ARRAY, DEFAULT_INCLUDES, FilterFileType.RESOURCE_FILES, "antMergedPatterns"),
         new ResourceFilterString(filter, "customMergedPatterns"));
   }
 
@@ -309,25 +330,25 @@
 
     ResourceFilter filter = null;
     // pass empty includeArray. Matches everything that is not excluded.
-    filter = getFilterWithoutCatchAll(EMPTY_ARRAY, mergedPatterns, EMPTY_ARRAY,
-        NOT_JAVA);
-    advancedPaths.testAdvancedPath(getAntFilter(EMPTY_ARRAY, mergedPatterns,
-        EMPTY_ARRAY, DEFAULT_EXCLUDES, NOT_JAVA, "ant_emptyArray_mergedPatterns"),
+    filter = getFilterWithoutCatchAll(EMPTY_ARRAY, MERGED_PATTERNS, EMPTY_ARRAY,
+        FilterFileType.RESOURCE_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(EMPTY_ARRAY, MERGED_PATTERNS,
+        EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.RESOURCE_FILES, "ant_emptyArray_mergedPatterns"),
         new ResourceFilterString(filter, "custom_emptyArray_mergedPatterns"));
 
     // pass empty excludeArray. Matches everything that is included.
-    filter = getFilterWithoutCatchAll(mergedPatterns, EMPTY_ARRAY, EMPTY_ARRAY,
-        NOT_JAVA);
-    advancedPaths.testAdvancedPath(getAntFilter(mergedPatterns, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_EXCLUDES, NOT_JAVA, "ant_mergedPatterns_emptyArray"),
+    filter = getFilterWithoutCatchAll(MERGED_PATTERNS, EMPTY_ARRAY, EMPTY_ARRAY,
+        FilterFileType.RESOURCE_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(MERGED_PATTERNS, EMPTY_ARRAY,
+        EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.RESOURCE_FILES, "ant_mergedPatterns_emptyArray"),
         new ResourceFilterString(filter, "custom_mergedPatterns_emptyArray"));
 
     // pass non-empty include and exclude array. Matches nothing
-    filter = getFilterWithoutCatchAll(mergedPatterns, mergedPatterns,
-        EMPTY_ARRAY, NOT_JAVA);
+    filter = getFilterWithoutCatchAll(MERGED_PATTERNS, MERGED_PATTERNS,
+        EMPTY_ARRAY, FilterFileType.RESOURCE_FILES);
     advancedPaths.testAdvancedPath(
-        getAntFilter(mergedPatterns, mergedPatterns, EMPTY_ARRAY,
-            DEFAULT_EXCLUDES, NOT_JAVA, "ant_mergedPatterns_mergedPatterns"),
+        getAntFilter(MERGED_PATTERNS, MERGED_PATTERNS, EMPTY_ARRAY,
+            DEFAULT_EXCLUDES, FilterFileType.RESOURCE_FILES, "ant_mergedPatterns_mergedPatterns"),
         new ResourceFilterString(filter, "custom_mergedPatterns_mergedPatterns"));
   }
 
@@ -337,26 +358,26 @@
 
     ResourceFilter filter = null;
     // pass empty includeArray. Matches everything that is not excluded.
-    filter = getFilterWithCatchAll(EMPTY_ARRAY, mergedPatterns, EMPTY_ARRAY,
-        NOT_JAVA);
-    advancedPaths.testAdvancedPathAnt(getAntFilter(EMPTY_ARRAY, mergedPatterns,
-        EMPTY_ARRAY, DEFAULT_EXCLUDES, NOT_JAVA,
-        "ant_emptyArray_mergedPatterns"),
+    filter = getFilterWithCatchAll(EMPTY_ARRAY, MERGED_PATTERNS, EMPTY_ARRAY,
+        FilterFileType.RESOURCE_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(EMPTY_ARRAY, MERGED_PATTERNS,
+        EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.RESOURCE_FILES,
+        "ant_emptyIncludeArray_mergedPatterns"),
         new ResourceFilterString(filter, "custom_emptyArray_mergedPatterns"));
 
     // pass empty excludeArray. Matches everything that is included.
-    filter = getFilterWithCatchAll(mergedPatterns, EMPTY_ARRAY, EMPTY_ARRAY,
-        NOT_JAVA);
-    advancedPaths.testAdvancedPathAnt(getAntFilter(mergedPatterns, EMPTY_ARRAY,
-        EMPTY_ARRAY, DEFAULT_EXCLUDES, NOT_JAVA,
-        "ant_emptyArray_mergedPatterns"),
+    filter = getFilterWithCatchAll(MERGED_PATTERNS, EMPTY_ARRAY, EMPTY_ARRAY,
+        FilterFileType.RESOURCE_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(MERGED_PATTERNS, EMPTY_ARRAY,
+        EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.RESOURCE_FILES,
+        "ant_emptyExcludeArray_mergedPatterns"),
         new ResourceFilterString(filter, "custom_emptyArray_mergedPatterns"));
 
     // pass non-empty include and exclude array. Matches nothing
-    filter = getFilterWithCatchAll(mergedPatterns, mergedPatterns, EMPTY_ARRAY,
-        NOT_JAVA);
-    advancedPaths.testAdvancedPathAnt(getAntFilter(mergedPatterns,
-        mergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, NOT_JAVA,
+    filter = getFilterWithCatchAll(MERGED_PATTERNS, MERGED_PATTERNS, EMPTY_ARRAY,
+        FilterFileType.RESOURCE_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(MERGED_PATTERNS,
+        MERGED_PATTERNS, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.RESOURCE_FILES,
         "ant_mergedPatterns_mergedPatterns"), new ResourceFilterString(filter,
         "custom_mergedPatterns_mergedPatterns"));
   }
@@ -364,146 +385,240 @@
   // no ant, catchAll filter is null
   public void testNonEmptyJavaFilters() {
     AdvancedPaths advancedPaths = new AdvancedPaths();
-
-    String newMergedPatterns[] = new String[mergedPatterns.length];
-    for (int i = 0; i < mergedPatterns.length; i++) {
-      if (mergedPatterns[i].endsWith("*")) {
-        newMergedPatterns[i] = mergedPatterns[i];
-      } else {
-        newMergedPatterns[i] = mergedPatterns[i] + ".java";
-      }
-    }
+    String newMergedPatterns[] = getMergedPatterns(JAVA_FILE_SUFFIX);
     ResourceFilter filter = null;
+    
     // pass empty includeArray. Means catch all
     filter = getFilterWithoutCatchAll(EMPTY_ARRAY, newMergedPatterns,
-        EMPTY_ARRAY, YES_JAVA);
-    advancedPaths.testAdvancedJavaPath(getAntFilter(EMPTY_ARRAY,
-        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, YES_JAVA,
+        EMPTY_ARRAY, FilterFileType.JAVA_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(EMPTY_ARRAY,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_emptyArray_newMergedPatterns"), new ResourceFilterString(filter,
-        "custom_emptyArray_newMergedPatterns"));
+        "custom_emptyArray_newMergedPatterns"), JAVA_FILE_SUFFIX);
 
     // pass empty excludeArray. Means catch only the pattern
     filter = getFilterWithoutCatchAll(newMergedPatterns, EMPTY_ARRAY,
-        EMPTY_ARRAY, YES_JAVA);
-    advancedPaths.testAdvancedJavaPath(getAntFilter(newMergedPatterns,
-        EMPTY_ARRAY, EMPTY_ARRAY, DEFAULT_EXCLUDES, YES_JAVA,
+        EMPTY_ARRAY, FilterFileType.JAVA_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(newMergedPatterns,
+        EMPTY_ARRAY, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_newMergedPatterns_emptyArray"), new ResourceFilterString(filter,
-        "custom_newMergedPatterns_emptyArray"));
+        "custom_newMergedPatterns_emptyArray"), JAVA_FILE_SUFFIX);
 
     // pass non-empty include and exclude array.
     filter = getFilterWithoutCatchAll(newMergedPatterns, newMergedPatterns,
-        EMPTY_ARRAY, YES_JAVA);
-    advancedPaths.testAdvancedJavaPath(getAntFilter(newMergedPatterns,
-        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, YES_JAVA,
+        EMPTY_ARRAY, FilterFileType.JAVA_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(newMergedPatterns,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
-        filter, "custom_newMergedPatterns_newMergedPatterns"));
+        filter, "custom_newMergedPatterns_newMergedPatterns"), JAVA_FILE_SUFFIX);
   }
 
   public void testNonEmptyJavaFiltersAnt() {
     AdvancedPaths advancedPaths = new AdvancedPaths();
-
-    String newMergedPatterns[] = new String[mergedPatterns.length];
-    for (int i = 0; i < mergedPatterns.length; i++) {
-      if (mergedPatterns[i].endsWith("*")) {
-        newMergedPatterns[i] = mergedPatterns[i];
-      } else {
-        newMergedPatterns[i] = mergedPatterns[i] + ".java";
-      }
-    }
+    String newMergedPatterns[] = getMergedPatterns(JAVA_FILE_SUFFIX);
     ResourceFilter filter = null;
+    
     // pass empty includeArray. Means catch all
     filter = getFilterWithCatchAll(EMPTY_ARRAY, newMergedPatterns, EMPTY_ARRAY,
-        YES_JAVA);
-    advancedPaths.testAdvancedJavaPathAnt(getAntFilter(EMPTY_ARRAY,
-        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, YES_JAVA,
+        FilterFileType.JAVA_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(EMPTY_ARRAY,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_emptyArray_newMergedPatterns"), new ResourceFilterString(filter,
-        "custom_emptyArray_newMergedPatterns"));
+        "custom_emptyArray_newMergedPatterns"), JAVA_FILE_SUFFIX);
 
     // pass empty excludeArray. Means catch only the pattern
     filter = getFilterWithCatchAll(newMergedPatterns, EMPTY_ARRAY, EMPTY_ARRAY,
-        YES_JAVA);
-    advancedPaths.testAdvancedJavaPathAnt(getAntFilter(newMergedPatterns,
-        EMPTY_ARRAY, EMPTY_ARRAY, DEFAULT_EXCLUDES, YES_JAVA,
+        FilterFileType.JAVA_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(newMergedPatterns,
+        EMPTY_ARRAY, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_newMergedPatterns_emptyArray"), new ResourceFilterString(filter,
-        "custom_newMergedPatterns_emptyArray"));
+        "custom_newMergedPatterns_emptyArray"), JAVA_FILE_SUFFIX);
 
     // pass non-empty include and exclude array.
     filter = getFilterWithCatchAll(newMergedPatterns, newMergedPatterns,
-        EMPTY_ARRAY, YES_JAVA);
-    advancedPaths.testAdvancedJavaPathAnt(getAntFilter(newMergedPatterns,
-        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, YES_JAVA,
+        EMPTY_ARRAY, FilterFileType.JAVA_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(newMergedPatterns,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
-        filter, "custom_newMergedPatterns_newMergedPatterns"));
+        filter, "custom_newMergedPatterns_newMergedPatterns"), JAVA_FILE_SUFFIX);
   }
   
   public void testNonEmptyJavaSkipFiltersAnt() {
     AdvancedPaths advancedPaths = new AdvancedPaths();
-
-    String newMergedPatterns[] = new String[mergedPatterns.length];
-    for (int i = 0; i < mergedPatterns.length; i++) {
-      if (mergedPatterns[i].endsWith("*")) {
-        newMergedPatterns[i] = mergedPatterns[i];
-      } else {
-        newMergedPatterns[i] = mergedPatterns[i] + ".java";
-      }
-    }
+    String newMergedPatterns[] = getMergedPatterns(JAVA_FILE_SUFFIX);
     ResourceFilter filter = null;
 
     // pass empty includeArray. Means catch all, skipping newMergedPatterns
     filter = getFilterWithCatchAll(EMPTY_ARRAY, EMPTY_ARRAY, newMergedPatterns,
-        YES_JAVA);
+        FilterFileType.JAVA_FILES);
     advancedPaths.testAdvancedJavaPathAnt(getAntFilter(EMPTY_ARRAY,
-        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, YES_JAVA,
+        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_emptyArray_newMergedPatterns"), new ResourceFilterString(filter,
         "custom_emptyArray_newMergedPatterns"));
 
     // pass non-empty include and skip array.
     filter = getFilterWithCatchAll(newMergedPatterns, EMPTY_ARRAY,
-        newMergedPatterns, YES_JAVA);
+        newMergedPatterns, FilterFileType.JAVA_FILES);
     advancedPaths.testAdvancedJavaPathAnt(getAntFilter(newMergedPatterns,
-        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, YES_JAVA,
+        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
         filter, "custom_newMergedPatterns_newMergedPatterns"));
 
     // in a single filter, skip and exclude are equivalent
     filter = getFilterWithCatchAll(newMergedPatterns, newMergedPatterns,
-        EMPTY_ARRAY, YES_JAVA);
+        EMPTY_ARRAY, FilterFileType.JAVA_FILES);
     advancedPaths.testAdvancedJavaPathAnt(getAntFilter(newMergedPatterns,
-        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, YES_JAVA,
+        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, FilterFileType.JAVA_FILES,
         "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
         filter, "custom_newMergedPatterns_newMergedPatterns"));
   }
+  
+  // no ant, catchAll filter is null
+  public void testNonEmptyClassFileFilters() {
+    AdvancedPaths advancedPaths = new AdvancedPaths();
 
+    String newMergedPatterns[] = getMergedPatterns(CLASS_FILE_SUFFIX);
+    ResourceFilter filter = null;
+    // pass empty includeArray. Means catch all
+    filter = getFilterWithoutCatchAll(EMPTY_ARRAY, newMergedPatterns,
+        EMPTY_ARRAY, FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(EMPTY_ARRAY,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_emptyArray_newMergedPatterns"), new ResourceFilterString(filter,
+        "custom_emptyArray_newMergedPatterns"), CLASS_FILE_SUFFIX);
+
+    // pass empty excludeArray. Means catch only the pattern
+    filter = getFilterWithoutCatchAll(newMergedPatterns, EMPTY_ARRAY,
+        EMPTY_ARRAY, FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(newMergedPatterns,
+        EMPTY_ARRAY, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_newMergedPatterns_emptyArray"), new ResourceFilterString(filter,
+        "custom_newMergedPatterns_emptyArray"), CLASS_FILE_SUFFIX);
+
+    // pass non-empty include and exclude array.
+    filter = getFilterWithoutCatchAll(newMergedPatterns, newMergedPatterns,
+        EMPTY_ARRAY, FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPath(getAntFilter(newMergedPatterns,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
+        filter, "custom_newMergedPatterns_newMergedPatterns"), CLASS_FILE_SUFFIX);
+  }
+
+  public void testNonEmptyClassFileFiltersAnt() {
+    AdvancedPaths advancedPaths = new AdvancedPaths();
+    String newMergedPatterns[] = getMergedPatterns(CLASS_FILE_SUFFIX);
+    ResourceFilter filter = null;
+    
+    // pass empty includeArray. Means catch all
+    filter = getFilterWithCatchAll(EMPTY_ARRAY, newMergedPatterns, EMPTY_ARRAY,
+        FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(EMPTY_ARRAY,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_emptyArray_newMergedPatterns"), new ResourceFilterString(filter,
+        "custom_emptyArray_newMergedPatterns"), CLASS_FILE_SUFFIX);
+
+    // pass empty excludeArray. Means catch only the pattern
+    filter = getFilterWithCatchAll(newMergedPatterns, EMPTY_ARRAY, EMPTY_ARRAY,
+        FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(newMergedPatterns,
+        EMPTY_ARRAY, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_newMergedPatterns_emptyArray"), new ResourceFilterString(filter,
+        "custom_newMergedPatterns_emptyArray"), CLASS_FILE_SUFFIX);
+
+    // pass non-empty include and exclude array.
+    filter = getFilterWithCatchAll(newMergedPatterns, newMergedPatterns,
+        EMPTY_ARRAY, FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(newMergedPatterns,
+        newMergedPatterns, EMPTY_ARRAY, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
+        filter, "custom_newMergedPatterns_newMergedPatterns"), CLASS_FILE_SUFFIX);
+  }
+  
+  private String[] getMergedPatterns(String suffix) {
+    String newMergedPatterns[] = new String[MERGED_PATTERNS.length];
+    for (int i = 0; i < MERGED_PATTERNS.length; i++) {
+      if (MERGED_PATTERNS[i].endsWith("*")) {
+        newMergedPatterns[i] = MERGED_PATTERNS[i];
+      } else {
+        newMergedPatterns[i] = MERGED_PATTERNS[i] + suffix;
+      }
+    }
+    return newMergedPatterns;
+  }
+  
+  public void testNonEmptyClassFileSkipFiltersAnt() {
+    AdvancedPaths advancedPaths = new AdvancedPaths();
+    String newMergedPatterns[] = getMergedPatterns(CLASS_FILE_SUFFIX);
+    ResourceFilter filter = null;
+
+    // pass empty includeArray. Means catch all, skipping newMergedPatterns
+    filter = getFilterWithCatchAll(EMPTY_ARRAY, EMPTY_ARRAY, newMergedPatterns,
+        FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(EMPTY_ARRAY,
+        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_emptyArray_newMergedPatterns"), new ResourceFilterString(filter,
+        "custom_emptyArray_newMergedPatterns"), CLASS_FILE_SUFFIX);
+
+    // pass non-empty include and skip array.
+    filter = getFilterWithCatchAll(newMergedPatterns, EMPTY_ARRAY,
+        newMergedPatterns, FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(newMergedPatterns,
+        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
+        filter, "custom_newMergedPatterns_newMergedPatterns"), CLASS_FILE_SUFFIX);
+
+    // in a single filter, skip and exclude are equivalent
+    filter = getFilterWithCatchAll(newMergedPatterns, newMergedPatterns,
+        EMPTY_ARRAY, FilterFileType.CLASS_FILES);
+    advancedPaths.testAdvancedPathAnt(getAntFilter(newMergedPatterns,
+        EMPTY_ARRAY, newMergedPatterns, DEFAULT_EXCLUDES, FilterFileType.CLASS_FILES,
+        "ant_newMergedPatterns_newMergedPatterns"), new ResourceFilterString(
+        filter, "custom_newMergedPatterns_newMergedPatterns"), CLASS_FILE_SUFFIX);
+  }
+  
   private ResourceFilterString getAntFilter(String includes[],
       String excludes[], String skips[], boolean defaultExcludes,
-      final boolean isJava, String tag) {
+      final FilterFileType filterFileType, String tag) {
     final ZipScanner scanner = DefaultFilters.getScanner(includes, excludes,
         skips, defaultExcludes, true);
     return new ResourceFilterString(new ResourceFilter() {
       public boolean allows(String path) {
-        if (isJava && !path.endsWith(".java")) {
-          return false;
-        }
-        return scanner.match(path);
+        return fileTypeMatches(filterFileType, path) && scanner.match(path);
       }
     }, tag != null ? tag : "includes: " + Arrays.toString(includes)
         + ", excludes: " + Arrays.toString(excludes));
   }
 
   private ResourceFilter getFilterWithCatchAll(String includesList[],
-      String excludesList[], String skipList[], boolean isJava) {
-    if (isJava) {
-      return new DefaultFilters().customJavaFilter(includesList, excludesList,
-          skipList, true, true);
+      String excludesList[], String skipList[], FilterFileType filterFileType) {
+    switch (filterFileType) {
+      case JAVA_FILES:
+        return new DefaultFilters().customJavaFilter(includesList, excludesList,
+            skipList, true, true);
+      case CLASS_FILES:
+        return new DefaultFilters().customClassFilesFilter(includesList, excludesList,
+            skipList, true, true);
+      case RESOURCE_FILES:
+      default:
+        return new DefaultFilters().customResourceFilter(includesList,
+            excludesList, skipList, true, true);
     }
-    return new DefaultFilters().customResourceFilter(includesList,
-        excludesList, skipList, true, true);
   }
 
   // caseSensitive and excludeDefaults are set
   private ResourceFilter getFilterWithoutCatchAll(String includesList[],
-      String excludesList[], String skipList[], boolean isJava) {
+      String excludesList[], String skipList[],  FilterFileType filterFileType) {
     return new DefaultFilters().customFilterWithCatchAll(includesList,
-        excludesList, skipList, true, null, isJava);
+        excludesList, skipList, true, null, filterFileType);
+  }
+  
+  private boolean fileTypeMatches(FilterFileType filterFileType, String path) {
+    switch (filterFileType) {
+      case JAVA_FILES:
+        return path.endsWith(".java");
+      case CLASS_FILES:
+        return path.endsWith(".class");
+    }
+    return true;
   }
 }