blob: 37a1277826b3bef8655b156bd6777ba125a1f021 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package com.adobe.ac.pmd.metrics.maven;
import java.io.File;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import com.adobe.ac.pmd.LoggerUtils;
/**
* @goal check
* @execute goal="metrics"
*/
public final class FlexMetricsMojo extends AbstractMojo
{
/**
* CCN Limit, any code with a ccn greater than this number will generate a
* violation
*
* @parameter default-value="10"
* @required
*/
private int ccnLimit;
/**
* Whether to fail the build if the validation check fails.
*
* @parameter default-value="false"
* @required
*/
private boolean failOnViolation;
/**
* ncss Limit, any code with a ncss greater than this number will generate a
* violation
*
* @parameter default-value="100"
* @required
*/
private int ncssLimit;
/**
* Specifies the location of the source files to be used.
*
* @parameter expression="${project.build.sourceDirectory}"
* @required
* @readonly
*/
private File sourceDirectory;
/**
* Name of the file holding the xml file generated by JavaNCSS
*
* @parameter default-value="javancss-raw-report.xml"
* @required
*/
private String tempFileName;
/**
* Specifies the directory where the XML report will be generated.
*
* @parameter default-value="${project.build.directory}"
* @required
*/
private File xmlOutputDirectory;
public FlexMetricsMojo()
{
super();
}
public FlexMetricsMojo( final File outputDirectoryToBeSet,
final File sourceDirectoryToBeSet )
{
super();
xmlOutputDirectory = outputDirectoryToBeSet;
sourceDirectory = sourceDirectoryToBeSet;
}
@SuppressWarnings("unchecked")
public void execute() throws MojoExecutionException,
MojoFailureException
{
new LoggerUtils().loadConfiguration();
if ( sourceDirectory != null
&& sourceDirectory.exists() )
{
final Set< String > ccnViolation = new HashSet< String >();
final Set< String > ncssViolation = new HashSet< String >();
final List< Node > methodList = loadDocument().selectNodes( "//javancss/functions/function" );
for ( final Node node : methodList )
{
if ( Integer.valueOf( node.valueOf( "ccn" ) ) > ccnLimit )
{
ccnViolation.add( node.valueOf( "name" ) );
}
if ( Integer.valueOf( node.valueOf( "ncss" ) ) > ncssLimit )
{
ncssViolation.add( node.valueOf( "name" ) );
}
}
reportViolation( "ccn",
ccnViolation,
ccnLimit );
reportViolation( "ncss",
ncssViolation,
ncssLimit );
}
}
public void setCcnLimit( final int ccnLimitToBeSet )
{
ccnLimit = ccnLimitToBeSet;
}
public void setFailOnViolation( final boolean failOnViolationToBeSet )
{
failOnViolation = failOnViolationToBeSet;
}
public void setNcssLimit( final int ncssLimitToBeSet )
{
ncssLimit = ncssLimitToBeSet;
}
public void setTempFileName( final String tempFileNameToBeSet )
{
tempFileName = tempFileNameToBeSet;
}
public void setXmlOutputDirectory( final File xmlOutputDirectoryToBeSet )
{
xmlOutputDirectory = xmlOutputDirectoryToBeSet;
}
private Document loadDocument() throws MojoFailureException
{
final File ncssXmlFile = new File( xmlOutputDirectory
+ File.separator + tempFileName );
try
{
return new SAXReader().read( ncssXmlFile );
}
catch ( final DocumentException de )
{
throw new MojoFailureException( "Can't read javancss xml output file : "
+ ncssXmlFile, de );
}
}
private void reportViolation( final String statName,
final Set< String > violationSet,
final int limit ) throws MojoFailureException
{
getLog().debug( statName
+ " Violation = " + violationSet.size() );
if ( !violationSet.isEmpty() )
{
final String violationString = "Your code has "
+ violationSet.size() + " method(s) with a " + statName + " greater than " + limit;
getLog().warn( violationString );
final Iterator< String > iterator = violationSet.iterator();
while ( iterator.hasNext() )
{
getLog().warn( " "
+ iterator.next() );
}
if ( failOnViolation )
{
throw new MojoFailureException( violationString );
}
}
}
}