diff --git a/src/main/java/org/codehaus/mojo/clirr/ClirrExecutor.java b/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java similarity index 76% rename from src/main/java/org/codehaus/mojo/clirr/ClirrExecutor.java rename to src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java index b9dd4ea2b38bbd76ac7e3c3abcae58f01b65436b..f0aeaccaec6f41d0f8efd7b4a1b666e94a566c42 100644 --- a/src/main/java/org/codehaus/mojo/clirr/ClirrExecutor.java +++ b/src/main/java/org/codehaus/mojo/clirr/AbstractClirrMojo.java @@ -1,7 +1,7 @@ package org.codehaus.mojo.clirr; /* - * Copyright 2006 The Codehaus + * Copyright 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. @@ -42,9 +42,9 @@ import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.IOUtil; @@ -63,43 +63,114 @@ import java.util.List; import java.util.Set; /** - * Execute Clirr. + * Base parameters for Clirr check and report. * * @author Brett Porter - * @todo i18n exceptions + * @todo i18n exceptions, log messages + * @requiresDependencyResolution compile + * @execute phase="compile" */ -public class ClirrExecutor +public abstract class AbstractClirrMojo + extends AbstractMojo { - private static final URL[] EMPTY_URL_ARRAY = new URL[0]; - - private final ClirrDiffListener listener = new ClirrDiffListener(); - - private File xmlOutputFile; - - private File textOutputFile; - - private Log log; - - private String[] includes; + /** + * @parameter default-value="${project}" + * @required + * @readonly + */ + protected MavenProject project; + + /** + * @component + */ + protected ArtifactResolver resolver; + + /** + * @component + */ + protected ArtifactFactory factory; + + /** + * @parameter default-value="${localRepository}" + * @required + * @readonly + */ + protected ArtifactRepository localRepository; + + /** + * @component + */ + protected ArtifactMetadataSource metadataSource; + + /** + * The classes of this project to compare the last release against. + * + * @parameter default-value="${project.build.outputDirectory} + */ + protected File classesDirectory; + + /** + * Version to compare the current code against. + * + * @parameter expression="${comparisonVersion}" default-value="(,${project.version})" + */ + protected String comparisonVersion; + + /** + * A text output file to render to. If omitted, no output is rendered to a text file. + * + * @parameter expression="${textOutputFile}" + */ + protected File textOutputFile; + + /** + * An XML file to render to. If omitted, no output is rendered to an XML file. + * + * @parameter expression="${xmlOutputFile}" + */ + protected File xmlOutputFile; + + /** + * A list of classes to include. Anything not included is excluded. If omitted, all are assumed to be included. + * Values are specified in path pattern notation, e.g. org/codehaus/mojo/**. + * + * @parameter + */ + protected String[] includes; + + /** + * A list of classes to exclude. These classes are excluded from the list of classes that are included. + * Values are specified in path pattern notation, e.g. org/codehaus/mojo/**. + * + * @parameter + */ + protected String[] excludes; + + /** + * Whether to log the results to the console or not. + * + * @parameter expression="${logResults}" default-value="false" + */ + protected boolean logResults; - private String[] excludes; - - private Severity minSeverity; - - private String comparisonVersion; + private static final URL[] EMPTY_URL_ARRAY = new URL[0]; - private File classesDirectory; + public ClirrDiffListener executeClirr() + throws MojoExecutionException, MojoFailureException + { + return executeClirr( null ); + } - public void execute( MavenProject project, ArtifactResolver resolver, ArtifactMetadataSource metadatasource, - ArtifactRepository localRepository, ArtifactFactory factory, Log log ) + protected ClirrDiffListener executeClirr( Severity minSeverity ) throws MojoExecutionException, MojoFailureException { + ClirrDiffListener listener = new ClirrDiffListener(); + ClassFilter classFilter = new ClirrClassFilter( includes, excludes ); - JavaType[] origClasses = resolvePreviousReleaseClasses( project, resolver, metadatasource, localRepository, - factory, classFilter, log ); + JavaType[] origClasses = resolvePreviousReleaseClasses( classFilter ); - JavaType[] currentClasses = resolveCurrentClasses( classesDirectory, project.getArtifacts(), classFilter ); + JavaType[] currentClasses = resolveCurrentClasses( classFilter ); // Create a Clirr checker and execute Checker checker = new Checker(); @@ -134,22 +205,24 @@ public class ClirrExecutor } } - if ( this.log != null ) + if ( logResults ) { - listeners.add( new LogDiffListener( this.log ) ); + listeners.add( new LogDiffListener( getLog() ) ); } checker.addDiffListener( new DelegatingListener( listeners, minSeverity ) ); checker.reportDiffs( origClasses, currentClasses ); + + return listener; } - private JavaType[] resolveCurrentClasses( File classesDirectory, Set artifacts, ClassFilter classFilter ) + private JavaType[] resolveCurrentClasses( ClassFilter classFilter ) throws MojoExecutionException { try { - ClassLoader currentDepCL = createClassLoader( artifacts, null ); + ClassLoader currentDepCL = createClassLoader( project.getArtifacts(), null ); return createClassSet( classesDirectory, currentDepCL, classFilter ); } catch ( MalformedURLException e ) @@ -158,14 +231,11 @@ public class ClirrExecutor } } - private JavaType[] resolvePreviousReleaseClasses( MavenProject project, ArtifactResolver resolver, - ArtifactMetadataSource metadataSource, - ArtifactRepository localRepository, ArtifactFactory factory, - ClassFilter classFilter, Log log ) + private JavaType[] resolvePreviousReleaseClasses( ClassFilter classFilter ) throws MojoFailureException, MojoExecutionException { // Find the previous version JAR and resolve it, and it's dependencies - VersionRange range = null; + VersionRange range; try { range = VersionRange.createFromVersionSpec( comparisonVersion ); @@ -183,14 +253,14 @@ public class ClirrExecutor { if ( !previousArtifact.getVersionRange().isSelectedVersionKnown( previousArtifact ) ) { - log.debug( "Searching for versions in range: " + previousArtifact.getVersionRange() ); + getLog().debug( "Searching for versions in range: " + previousArtifact.getVersionRange() ); List availableVersions = metadataSource.retrieveAvailableVersions( previousArtifact, localRepository, project.getRemoteArtifactRepositories() ); ArtifactVersion version = range.matchVersion( availableVersions ); previousArtifact.selectVersion( version.toString() ); } - log.info( "Comparing to version: " + previousArtifact.getVersion() ); + getLog().info( "Comparing to version: " + previousArtifact.getVersion() ); // TODO: better way? Can't use previousArtifact as the originatingArtifact, it culls everything out // perhaps resolve the artifact itself (not the pom artifact), then load th epom and get dependencies @@ -304,48 +374,4 @@ public class ClirrExecutor return cl; } - public ClirrDiffListener getListener() - { - return listener; - } - - public void setXmlOutputFile( File xmlOutputFile ) - { - this.xmlOutputFile = xmlOutputFile; - } - - public void setTextOutputFile( File textOutputFile ) - { - this.textOutputFile = textOutputFile; - } - - public void setLog( Log log ) - { - this.log = log; - } - - public void setIncludes( String[] includes ) - { - this.includes = includes; - } - - public void setExcludes( String[] excludes ) - { - this.excludes = excludes; - } - - public void setMinSeverity( Severity minSeverity ) - { - this.minSeverity = minSeverity; - } - - public void setComparisonVersion( String comparisonVersion ) - { - this.comparisonVersion = comparisonVersion; - } - - public void setClassesDirectory( File classesDirectory ) - { - this.classesDirectory = classesDirectory; - } } diff --git a/src/main/java/org/codehaus/mojo/clirr/ClirrCheckMojo.java b/src/main/java/org/codehaus/mojo/clirr/ClirrCheckMojo.java index 6307204d587242816c5889180180fd1ff43bdd1b..7b24d29b9855c4de6960d455a92c9d1cdca21e01 100644 --- a/src/main/java/org/codehaus/mojo/clirr/ClirrCheckMojo.java +++ b/src/main/java/org/codehaus/mojo/clirr/ClirrCheckMojo.java @@ -18,17 +18,10 @@ package org.codehaus.mojo.clirr; import net.sf.clirr.core.ApiDifference; import net.sf.clirr.core.Severity; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.metadata.ArtifactMetadataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactResolver; -import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.project.MavenProject; import org.codehaus.plexus.i18n.I18N; -import java.io.File; import java.util.Iterator; import java.util.Locale; @@ -38,92 +31,10 @@ import java.util.Locale; * @author Brett Porter * @goal check * @phase verify - * @execute phase="compile" - * @requiresDependencyResolution compile */ public class ClirrCheckMojo - extends AbstractMojo + extends AbstractClirrMojo { - /** - * @parameter default-value="${project}" - * @required - * @readonly - */ - private MavenProject project; - - /** - * @component - */ - private ArtifactResolver resolver; - - /** - * @component - */ - private ArtifactFactory factory; - - /** - * @parameter default-value="${localRepository}" - * @required - * @readonly - */ - private ArtifactRepository localRepository; - - /** - * @component - */ - private ArtifactMetadataSource metadataSource; - - /** - * The classes of this project to compare the last release against. - * - * @parameter default-value="${project.build.outputDirectory} - */ - private File classesDirectory; - - /** - * Version to compare the current code against. - * - * @parameter expression="${comparisonVersion}" default-value="(,${project.version})" - */ - private String comparisonVersion; - - /** - * A text output file to render to. If omitted, no output is rendered to a text file. - * - * @parameter expression="${textOutputFile}" - */ - private File textOutputFile; - - /** - * An XML file to render to. If omitted, no output is rendered to an XML file. - * - * @parameter expression="${xmlOutputFile}" - */ - private File xmlOutputFile; - - /** - * A list of classes to include. Anything not included is excluded. If omitted, all are assumed to be included. - * Values are specified in path pattern notation, e.g. org/codehaus/mojo/**. - * - * @parameter - */ - private String[] includes; - - /** - * A list of classes to exclude. These classes are excluded from the list of classes that are included. - * Values are specified in path pattern notation, e.g. org/codehaus/mojo/**. - * - * @parameter - */ - private String[] excludes; - - /** - * Whether to log the results to the console or not. - * - * @parameter expression="${logResults}" default-value="false" - */ - private boolean logResults; - /** * Whether to fail on errors. * @@ -146,22 +57,10 @@ public class ClirrCheckMojo public void execute() throws MojoExecutionException, MojoFailureException { - ClirrExecutor executor = new ClirrExecutor(); - if ( logResults ) - { - executor.setLog( getLog() ); - } - executor.setTextOutputFile( textOutputFile ); - executor.setXmlOutputFile( xmlOutputFile ); - executor.setIncludes( includes ); - executor.setExcludes( excludes ); - executor.setComparisonVersion( comparisonVersion ); - executor.setClassesDirectory( classesDirectory ); - executor.execute( project, resolver, metadataSource, localRepository, factory, getLog() ); + ClirrDiffListener listener = executeClirr(); Locale locale = Locale.getDefault(); - ClirrDiffListener listener = executor.getListener(); int errorCount = listener.getSeverityCount( Severity.ERROR ); if ( failOnError && errorCount > 0 ) { diff --git a/src/main/java/org/codehaus/mojo/clirr/ClirrReport.java b/src/main/java/org/codehaus/mojo/clirr/ClirrReport.java index cf0ed73051d030340e68afc0710103525060f277..0d79f7f9ddd49666e2cbac1f4abc6e0e0c65d57e 100644 --- a/src/main/java/org/codehaus/mojo/clirr/ClirrReport.java +++ b/src/main/java/org/codehaus/mojo/clirr/ClirrReport.java @@ -17,16 +17,14 @@ package org.codehaus.mojo.clirr; */ import net.sf.clirr.core.Severity; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.metadata.ArtifactMetadataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.project.MavenProject; -import org.apache.maven.reporting.AbstractMavenReport; +import org.apache.maven.reporting.MavenReport; import org.apache.maven.reporting.MavenReportException; +import org.codehaus.doxia.module.xhtml.XhtmlSink; +import org.codehaus.doxia.sink.Sink; import org.codehaus.doxia.site.renderer.SiteRenderer; +import org.codehaus.plexus.util.StringInputStream; import java.io.File; import java.util.Locale; @@ -37,11 +35,10 @@ import java.util.ResourceBundle; * * @author Brett Porter * @goal clirr - * @requiresDependencyResolution compile - * @execute phase="compile" */ public class ClirrReport - extends AbstractMavenReport + extends AbstractClirrMojo + implements MavenReport { /** * Specifies the directory where the report will be generated @@ -51,54 +48,11 @@ public class ClirrReport */ private File outputDirectory; - /** - * @parameter default-value="${project}" - * @required - * @readonly - */ - private MavenProject project; - /** * @component */ private SiteRenderer siteRenderer; - /** - * @component - */ - private ArtifactResolver resolver; - - /** - * @component - */ - private ArtifactFactory factory; - - /** - * @parameter default-value="${localRepository}" - * @required - * @readonly - */ - private ArtifactRepository localRepository; - - /** - * @component - */ - private ArtifactMetadataSource metadataSource; - - /** - * The classes of this project to compare the last release against. - * - * @parameter default-value="${project.build.outputDirectory} - */ - private File classesDirectory; - - /** - * Version to compare the current code against. - * - * @parameter expression="${comparisonVersion}" default-value="(,${project.version})" - */ - private String comparisonVersion; - /** * Show only messages of this severity or higher. Valid values are info, warning and error. * @@ -120,59 +74,54 @@ public class ClirrReport */ private boolean htmlReport; - /** - * A text output file to render to. If omitted, no output is rendered to a text file. - * - * @parameter expression="${textOutputFile}" - */ - private File textOutputFile; - - /** - * An XML file to render to. If omitted, no output is rendered to an XML file. - * - * @parameter expression="${xmlOutputFile}" - */ - private File xmlOutputFile; - - /** - * A list of classes to include. Anything not included is excluded. If omitted, all are assumed to be included. - * Values are specified in path pattern notation, e.g. org/codehaus/mojo/**. - * - * @parameter - */ - private String[] includes; - - /** - * A list of classes to exclude. These classes are excluded from the list of classes that are included. - * Values are specified in path pattern notation, e.g. org/codehaus/mojo/**. - * - * @parameter - */ - private String[] excludes; + public String getCategoryName() + { + return MavenReport.CATEGORY_PROJECT_REPORTS; + } - /** - * Whether to log the results to the console or not. - * - * @parameter expression="${logResults}" default-value="false" - */ - private boolean logResults; + public void setReportOutputDirectory( File file ) + { + outputDirectory = file; + } - protected SiteRenderer getSiteRenderer() + public File getReportOutputDirectory() { - return siteRenderer; + return outputDirectory; } - protected String getOutputDirectory() + public boolean isExternalReport() { - return outputDirectory.getAbsolutePath(); + return false; } - protected MavenProject getProject() + public void execute() + throws MojoExecutionException, MojoFailureException { - return project; + // TODO: push to a helper? + Locale locale = Locale.getDefault(); + try + { + StringInputStream dummySiteDescriptor = new StringInputStream( "" ); + XhtmlSink sink = siteRenderer.createSink( outputDirectory, getOutputName() + ".html", + outputDirectory.getAbsolutePath(), dummySiteDescriptor, "maven" ); + + generate( sink, locale ); + + siteRenderer.copyResources( outputDirectory.getAbsolutePath(), "maven" ); + } + catch ( MavenReportException e ) + { + throw new MojoExecutionException( "An error has occurred in " + getName( locale ) + " report generation.", + e ); + } + catch ( Exception e ) + { + throw new MojoExecutionException( "An error has occurred in " + getName( locale ) + " report generation.", + e ); + } } - protected void executeReport( Locale locale ) + public void generate( Sink sink, Locale locale ) throws MavenReportException { if ( !canGenerateReport() ) @@ -181,25 +130,13 @@ public class ClirrReport } else { - doReport( locale ); + doReport( sink, locale ); } } - private void doReport( Locale locale ) + private void doReport( Sink sink, Locale locale ) throws MavenReportException { - ClirrExecutor executor = new ClirrExecutor(); - if ( logResults ) - { - executor.setLog( getLog() ); - } - executor.setTextOutputFile( textOutputFile ); - executor.setXmlOutputFile( xmlOutputFile ); - executor.setIncludes( includes ); - executor.setExcludes( excludes ); - executor.setComparisonVersion( comparisonVersion ); - executor.setClassesDirectory( classesDirectory ); - Severity minSeverity = convertSeverity( this.minSeverity ); ResourceBundle bundle = getBundle( locale ); if ( minSeverity == null ) @@ -207,10 +144,6 @@ public class ClirrReport getLog().warn( bundle.getString( "report.clirr.error.invalid.minseverity" ) + ": '" + this .minSeverity + "'." ); } - else - { - executor.setMinSeverity( minSeverity ); - } if ( !htmlReport && xmlOutputFile == null && textOutputFile == null && !logResults ) { @@ -218,9 +151,10 @@ public class ClirrReport } else { + ClirrDiffListener listener; try { - executor.execute( project, resolver, metadataSource, localRepository, factory, getLog() ); + listener = executeClirr( minSeverity ); } catch ( MojoExecutionException e ) { @@ -230,17 +164,17 @@ public class ClirrReport { throw new MavenReportException( e.getMessage() ); } - } - if ( htmlReport ) - { - ClirrReportGenerator generator = new ClirrReportGenerator( getSink(), bundle, locale ); + if ( htmlReport ) + { + ClirrReportGenerator generator = new ClirrReportGenerator( sink, bundle, locale ); - generator.setEnableSeveritySummary( showSummary ); + generator.setEnableSeveritySummary( showSummary ); - generator.setMinSeverity( minSeverity ); + generator.setMinSeverity( minSeverity ); - generator.generateReport( executor.getListener() ); + generator.generateReport( listener ); + } } }