package org.codehaus.mojo.javancss; /* * 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. */ 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; /** * Check the build if for any Method with a ccn greater than a limit in the source code. Fails the build if told so. * * @author <a href="jeanlaurentATgmail.com">Jean-Laurent de Morlhon</a> * @version $Id$ * @goal check * @phase verify * @execute goal="report" */ public class NcssViolationCheckMojo extends AbstractMojo { /** * Specifies the location of the source files to be used. * * @parameter expression="${project.build.sourceDirectory}" * @required * @readonly */ private File sourceDirectory; /** * Specifies the directory where the XML report will be generated. * * @parameter default-value="${project.build.directory}" * @required */ // FIXME : same variable, same value in NCSSReportMojo... private File xmlOutputDirectory; /** * Whether to fail the build if the validation check fails. * * @parameter default-value="true" * @required */ private boolean failOnViolation; /** * Name of the file holding the xml file generated by JavaNCSS * * @parameter default-value="javancss-raw-report.xml" * @required */ // FIXME : same variable, same value in NCSSReportMojo... private String tempFileName; /** * CCN Limit, any code with a ccn greater than this number will generate a violation * * @parameter default-value="10" * @required */ private int ccnLimit; /** * ncss Limit, any code with a ncss greater than this number will generate a violation * * @parameter default-value="100" * @required */ private int ncssLimit; public void execute() throws MojoExecutionException, MojoFailureException { if ( sourceDirectory == null || !sourceDirectory.exists() ) { return; } Set ccnViolation = new HashSet(); Set ncssViolation = new HashSet(); List methodList = loadDocument().selectNodes( "//javancss/functions/function" ); // Count ccn & ncss violations Iterator nodeIterator = methodList.iterator(); while ( nodeIterator.hasNext() ) { Node node = (Node) nodeIterator.next(); // count ccn violation int ccn = new Integer( node.valueOf( "ccn" ) ).intValue(); if ( ccn > ccnLimit ) { ccnViolation.add( node.valueOf( "name" ) ); } // count ncss violation int ncss = new Integer( node.valueOf( "ncss" ) ).intValue(); if ( ncss > ncssLimit ) { ncssViolation.add( node.valueOf( "name" ) ); } } // crappy.... reportViolation( "ccn", ccnViolation, ccnLimit ); reportViolation( "ncss", ncssViolation, ncssLimit ); } private Document loadDocument() throws MojoFailureException { // FIXME: Building of File is strangely equivalent to method buildOutputFileName of NcssReportGenerator class... File ncssXmlFile = new File( xmlOutputDirectory, tempFileName ); try { return new SAXReader().read( ncssXmlFile ); } catch ( DocumentException de ) { throw new MojoFailureException( "Can't read javancss xml output file : " + ncssXmlFile ); } } private void reportViolation( String statName, Set violationSet, int limit ) throws MojoFailureException { getLog().debug( statName + " Violation = " + violationSet.size() ); if ( violationSet.size() > 0 ) { String violationString = "Your code has " + violationSet.size() + " method(s) with a " + statName + " greater than " + limit; getLog().warn( violationString ); Iterator iterator = violationSet.iterator(); while ( iterator.hasNext() ) { getLog().warn( " " + (String) iterator.next() ); } if ( failOnViolation ) { throw new MojoFailureException( violationString ); } } } }