Author: vmassol Date: Tue Mar 28 04:32:20 2006 New Revision: 389489 URL: http://svn.apache.org/viewcvs?rev=389489&view=rev Log: MCLOVER-25: Create aggregated report when Clover is executed in a multimodule build
Added: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1.java (contents, props changed) - copied, changed from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1Test.java (contents, props changed) - copied, changed from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2.java (contents, props changed) - copied, changed from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2Test.java (contents, props changed) - copied, changed from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java Removed: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java Modified: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-simple/pom.xml maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverReportMojo.java Copied: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1.java (from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java) URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1.java?p2=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1.java&p1=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java&r1=389413&r2=389489&rev=389489&view=diff ============================================================================== --- maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java (original) +++ maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1.java Tue Mar 28 04:32:20 2006 @@ -1,5 +1,5 @@ /* - * Copyright 2005 The Apache Software Foundation. + * Copyright 2005-2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,9 +15,9 @@ */ package org.apache.maven.plugin.clover.samples.multiproject; -public class Simple +public class Simple1 { - public void someMethod() + public void someMethod1() { int i = 0; if (i > 0) Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1.java ------------------------------------------------------------------------------ svn:keywords = "Author Date Id Revision" Copied: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1Test.java (from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java) URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1Test.java?p2=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1Test.java&p1=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java&r1=389413&r2=389489&rev=389489&view=diff ============================================================================== --- maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java (original) +++ maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1Test.java Tue Mar 28 04:32:20 2006 @@ -17,12 +17,12 @@ import junit.framework.TestCase; -public class SimpleTest extends TestCase +public class Simple1Test extends TestCase { public void testSomeMethod() { - Simple simple = new Simple(); - simple.someMethod(); + Simple1 simple = new Simple1(); + simple.someMethod1(); } } Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1Test.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module1/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple1Test.java ------------------------------------------------------------------------------ svn:keywords = "Author Date Id Revision" Copied: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2.java (from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java) URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2.java?p2=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2.java&p1=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java&r1=389413&r2=389489&rev=389489&view=diff ============================================================================== --- maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple.java (original) +++ maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2.java Tue Mar 28 04:32:20 2006 @@ -15,9 +15,9 @@ */ package org.apache.maven.plugin.clover.samples.multiproject; -public class Simple +public class Simple2 { - public void someMethod() + public void someMethod2() { int i = 0; if (i > 0) Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/main/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2.java ------------------------------------------------------------------------------ svn:keywords = "Author Date Id Revision" Copied: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2Test.java (from r389413, maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java) URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2Test.java?p2=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2Test.java&p1=maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java&r1=389413&r2=389489&rev=389489&view=diff ============================================================================== --- maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/SimpleTest.java (original) +++ maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2Test.java Tue Mar 28 04:32:20 2006 @@ -17,12 +17,12 @@ import junit.framework.TestCase; -public class SimpleTest extends TestCase +public class Simple2Test extends TestCase { public void testSomeMethod() { - Simple simple = new Simple(); - simple.someMethod(); + Simple2 simple = new Simple2(); + simple.someMethod2(); } } Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2Test.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-multiproject/maven-clover-plugin-sample-multiproject-module2/src/test/java/org/apache/maven/plugin/clover/samples/multiproject/Simple2Test.java ------------------------------------------------------------------------------ svn:keywords = "Author Date Id Revision" Modified: maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-simple/pom.xml URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-simple/pom.xml?rev=389489&r1=389488&r2=389489&view=diff ============================================================================== --- maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-simple/pom.xml (original) +++ maven/plugins/trunk/maven-clover-plugin/src/it/maven-clover-plugin-sample-simple/pom.xml Tue Mar 28 04:32:20 2006 @@ -35,12 +35,10 @@ <artifactId>maven-clover-plugin</artifactId> <configuration> <jdk>1.4</jdk> + <targetPercentage>1%</targetPercentage> </configuration> <executions> <execution> - <configuration> - <targetPercentage>1%</targetPercentage> - </configuration> <goals> <goal>check</goal> </goals> 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=389489&r1=389488&r2=389489&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 Tue Mar 28 04:32:20 2006 @@ -1,7 +1,5 @@ -package org.apache.maven.plugin.clover; - /* - * Copyright 2001-2005 The Apache Software Foundation. + * Copyright 2001-2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,35 +13,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.maven.plugin.clover; import com.cenqua.clover.reporters.html.HtmlReporter; +import com.cenqua.clover.CloverMerge; import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.project.MavenProject; import org.apache.maven.reporting.AbstractMavenReport; import org.apache.maven.reporting.MavenReportException; +import org.apache.maven.model.Plugin; +import org.apache.tools.ant.Project; import org.codehaus.doxia.sink.Sink; import org.codehaus.doxia.site.renderer.SiteRenderer; import java.io.File; -import java.util.Locale; -import java.util.ResourceBundle; +import java.util.*; /** - * Generate a <a href="http://cenqua.com/clover">Clover</a> report. - * The generated report is an external report generated by Clover itself. + * Generate a <a href="http://cenqua.com/clover">Clover</a> report. The generated report 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. * - * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a> - * @version $Id$ * @goal clover * @execute phase="test" lifecycle="clover" + * @aggregator + * + * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a> + * @version $Id$ */ -public class CloverReportMojo - extends AbstractMavenReport +public class CloverReportMojo extends AbstractMavenReport { // TODO: Need some way to share config elements and code between report mojos and main build // mojos. See http://jira.codehaus.org/browse/MNG-1886 - + /** * The location of the <a href="http://cenqua.com/clover/doc/adv/database.html">Clover database</a>. * @@ -53,6 +56,14 @@ 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" @@ -81,7 +92,7 @@ * @parameter default-value="true" */ protected boolean waitForFlush; - + /** * @component */ @@ -97,31 +108,130 @@ private MavenProject project; /** + * The projects in the reactor for aggregation report. + * + * @parameter expression="${reactorProjects}" + * @readonly + */ + 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 + public void executeReport( Locale locale ) throws MavenReportException { - AbstractCloverMojo.waitForFlush( this.waitForFlush, this.flushInterval ); - - int result = HtmlReporter.mainImpl( createCliArgs() ); - if ( result != 0 ) + // Only generate module reports for non root projects + if ( !getProject().isExecutionRoot() ) + { + AbstractCloverMojo.waitForFlush( this.waitForFlush, this.flushInterval ); + createCloverHtmlReport(); + } + + // If we're in the top level module, then create an extra report by aggregating the generated clover + // databases. + if ( this.aggregate && getProject().isExecutionRoot() ) + { + // Ensure the merged database output directory exists + new File( this.cloverMergeDatabase ).getParentFile().mkdirs(); + + // Merge the databases + mergeCloverDatabases(); + + // Generate the merged report + createMasterCloverHtmlReport(); + } + } + + 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(); ) { - throw new MavenReportException( "Clover has failed to instrument the source files" ); + MavenProject project = (MavenProject) projects.next(); + + File cloverDb = new File(project.getBasedir(), relativeCloverDatabasePath); + if (cloverDb.exists()) + { + dbFiles.add(cloverDb.getPath()); + } + else + { + getLog().warn("Skipping [" + cloverDb.getPath() + "] as it doesn't exist."); + } } + + return dbFiles; } /** - * @return the CLI args to be passed to the reporter * @todo handle multiple source roots. At the moment only the first source root is instrumented */ - private String[] createCliArgs() + private void createCloverHtmlReport() throws MavenReportException { - return new String[] { - "-t", "Maven Clover report", + String[] cliArgs = new String[] { + "-t", "Maven Clover report", "-p", (String) this.project.getCompileSourceRoots().get( 0 ), - "-i", this.cloverDatabase, + "-i", this.cloverDatabase, "-o", this.outputDirectory.getPath() }; + + int result = HtmlReporter.mainImpl( cliArgs ); + if ( result != 0 ) + { + throw new MavenReportException( "Clover has failed to create the HTML report" ); + } + + } + + private void createMasterCloverHtmlReport() throws MavenReportException + { + String[] args = new String[] { + "-t", "Maven Aggregated Clover report", + "-i", this.cloverMergeDatabase, + "-o", this.outputDirectory.getPath() }; + + int reportResult = HtmlReporter.mainImpl( args ); + if ( reportResult != 0 ) + { + throw new MavenReportException( "Clover has failed to create the merged HTML report" ); + } + } + + 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() @@ -183,19 +293,49 @@ executeReport( locale ); } + /** + * Always return true as we're using the report generated by Clover rather than creating our own report. + * @return true + */ public boolean isExternalReport() { return true; } /** + * Only execute reports for Java projects. + * + * @return true if the current project is Java project and false otherwise * @see org.apache.maven.reporting.AbstractMavenReport#canGenerateReport() */ public boolean canGenerateReport() { - // Only execute reports for java projects - ArtifactHandler artifactHandler = this.project.getArtifact().getArtifactHandler(); - return "java".equals( artifactHandler.getLanguage() ); + boolean canGenerate = false; + + if ( this.aggregate && getProject().isExecutionRoot() ) + { + // Check if we have at least one project which is a java project + for ( Iterator projects = this.reactorProjects.iterator(); projects.hasNext(); ) + { + MavenProject project = (MavenProject) projects.next(); + if ( isJavaProject(project) ) + { + canGenerate = true; + break; + } + } + } + else if ( isJavaProject(getProject()) ) + { + canGenerate = true; + } + + return canGenerate; } + private boolean isJavaProject(MavenProject project) + { + ArtifactHandler artifactHandler = project.getArtifact().getArtifactHandler(); + return "java".equals( artifactHandler.getLanguage() ); + } }