package org.apache.maven.plugin.jdiff; /* * Copyright 2001-2005 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. * 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. */ import java.io.File; import java.util.Iterator; import java.util.List; import java.util.Locale; import org.apache.maven.artifact.Artifact; import org.apache.maven.project.MavenProject; import org.apache.maven.reporting.AbstractMavenReport; import org.apache.maven.reporting.MavenReportException; import org.apache.maven.scm.manager.ScmManager; import org.codehaus.doxia.sink.Sink; import org.codehaus.doxia.site.renderer.SiteRenderer; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.PathTool; /** * @goal jdiff * * @requiresDependencyResolution * * @description A Maven 2.0 JDiff plugin to generate an api difference report between SCM versions * * @phase validate * */ public class JDiffMojo extends AbstractMavenReport { /** * @parameter expression="${project.groupId}" * @required */ private String packages; /** * @parameter default-value="CURRENT" * @required */ private String oldTag; /** * @parameter default-value="CURRENT" * @required */ private String newTag; /** * @parameter expression="${jdiff.svnUsername}" */ private String svnUsername; /** * @parameter expression="${jdiff.svnPassword}" */ private String svnPassword; /** * @parameter */ private String svnTagBase; /** * @parameter expression="${project.build.directory}/site/jdiff" * @required * @readonly */ private String outputDirectory; /** * @parameter expression="${project}" * @required * @readonly */ private MavenProject project; /** * @parameter expression="${plugin.artifacts}" * @required * @readonly */ private List pluginArtifacts; /** * @parameter expression="${component.org.codehaus.doxia.site.renderer.SiteRenderer}" * @required * @readonly */ private SiteRenderer siteRenderer; /** * @parameter expression="${component.org.apache.maven.scm.manager.ScmManager}" * @required * @readonly */ private ScmManager scmManager; private ScmBean scm; public void executeReport( Locale locale ) throws MavenReportException { Init(); String oldSource = getSrcDir( oldTag ); String newSource = getSrcDir( newTag ); generateJDiffXML( oldSource, oldTag ); generateJDiffXML( newSource, newTag ); generateReport( newSource, oldTag, newTag ); generateSite(); } private void Init() throws MavenReportException { scm = new ScmBean( scmManager, getConnection() ); scm.setSvnParams( svnUsername, svnPassword, svnTagBase ); } private String getSrcDir( String tag ) throws MavenReportException { String srcDir; if ( tag.equals( "CURRENT" ) ) { srcDir = project.getBuild().getSourceDirectory(); } else { doCheckout( tag, outputDirectory + "/" + tag ); srcDir = outputDirectory + "/" + tag + "/src/main/java"; } return srcDir; } private String getProjectSourceDirectory() { return PathTool.getRelativePath( project.getBasedir().getAbsolutePath(), project.getBuild().getSourceDirectory() ); } private String getConnection() throws MavenReportException { if ( project.getScm() == null ) throw new MavenReportException( "SCM Connection is not set in your pom.xml." ); String connection = project.getScm().getConnection(); if ( connection != null ) if ( connection.length() > 0 ) return connection; connection = project.getScm().getDeveloperConnection(); if ( connection == null ) throw new MavenReportException( "SCM Connection is not set in your pom.xml." ); if ( connection.length() == 0 ) throw new MavenReportException( "SCM Connection is not set in your pom.xml." ); return connection; } private void doCheckout( String tag, String checkoutDir ) throws MavenReportException { try { File dir = new File( checkoutDir ); //@todo remove when scm update is to be used if ( dir.exists() ) FileUtils.deleteDirectory( dir ); if ( !dir.exists() ) { dir.mkdirs(); log( "Performing checkout to " + checkoutDir ); scm.checkout( tag, checkoutDir ); } else { log( "Performing update to " + checkoutDir ); scm.update( tag, checkoutDir ); } } catch( Exception ex ) { throw new MavenReportException( "checkout failed.", ex ); } } private void generateJDiffXML( String srcDir, String tag ) throws MavenReportException { JavadocBean javadoc = new JavadocBean(); javadoc.addArgumentPair( "doclet", "jdiff.JDiff" ); javadoc.addArgumentPair( "docletpath", getPluginClasspath() ); javadoc.addArgumentPair( "apiname", tag ); javadoc.addArgumentPair( "apidir", outputDirectory ); javadoc.addArgumentPair( "classpath", getProjectClasspath() ); javadoc.addArgumentPair( "sourcepath", srcDir ); javadoc.addArgument( packages ); javadoc.execute( outputDirectory ); } private String getProjectClasspath() { String cp = ""; for( Iterator i=project.getCompileArtifacts().iterator(); i.hasNext(); ) { Artifact artifact = (Artifact) i.next(); String path = artifact.getFile().getAbsolutePath(); cp += ";" + path; } return cp.substring( 1 ); } private String getPluginClasspath() { String cp = ""; for ( Iterator i=pluginArtifacts.iterator(); i.hasNext(); ) { Artifact artifact = (Artifact) i.next(); cp += ";" + artifact.getFile().getAbsolutePath(); } return cp.substring( 1 ); } private String getJarLocation( String id ) throws MavenReportException { for ( Iterator i=pluginArtifacts.iterator(); i.hasNext(); ) { Artifact artifact = (Artifact) i.next(); if ( artifact.getArtifactId().equals( id ) ) return artifact.getFile().getAbsolutePath(); } throw new MavenReportException( "JDiff jar not found in plugin artifacts." ); } private void generateReport( String srcDir, String oldApi, String newApi ) throws MavenReportException { JavadocBean javadoc = new JavadocBean(); javadoc.addArgument( "-private" ); javadoc.addArgumentPair( "d", outputDirectory ); javadoc.addArgumentPair( "sourcepath", srcDir ); javadoc.addArgumentPair( "classpath", getProjectClasspath() ); javadoc.addArgumentPair( "doclet", "jdiff.JDiff" ); javadoc.addArgumentPair( "docletpath", getPluginClasspath() ); javadoc.addArgumentPair( "oldapi", oldApi ); javadoc.addArgumentPair( "newapi", newApi ); javadoc.addArgument( "-stats" ); javadoc.addArgument( packages ); javadoc.execute( outputDirectory ); } private void generateSite() { Sink sink = getSink(); sink.head(); sink.title(); sink.text( "JDiff API Difference Report" ); sink.title_(); sink.head_(); sink.body(); sink.section1(); sink.sectionTitle1(); sink.text( "JDiff API Difference Report" ); sink.sectionTitle1_(); sink.paragraph(); sink.text( "The pages generated by JDiff is on a separate page. It can be found " ); sink.link( "jdiff/changes.html" ); sink.text( "here" ); sink.link_(); sink.text( "." ); sink.paragraph_(); sink.section1_(); sink.body_(); } private void log( String message ) { getLog().info( message ); } protected MavenProject getProject() { return project; } protected SiteRenderer getSiteRenderer() { return siteRenderer; } protected String getOutputDirectory() { return outputDirectory; } public String getDescription(Locale locale) { return "Maven 2.0 JDiff Plugin"; } public String getName(Locale locale) { return "JDiff"; } public String getOutputName() { return "jdiff"; } }