MYFACES-2956 build-metadata goal does not take into account exclude generated source directory on myfaces-builder-plugin
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojo.java
index 34f5bbd..cd82262 100644
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojo.java
+++ b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojo.java
@@ -253,7 +253,16 @@
      * @parameter
      */    
     private List sourceDirectories;
-        
+
+    /**
+     * The directory where all generated files are created. This directory is added as a
+     * compile source root automatically like src/main/java is. 
+     * 
+     * @since 1.0.8
+     * @parameter expression="${project.build.directory}/generated-sources/myfaces-builder-plugin"
+     */
+    private File generatedSourceDirectory;
+    
     /**
      * Create a metadata file containing information imported from other projects
      * plus data extracted from annotated classes in this project.
@@ -296,14 +305,34 @@
             }
         }
 
+        ModelParams parameters = new ModelParams();
+        
+        List sourceDirs = new ArrayList();
         if (sourceDirectories == null)
         {
-            buildModel(model, project);
+            sourceDirs.addAll(project.getCompileSourceRoots());
         }
         else
         {
-            buildModel(model, sourceDirectories);
+            sourceDirs.addAll(sourceDirectories);
         }
+        
+        if (generatedSourceDirectory != null)
+        {
+            for (Iterator it = sourceDirs.iterator(); it.hasNext();)
+            {
+                File f = new File((String) it.next());
+                if (generatedSourceDirectory.equals(f))
+                {
+                    it.remove();
+                }
+            }
+        }
+        
+        parameters.setSourceDirs(sourceDirs);
+        
+        buildModel(model, project, parameters);
+        
         resolveReplacePackage(model);
         
         IOUtils.saveModel(model, new File(targetDirectory, outputFile));
@@ -392,38 +421,22 @@
     /**
      * Execute ModelBuilder classes to create the Model data-structure.
      */
-    private Model buildModel(Model model, MavenProject project)
+    private Model buildModel(Model model, MavenProject project, ModelParams parameters)
             throws MojoExecutionException
     {
         try
         {
             QdoxModelBuilder builder = new QdoxModelBuilder();
             model.setModelId(modelId);
-            builder.buildModel(model, project,includes,excludes);            
-            return model;
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Unable to build metadata", e);
-        }
-    }
-    
-    private Model buildModel(Model model, List dirs)
-        throws MojoExecutionException
-    {
-        try
-        {
-            QdoxModelBuilder builder = new QdoxModelBuilder();
-            model.setModelId(modelId);
-            if (StringUtils.isNotEmpty(includes) || 
-                    StringUtils.isNotEmpty(excludes))
+            if (StringUtils.isNotEmpty(includes)) 
             {
-                builder.buildModel(model, dirs, includes, excludes);
+                parameters.setIncludes(includes);
             }
-            else
+            if (StringUtils.isNotEmpty(excludes))
             {
-                builder.buildModel(model, dirs);
+                parameters.setExcludes(excludes);
             }
+            builder.buildModel(model, parameters);            
             return model;
         }
         catch (BuildException e)
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtils.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtils.java
index e6cefec..9b0318d 100644
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtils.java
+++ b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtils.java
@@ -149,10 +149,10 @@
             //is banned, all here is generated
             //so we don't take a look at this directory
             //if (srcDir.matches(".*\\W+target\\W+myfaces-builder-plugin\\W+main\\W+.*"))
-            if (srcDir.matches(".*\\W+target\\W+generated-sources\\W+myfaces-builder-plugin"))
-            {
-                continue;
-            }                        
+            //if (srcDir.matches(".*\\W+target\\W+generated-sources\\W+myfaces-builder-plugin"))
+            //{
+            //    continue;
+            //}                        
             
             File f = new File(srcDir,filename);
             if (f.exists())
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelBuilder.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelBuilder.java
index 74a81db..cb09c1a 100644
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelBuilder.java
+++ b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelBuilder.java
@@ -19,7 +19,6 @@
 package org.apache.myfaces.buildtools.maven2.plugin.builder;
 
 import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
 
 /**
@@ -41,21 +40,6 @@
      * Given a model (which might already be partly populated with data, add
      * information about JSF artifacts.
      */
-    public void buildModel(Model model, MavenProject project)
+    public void buildModel(Model model, ModelParams parameters)
             throws MojoExecutionException;
-
-    /**
-     * Given a model (which might already be partly populated with data, add
-     * information about JSF artifacts, indicating include and exclude
-     * rules
-     * 
-     * @since 1.0.2
-     * @param model the model to add the information
-     * @param project the maven project to analyze
-     * @param includes rules to include files
-     * @param excludes rules to exclude files
-     * @throws MojoExecutionException
-     */
-    public void buildModel(Model model, MavenProject project, String includes, String excludes)
-            throws MojoExecutionException;    
 }
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelParams.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelParams.java
new file mode 100644
index 0000000..be597a4
--- /dev/null
+++ b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelParams.java
@@ -0,0 +1,59 @@
+/*

+ *  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.myfaces.buildtools.maven2.plugin.builder;

+

+import java.util.List;

+

+public class ModelParams

+{

+    private String includes;

+

+    private String excludes;

+

+    private List sources; 

+

+    public ModelParams()

+    {

+        super();

+    }

+    public String getIncludes()

+    {

+        return includes;

+    }

+    public void setIncludes(String includes)

+    {

+        this.includes = includes;

+    }

+    public String getExcludes()

+    {

+        return excludes;

+    }

+    public void setExcludes(String excludes)

+    {

+        this.excludes = excludes;

+    }

+    public List getSourceDirs()

+    {

+        return sources;

+    }

+    public void setSourceDirs(List sources)

+    {

+        this.sources = sources;

+    }

+}

diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
index 0f4d579..5c21ffe 100644
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
+++ b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
@@ -32,9 +32,9 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.IOUtils;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.ModelBuilder;
+import org.apache.myfaces.buildtools.maven2.plugin.builder.ModelParams;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.model.AttributeMeta;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.model.BehaviorMeta;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ClassMeta;
@@ -122,42 +122,36 @@
      * containing info extracted from the doc-annotation attributes and
      * introspected info about the item the annotation is attached to.
      */
-    public void buildModel(Model model, MavenProject project)
+    public void buildModel(Model model, ModelParams parameters)
             throws MojoExecutionException
     {
-        buildModel(model, project.getCompileSourceRoots());
-    }
-    
-    /**
-     * @since 1.0.2
-     */
-    public void buildModel(Model model, MavenProject project, String includes, String excludes)
-        throws MojoExecutionException
-    {
-        if (StringUtils.isNotEmpty(includes) || 
-                StringUtils.isNotEmpty(excludes))
-        {
-            buildModel(model, project.getCompileSourceRoots(),includes, excludes);            
-        }
-        else
-        {
-            buildModel(model, project.getCompileSourceRoots());
-        }
-    }
-    
-    /**
-     * @since 1.0.2
-     */
-    public void buildModel(Model model, List sourceDirs, String includes, String excludes)
-        throws MojoExecutionException
-    {
         String currModelId = model.getModelId();
         if (currModelId == null)
         {
             throw new MojoExecutionException("Model must have id set");
         }
-        //System.out.println("includes:"+includes+" excludes:"+excludes);
 
+        JavaClass[] classes = getSourceClasses(parameters.getSourceDirs(), 
+                parameters.getIncludes(), parameters.getExcludes());
+        
+        buildModel(model, parameters.getSourceDirs(), classes);
+    }
+
+    private JavaClass[] getSourceClasses(List sourceDirs, String includes, String excludes)
+    {
+        if (StringUtils.isNotEmpty(includes) || 
+                StringUtils.isNotEmpty(excludes))
+        {
+            return getInnerSourceClasses(sourceDirs, includes, excludes);
+        }
+        else
+        {
+            return getInnerSourceClasses(sourceDirs);
+        }
+    }
+    
+    private JavaClass[] getInnerSourceClasses(List sourceDirs, String includes, String excludes)
+    {
         JavaDocBuilder builder = new JavaDocBuilder();
 
         IncludeExcludeFileSelector selector = 
@@ -189,40 +183,20 @@
             QdoxHelper.addFileToJavaDocBuilder(builder, selector, srcDir);
         }        
         
-        JavaClass[] classes = builder.getClasses();
-        
-        buildModel(model, sourceDirs, classes);
+        return builder.getClasses();
     }
-    
-    /**
-     * Scan the source tree for doc-annotations, and build Model objects
-     * containing info extracted from the doc-annotation attributes and
-     * introspected info about the item the annotation is attached to.
-     */
-    public void buildModel(Model model, List sourceDirs)
-            throws MojoExecutionException
+
+    private JavaClass[] getInnerSourceClasses(List sourceDirs)
     {
-        String currModelId = model.getModelId();
-        if (currModelId == null)
-        {
-            throw new MojoExecutionException("Model must have id set");
-        }
-
         JavaDocBuilder builder = new JavaDocBuilder();
-
-        // need a File object representing the original source tree
-        //
-        // TODO: make this more flexible, so specific classes can
-        // be included and excluded.
+        
         for (Iterator i = sourceDirs.iterator(); i.hasNext();)
         {
             String srcDir = (String) i.next();
             builder.addSourceTree(new File(srcDir));
         }
 
-        JavaClass[] classes = builder.getClasses();
-
-        buildModel(model, sourceDirs, classes);
+        return builder.getClasses();
     }
     
     protected void buildModel(Model model, List sourceDirs, JavaClass[] classes)
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java b/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java
index 60b8faf..79a43f3 100644
--- a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java
+++ b/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java
@@ -28,12 +28,15 @@
 import java.io.StringWriter;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import junit.framework.TestCase;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.IOUtils;
+import org.apache.myfaces.buildtools.maven2.plugin.builder.ModelParams;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyMeta;
@@ -67,7 +70,10 @@
         File parentDir = new File(parentDirName);
         List sourceDirs = new ArrayList();
         sourceDirs.add(parentDir.getAbsolutePath());
-        builder.buildModel(model, sourceDirs);
+        
+        ModelParams parameters = new ModelParams();
+        parameters.setSourceDirs(sourceDirs);
+        builder.buildModel(model, parameters);
 
         assertEquals(1, model.getComponents().size());
         ComponentMeta cm = (ComponentMeta) model.getComponents().get(0);
@@ -95,7 +101,9 @@
 
         Model model = new Model();
         model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
+        ModelParams parameters = new ModelParams();
+        parameters.setSourceDirs(sourceDirs);
+        builder.buildModel(model, parameters);
 
         // basic sanity checks
         assertTrue(model.getComponents().size() > 0);
@@ -128,7 +136,9 @@
 
         Model model = new Model();
         model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
+        ModelParams parameters = new ModelParams();
+        parameters.setSourceDirs(sourceDirs);
+        builder.buildModel(model, parameters);
 
         // basic sanity checks
         assertTrue(model.getComponents().size() > 0);
@@ -163,7 +173,9 @@
 
         Model model = new Model();
         model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
+        ModelParams parameters = new ModelParams();
+        parameters.setSourceDirs(sourceDirs);
+        builder.buildModel(model, parameters);
 
         // basic sanity checks
         assertTrue(model.getComponents().size() > 0);
@@ -198,7 +210,9 @@
 
         Model model = new Model();
         model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
+        ModelParams parameters = new ModelParams();
+        parameters.setSourceDirs(sourceDirs);
+        builder.buildModel(model, parameters);
 
         // basic sanity checks
         assertTrue(model.getComponents().size() > 0);