Author: vmassol
Date: Fri Mar 31 07:45:38 2006
New Revision: 390447

URL: http://svn.apache.org/viewcvs?rev=390447&view=rev
Log:
MCLOVER-19, MCLOVER-25: Refactored clover:clover mojo and separated the clover 
database aggregation into a clover:aggregate mojo.

Added:
    
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverAggregateMojo.java
   (with props)
Modified:
    
maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/pom.xml
    
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverCheckMojo.java
    
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java
    
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentMojo.java
    
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverReportMojo.java

Modified: 
maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/pom.xml
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/pom.xml?rev=390447&r1=390446&r2=390447&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/pom.xml
 (original)
+++ 
maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/pom.xml
 Fri Mar 31 07:45:38 2006
@@ -19,10 +19,6 @@
     <plugins>
       <plugin>
         <artifactId>maven-clover-plugin</artifactId>
-<!--        <configuration>
-          <flushPolicy>threaded</flushPolicy>
-          <flushInterval>100</flushInterval>
-        </configuration>-->
       </plugin>
     </plugins>
   </reporting>
@@ -39,6 +35,7 @@
             <phase>pre-site</phase>
             <goals>
               <goal>instrument</goal>
+              <goal>aggregate</goal>
             </goals>
           </execution>
         </executions>

Added: 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverAggregateMojo.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverAggregateMojo.java?rev=390447&view=auto
==============================================================================
--- 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverAggregateMojo.java
 (added)
+++ 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverAggregateMojo.java
 Fri Mar 31 07:45:38 2006
@@ -0,0 +1,172 @@
+package org.apache.maven.plugin.clover;
+
+import org.apache.maven.reporting.AbstractMavenReport;
+import org.apache.maven.reporting.MavenReportException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.artifact.handler.ArtifactHandler;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.codehaus.doxia.site.renderer.SiteRenderer;
+import org.codehaus.doxia.sink.Sink;
+
+import java.io.File;
+import java.util.*;
+
+import com.cenqua.clover.reporters.html.HtmlReporter;
+import com.cenqua.clover.CloverMerge;
+
+/**
+ * Aggregate children module Clover databases if there are any. This mojo 
should not exist. It's only there because
+ * the site plugin doesn't handle @aggregators properly at the moment...
+ *
+ * @goal aggregate
+ * @aggregator
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a>
+ * @version $Id$
+ */
+public class CloverAggregateMojo extends AbstractMojo
+{
+    /**
+     * The location of the <a 
href="http://cenqua.com/clover/doc/adv/database.html";>Clover database</a>.
+     *
+     * @parameter expression="${project.build.directory}/clover/clover.db"
+     * @required
+     */
+    private String cloverDatabase;
+
+    /**
+     * The location of the merged clover database to create when running a 
report in a multimodule build.
+     *
+     * @parameter expression="${project.build.directory}/clover/cloverMerge.db"
+     * @required
+     */
+    private String cloverMergeDatabase;
+
+    /**
+     * The directory where the Clover report will be generated.
+     *
+     * @parameter expression="${project.reporting.outputDirectory}/clover"
+     * @required
+     */
+    private File outputDirectory;
+
+    /**
+     * When the Clover Flush Policy is set to "interval" or threaded this 
value is the minimum
+     * period between flush operations (in milliseconds).
+     *
+     * @parameter default-value="500"
+     */
+    protected int flushInterval;
+
+    /**
+     * If true we'll wait 2*flushInterval to ensure coverage data is flushed 
to the Clover
+     * database before running any query on it.
+     *
+     * Note: The only use case where you would want to turn this off is if 
you're running your
+     * tests in a separate JVM. In that case the coverage data will be flushed 
by default upon
+     * the JVM shutdown and there would be no need to wait for the data to be 
flushed. As we
+     * can't control whether users want to fork their tests or not, we're 
offering this parameter
+     * to them.
+     *
+     * @parameter default-value="true"
+     */
+    protected boolean waitForFlush;
+
+    /**
+     * The Maven project.
+     *
+     * @parameter expression="${project}"
+     * @required
+     * @readonly
+     */
+    private MavenProject project;
+
+    /**
+     * The projects in the reactor for aggregation report.
+     *
+     * @parameter expression="${reactorProjects}"
+     * @readonly
+     */
+    private List reactorProjects;
+
+    /**
+     * [EMAIL PROTECTED]
+     * @see org.apache.maven.plugin.clover.AbstractCloverMojo#execute()
+     */
+    public void execute()
+        throws MojoExecutionException
+    {
+        // If we're in a module with children modules, then aggregate the 
children clover databases.
+        if ( this.project.getModules().size() > 0 )
+        {
+            // Ensure all databases are flushed
+            AbstractCloverMojo.waitForFlush( this.waitForFlush, 
this.flushInterval );
+
+            if ( getChildrenCloverDatabases().size() > 0 )
+            {
+                // Ensure the merged database output directory exists
+                new File( this.cloverMergeDatabase ).getParentFile().mkdirs();
+
+                // Merge the databases
+                mergeCloverDatabases();
+            }
+            else
+            {
+                getLog().warn("No Clover databases found in children projects 
- No merge done");
+            }
+        }
+    }
+
+    private List getChildrenCloverDatabases()
+    {
+        // Ideally we'd need to find out where each module stores its Clover 
database. However that's not
+        // currently possible in m2 (see 
http://jira.codehaus.org/browse/MNG-2180). Thus we'll assume for now
+        // that all modules use the cloverDatabase configuration from the top 
level module.
+
+        // Find out the location of the clover DB relative to the root module.
+        // Note: This is a pretty buggy algorithm and we really need a proper 
solution (see MNG-2180)
+        String relativeCloverDatabasePath =
+            
this.cloverDatabase.substring(this.project.getBasedir().getPath().length());
+
+        List dbFiles = new ArrayList();
+        for ( Iterator projects = this.reactorProjects.iterator(); 
projects.hasNext(); )
+        {
+            MavenProject project = (MavenProject) projects.next();
+
+            File cloverDb = new File(project.getBasedir(), 
relativeCloverDatabasePath);
+            if (cloverDb.exists())
+            {
+                dbFiles.add(cloverDb.getPath());
+            }
+            else
+            {
+                getLog().debug("Skipping [" + cloverDb.getPath() + "] as it 
doesn't exist.");
+            }
+        }
+
+        return dbFiles;
+    }
+
+    private void mergeCloverDatabases() throws MojoExecutionException
+    {
+        List dbFiles = getChildrenCloverDatabases();
+
+        String[] args = new String[dbFiles.size() + 2];
+        args[0] = "-i";
+        args[1] = this.cloverMergeDatabase;
+
+        int i = 2;
+        for ( Iterator dbs = dbFiles.iterator(); dbs.hasNext(); )
+        {
+            args[i] = (String) dbs.next();
+            i++;
+        }
+
+        int mergeResult = CloverMerge.mainImpl( args );
+        if ( mergeResult != 0 )
+        {
+            throw new MojoExecutionException( "Clover has failed to merge the 
children module databases" );
+        }
+    }
+}

Propchange: 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverAggregateMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverAggregateMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverCheckMojo.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverCheckMojo.java?rev=390447&r1=390446&r2=390447&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverCheckMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverCheckMojo.java
 Fri Mar 31 07:45:38 2006
@@ -45,6 +45,10 @@
      */
     private String targetPercentage;
 
+    /**
+     * [EMAIL PROTECTED]
+     * @see org.apache.maven.plugin.clover.AbstractCloverMojo#execute()
+     */
     public void execute()
         throws MojoExecutionException
     {

Modified: 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java?rev=390447&r1=390446&r2=390447&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java
 Fri Mar 31 07:45:38 2006
@@ -83,6 +83,10 @@
 
     private String cloverOutputSourceDirectory;
 
+    /**
+     * [EMAIL PROTECTED]
+     * @see org.apache.maven.plugin.clover.AbstractCloverMojo#execute()  
+     */
     public void execute()
         throws MojoExecutionException
     {

Modified: 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentMojo.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentMojo.java?rev=390447&r1=390446&r2=390447&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentMojo.java
 Fri Mar 31 07:45:38 2006
@@ -34,6 +34,10 @@
  */
 public class CloverInstrumentMojo extends AbstractCloverMojo
 {
+    /**
+     * [EMAIL PROTECTED]
+     * @see org.apache.maven.plugin.clover.AbstractCloverMojo#execute()
+     */
     public void execute()
         throws MojoExecutionException
     {

Modified: 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverReportMojo.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverReportMojo.java?rev=390447&r1=390446&r2=390447&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverReportMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverReportMojo.java
 Fri Mar 31 07:45:38 2006
@@ -33,8 +33,10 @@
  * is an external report generated by Clover itself. If the project generating 
the report is a top level project and
  * if the <code>aggregate</code> configuration element is set to true then an 
aggregated report will also be created.
  *
+ * Note: This report mojo should be an @aggregator and the 
<code>clover:aggregate</code> mojo shouldn't exist. This
+ * is a limitation of the site plugin which doesn't support @aggregator 
reports...
+ *
  * @goal clover
- * @aggregator
  *
  * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a>
  * @version $Id$
@@ -113,75 +115,21 @@
     private List reactorProjects;
 
     /**
-     * Whether to build an aggregated report at the root in addition to 
building individual reports or not.
-     *
-     * @parameter expression="${aggregate}" default-value="true"
-     */
-    protected boolean aggregate;
-
-    /**
      * @see 
org.apache.maven.reporting.AbstractMavenReport#executeReport(java.util.Locale)
      */
     public void executeReport( Locale locale ) throws MavenReportException
     {
-        // Note: It seems we need to check whether or not we should generate a 
report here again because even though
-        // the canGenerateReport() method is called automatically when the 
"mvn site" phase is called, it's not called
-        // when the "mvn clover:clover" goal is called! Probably someone 
Maven2 should improve, see
-        // http://jira.codehaus.org/browse/MNG-2188
-        if ( canGenerateReport() )
+        File singleModuleCloverDatabase = new File( this.cloverDatabase );
+        if ( singleModuleCloverDatabase.exists() )
         {
-            AbstractCloverMojo.waitForFlush( this.waitForFlush, 
this.flushInterval );
-
-            // Only generate module level report for Java projects
-            if ( isJavaProject(this.project) )
-            {
-                createCloverHtmlReport();
-            }
-
-            // If we're in a module with children modules, then create an 
extra report by aggregating the children
-            // clover databases.
-            if ( this.aggregate && ( getProject().getModules().size() > 0 ) )
-            {
-                // Ensure the merged database output directory exists
-                new File( this.cloverMergeDatabase ).getParentFile().mkdirs();
-
-                // Merge the databases
-                mergeCloverDatabases();
-
-                // Generate the merged report
-                createMasterCloverHtmlReport();
-            }
+            createCloverHtmlReport();
         }
-    }
 
-    private List getChildrenCloverDatabases()
-    {
-        // Ideally we'd need to find out where each module stores its Clover 
database. However that's not
-        // currently possible in m2 (see 
http://jira.codehaus.org/browse/MNG-2180). Thus we'll assume for now
-        // that all modules use the cloverDatabase configuration from the top 
level module.
-
-        // Find out the location of the clover DB relative to the root module.
-        // Note: This is a pretty buggy algorithm and we really need a proper 
solution (see MNG-2180)
-        String relativeCloverDatabasePath =
-            
this.cloverDatabase.substring(getProject().getBasedir().getPath().length());
-
-        List dbFiles = new ArrayList();
-        for ( Iterator projects = this.reactorProjects.iterator(); 
projects.hasNext(); )
+        File mergedCloverDatabase = new File ( this.cloverMergeDatabase );
+        if ( mergedCloverDatabase.exists() )
         {
-            MavenProject project = (MavenProject) projects.next();
-
-            File cloverDb = new File(project.getBasedir(), 
relativeCloverDatabasePath);
-            if (cloverDb.exists())
-            {
-                dbFiles.add(cloverDb.getPath());
-            }
-            else
-            {
-                getLog().debug("Skipping [" + cloverDb.getPath() + "] as it 
doesn't exist.");
-            }
+            createMasterCloverHtmlReport();
         }
-
-        return dbFiles;
     }
 
     /**
@@ -217,28 +165,6 @@
         }
     }
 
-    private void mergeCloverDatabases() throws MavenReportException
-    {
-        List dbFiles = getChildrenCloverDatabases();
-
-        String[] args = new String[dbFiles.size() + 2];
-        args[0] = "-i";
-        args[1] = this.cloverMergeDatabase;
-
-        int i = 2;
-        for ( Iterator dbs = dbFiles.iterator(); dbs.hasNext(); )
-        {
-            args[i] = (String) dbs.next();
-            i++;
-        }
-
-        int mergeResult = CloverMerge.mainImpl( args );
-        if ( mergeResult != 0 )
-        {
-            throw new MavenReportException( "Clover has failed to merge the 
module databases" );
-        }
-    }
-
     public String getOutputName()
     {
         return "clover/index";
@@ -308,32 +234,29 @@
     }
 
     /**
-     * Generate reports for Java projects and for projects which have a Clover 
database available.
+     * Generate reports if a Clover module database or a Clover merged 
database exist.
      *
-     * @return true if a project should be generated using the algorithm 
defined above
+     * @return true if a project should be generated
      * @see org.apache.maven.reporting.AbstractMavenReport#canGenerateReport()
      */
     public boolean canGenerateReport()
     {
         boolean canGenerate = false;
 
-        // Check if we have at least one project which is a java project
-        for ( Iterator projects = this.reactorProjects.iterator(); 
projects.hasNext(); )
+        AbstractCloverMojo.waitForFlush( this.waitForFlush, this.flushInterval 
);
+
+        File singleModuleCloverDatabase = new File( this.cloverDatabase );
+        File mergedCloverDatabase = new File ( this.cloverMergeDatabase );
+
+        if (singleModuleCloverDatabase.exists() || 
mergedCloverDatabase.exists() )
+        {
+            canGenerate = true;
+        }
+        else
         {
-            MavenProject project = (MavenProject) projects.next();
-            if ( isJavaProject(project) && 
!getChildrenCloverDatabases().isEmpty() )
-            {
-                canGenerate = true;
-                break;
-            }
+            getLog().warn("No Clover database found, skipping report 
generation");
         }
 
         return canGenerate;
-    }
-
-    private boolean isJavaProject(MavenProject project)
-    {
-        ArtifactHandler artifactHandler = 
project.getArtifact().getArtifactHandler();
-        return "java".equals( artifactHandler.getLanguage() );
     }
 }


Reply via email to