package org.codehaus.mojo.jlint;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.maven.doxia.tools.SiteTool;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.codehaus.doxia.site.renderer.SiteRenderer;
import org.codehaus.plexus.resource.ResourceManager;
import org.codehaus.plexus.resource.loader.FileResourceLoader;
/**
* @goal jlint
* @phase process-classes
*/
public class JlintCheckMojo
extends AbstractMojo
{
/**
* Location of the file.
*
* @parameter expression="${project.build.directory}"
* @required
*/
private File outputDirectory;
/**
* <p>
* Specifies the location of the XML configuration to use.
* </p>
* <p>
* Potential values are a filesystem path, a URL, or a classpath resource. This parameter expects that the contents
* of the location conform to the xml format (Jlint <a
* href="http://checkstyle.sourceforge.net/config.html#Modules">Checker module</a>) configuration of rulesets.
* </p>
* <p>
* This parameter is resolved as resource, URL, then file. If successfully resolved, the contents of the
* configuration is copied into the <code>${project.build.directory}/jlint-config.xml</code> file before being
* passed to Jlint as a configuration.
* </p>
* <p>
* There is 1 predefined ruleset.
* </p>
* <ul>
* <li><code>config/jlint_default_config.xml</code>: Sun Checks.</li>
* </ul>
*
* @parameter expression="${jlint.config.location}" default-value="config/jlint-default-config.xml"
*/
private String configLocation;
/**
* SiteTool.
*
* @since 2.2
* @component role="org.apache.maven.doxia.tools.SiteTool"
* @required
* @readonly
*/
protected SiteTool siteTool;
/**
* Specifies the path and filename to save the jlint output. The format of the output file is determined by the
* <code>outputFileFormat</code> parameter.
*
* @parameter expression="${jlint.output.file}" default-value="${project.build.directory}/jlint-violations.xml"
*/
private File outputFile;
/**
* Specifies the format of the output to be used when writing to the output file. Valid values are "plain" and
* "xml".
*
* @parameter expression="${jlint.output.format}" default-value="xml"
*/
private String outputFileFormat;
/**
* Specifies if the build should fail upon a violation.
*
* @parameter default-value="false"
*/
private boolean failsOnError;
/**
* Specifies the location of the source directory to be used for Jlint.
*
* @parameter default-value="${project.build.sourceDirectory}"
* @required
*/
private File sourceDirectory;
/**
* Specifies the location of the test source directory to be used for Jlint.
*
* @parameter default-value="${project.build.testSourceDirectory}"
* @since 2.2
*/
private File testSourceDirectory;
/**
* Include or not the test source directory to be used for Jlint.
*
* @parameter default-value="${false}"
* @since 2.2
*/
private boolean includeTestSourceDirectory;
/**
* The Maven Project Object.
*
* @parameter default-value="${project}"
* @required
* @readonly
*/
private MavenProject project;
/**
* Output errors to console.
*
* @parameter default-value="false"
*/
private boolean consoleOutput;
/**
* Link the violation line numbers to the source xref. Will link automatically if Maven JXR plugin is being used.
*
* @parameter expression="${linkXRef}" default-value="true"
* @since 2.1
*/
private boolean linkXRef;
/**
* Location of the Xrefs to link to.
*
* @parameter default-value="${project.reporting.outputDirectory}/xref"
*/
private File xrefLocation;
/**
* The file encoding to use when reading the source files. If the property <code>project.build.sourceEncoding</code>
* is not set, the platform default encoding is used. <strong>Note:</strong> This parameter always overrides the
* property <code>charset</code> from Checkstyle's <code>TreeWalker</code> module.
*
* @parameter expression="${encoding}" default-value="${project.build.sourceEncoding}"
* @since 2.2
*/
private String encoding;
/**
* @component
* @required
* @readonly
*/
private SiteRenderer siteRenderer;
/**
* @component
* @required
* @readonly
*/
private ResourceManager locator;
public void execute()
throws MojoExecutionException
{
getLog().debug( "Started maven-jlint-plugin: execute() method" );
getLog().info( "Running Maven-Jlint-Plugin : " );
// Setup ResourceManager
locator.addSearchPath( FileResourceLoader.ID, project.getFile().getParentFile().getAbsolutePath() );
locator.addSearchPath( "url", "" );
locator.setOutputDirectory( new File( project.getBuild().getDirectory() ) );
getLog().info( "Configuration File used: " + configLocation );
// File f = outputDirectory;
JlintViolationHandler violationHandler = new JlintViolationHandler( getLog() );
violationHandler.setTargetDir( outputDirectory.toString() );
violationHandler.setClassesDir( System.getProperty( "file.separator" ) + Constants.JLINT_CLASSES_DIR );
JlintConfiguration jlintConfig = new JlintConfiguration( locator, configLocation, getLog() );
String cmdDisableCategories = jlintConfig.getCategoriesToDisable( violationHandler.getDefaultMessageList() );
String cmd =
Constants.JLINT_CMD + cmdDisableCategories + outputDirectory.toString()
+ System.getProperty( "file.separator" ) + Constants.JLINT_CLASSES_DIR;
getLog().info(
"Classes Directory : " + outputDirectory.toString() + System.getProperty( "file.separator" )
+ Constants.JLINT_CLASSES_DIR );
getLog().debug( "Disabled Categories: " + cmdDisableCategories );
getLog().info( "Executing Jlint with command : [" + cmd + "]" );
// Open output files for writing
File xmlFile = new File( outputDirectory, Constants.JLINT_XML_OUTPUT_FILENAME );
File txtFile = new File( outputDirectory, Constants.JLINT_TXT_OUTPUT_FILENAME );
File errFile = new File( outputDirectory, Constants.JLINT_ERROR_FILENAME );
String s = null;
try
{
// run the Jlint command on the "classes" directory
getLog().debug( "execute: About to execute jlint command" );
Process p = Runtime.getRuntime().exec( cmd );
/*
* BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader
* stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); outputXmlFile = new
* BufferedWriter(new FileWriter(xmlFile)); outputTxtFile = new BufferedWriter(new FileWriter(txtFile));
* errorFile = new BufferedWriter(new FileWriter(errFile));
*/
FileOutputStream outputXmlFile = new FileOutputStream( xmlFile );
FileOutputStream outputTxtFile = new FileOutputStream( txtFile );
FileOutputStream errorFile = new FileOutputStream( errFile );
// Create the output file
/*
* outputXmlFile.write(Constants.XML_HEADER); outputXmlFile.newLine(); outputXmlFile.newLine();
* outputXmlFile.write(Constants.ROOT_START_TAG);
*/
StreamGobbler inputGobbler = new StreamGobbler( p.getInputStream(), outputXmlFile, outputTxtFile, "INPUT" );
inputGobbler.setViolationHandler( violationHandler );
StreamGobbler errorGobbler = new StreamGobbler( p.getErrorStream(), errorFile, "ERROR" );
getLog().info( "Reading the standard input and error for Jlint" );
inputGobbler.start();
errorGobbler.start();
int exitVal = p.waitFor();
getLog().info( "Jlint exited with status value: " + String.valueOf( exitVal ) );
if ( exitVal != 0 )
{
getLog().error( "Jlint did not execute properly. Check " + Constants.JLINT_ERROR_FILENAME + " file." );
}
inputGobbler.join();
errorGobbler.join();
getLog().info( "** Jlint Report: **" );
getLog().info( "-------------------" );
getLog().info(
"JLint Violations (if any): " + String.valueOf( inputGobbler.getNofLines() )
+ " violations reported." );
getLog().info( "Jlint Error Messages (if any): " );
for ( String msg : errorGobbler.getErrorMsgList() )
{
getLog().error( msg );
}
getLog().info( "----End Report-----" );
}
catch ( IOException e )
{
System.out.println( "JLint: Exception Occured: " );
e.printStackTrace();
// System.exit(-1);
}
catch ( InterruptedException e )
{
System.out.println( "JLint: Exception Occured: " );
e.printStackTrace();
}
}
}