FELIX-509: Exclude files before they are added to QDox. Pattern syntax is now supported.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@635027 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java
index 9642f1b..b7cae5c 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/SCRDescriptorMojo.java
@@ -80,7 +80,6 @@
 
     /**
      * The comma separated list of tokens to exclude when processing sources.
-     * All entries should be relative to the project directory
      *
      * @parameter alias="excludes"
      */
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java
index 8dee35f..845d862 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/JavaClassDescriptorManager.java
@@ -36,7 +36,7 @@
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.*;
 
 import com.thoughtworks.qdox.JavaDocBuilder;
 import com.thoughtworks.qdox.model.JavaSource;
@@ -76,7 +76,7 @@
      */
     public JavaClassDescriptorManager(final Log          log,
                                       final MavenProject project,
-                                      final String       excludes)
+                                      final String       excludeString)
     throws MojoFailureException, MojoExecutionException {
         this.log = log;
         this.project = project;
@@ -87,36 +87,49 @@
         JavaDocBuilder builder = new JavaDocBuilder();
         builder.getClassLibrary().addClassLoader(this.classloader);
         final Iterator i = project.getCompileSourceRoots().iterator();
-        while ( i.hasNext() ) {
-            final String tree = (String)i.next();
-            this.log.debug("Adding source tree " + tree);
-            builder.addSourceTree(new File(tree));
-        }
         // FELIX-509: check for excludes
-        if ( excludes != null ) {
-            final List sourcesList = new ArrayList(Arrays.asList(builder.getSources()));
-            final File projectDir = project.getBasedir();
-            final StringTokenizer st = new StringTokenizer(excludes, ",");
-            while ( st.hasMoreTokens() ) {
-                final String excludeEntry = st.nextToken();
-                this.log.debug("Processing configured exclude " + excludeEntry);
-                String exclude = projectDir.getAbsolutePath() + File.separatorChar + excludeEntry;
-                if ( File.separatorChar != '/' ) {
-                    exclude = exclude.replace('/', File.separatorChar);
+        if ( excludeString != null ) {
+            final String[] excludes = StringUtils.split(excludeString, ",");
+            final String[] includes = new String[] {"**/*.java"};
+
+            while ( i.hasNext() ) {
+                final String tree = (String)i.next();
+                this.log.debug("Scanning source tree " + tree);
+                final File directory = new File(tree);
+                final DirectoryScanner scanner = new DirectoryScanner();
+                scanner.setBasedir( directory );
+
+                if ( excludes != null && excludes.length > 0 ) {
+                    scanner.setExcludes( excludes );
                 }
-                final Iterator iter = sourcesList.iterator();
-                while ( iter.hasNext() ) {
-                    JavaSource current = (JavaSource)iter.next();
-                    if ( current.getFile().getAbsolutePath().startsWith(exclude)) {
-                        this.log.debug("Excluding source " + current.getFile());
-                        iter.remove();
+                scanner.addDefaultExcludes();
+                scanner.setIncludes( includes );
+
+                scanner.scan();
+
+                final String[] files = scanner.getIncludedFiles();
+                if ( files != null ) {
+                    for(int m=0; m<files.length; m++) {
+                        this.log.debug("Adding source file " + files[m]);
+                        try {
+                            builder.addSource(new File(directory, files[m]));
+                        } catch (FileNotFoundException e) {
+                            throw new MojoExecutionException("Unable to scan directory.", e);
+                        } catch (IOException e) {
+                            throw new MojoExecutionException("Unable to scan directory.", e);
+                        }
                     }
                 }
             }
-            this.sources = (JavaSource[]) sourcesList.toArray(new JavaSource[sourcesList.size()]);
         } else {
-            this.sources = builder.getSources();
+            while ( i.hasNext() ) {
+                final String tree = (String)i.next();
+                this.log.debug("Adding source tree " + tree);
+                final File directory = new File(tree);
+                builder.addSourceTree(directory);
+            }
         }
+        this.sources = builder.getSources();
 
         // and now scan artifacts
         final List components = new ArrayList();