blob: a3bc69b77fe87492240f98557515abad8dcab6a3 [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.generators;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.plugin.logging.Log;
import org.dom4j.Document;
import org.dom4j.Node;
import com.adobe.ac.pmd.metrics.maven.utils.NumericNodeComparator;
/**
* Generates the javaNcss maven report.
*
* @author <a href="jeanlaurentATgmail.com">Jean-Laurent de Morlhon</a>
* @version $Id: NcssReportGenerator.java 3286 2007-02-08 20:18:51Z jeanlaurent
* $
*/
public class NcssReportGenerator extends NcssReportGeneratorBase
{
private static final String CLASSES = "classes";
private static final String FUNCTIONS = "functions";
private static final String NAME = "name";
private static final String NCSS = "ncss";
private int lineThreshold;
/**
* build a new NcssReportGenerator.
*
* @param sink the sink which will be used for reporting.
* @param bundle the correct RessourceBundle to be used for reporting.
*/
public NcssReportGenerator( final Sink sink,
final ResourceBundle bundle,
final Log log )
{
super( sink, bundle, log );
}
/**
* Generates the JavaNcss reports.
*
* @param document the javaNcss raw report as an XML document.
* @param lineThresholdToBeSet the maximum number of lines to keep in major
* reports.
*/
public void doReport( final Document document,
final int lineThresholdToBeSet )
{
lineThreshold = lineThresholdToBeSet;
// HEADER
getSink().head();
getSink().title();
getSink().text( getResourceBundle().getString( "report.javancss.title" ) );
getSink().title_();
getSink().head_();
// BODY
getSink().body();
doIntro();
// packages
startSection( "report.javancss.package.link",
"report.javancss.package.title" );
doMainPackageAnalysis( document );
doTotalPackageAnalysis( document );
endSection();
// Objects
startSection( "report.javancss.object.link",
"report.javancss.object.title" );
doTopObjectNcss( document );
doTopObjectFunctions( document );
doObjectAverage( document );
endSection();
// Functions
startSection( "report.javancss.function.link",
"report.javancss.function.title" );
doFunctionAnalysis( document );
doFunctionAverage( document );
endSection();
// Explanation
startSection( "report.javancss.explanation.link",
"report.javancss.explanation.title" );
doExplanation();
endSection();
getSink().body_();
}
// sink helper to start a section
@Override
protected void startSection( final String link,
final String title )
{
super.startSection( link,
title );
navigationBar();
}
private void doExplanation()
{
explainNcss();
explainCcn();
}
@SuppressWarnings("unchecked")
private void doFunctionAnalysis( final Document document )
{
subtitleHelper( getResourceBundle().getString( "report.javancss.top" )
+ " " + lineThreshold + " " + getResourceBundle().getString( "report.javancss.function.byncss" ) );
getSink().paragraph();
getSink().table();
getSink().tableRow();
headerCellHelper( getResourceBundle().getString( "report.javancss.header.function" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ncss" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ccn" ) );
getSink().tableRow_();
final List< Node > list = document.selectNodes( "//javancss/functions/function" );
Collections.sort( list,
new NumericNodeComparator( NCSS ) );
final Iterator< Node > nodeIterator = list.iterator();
int currentIndex = 0;
while ( nodeIterator.hasNext()
&& currentIndex++ < lineThreshold )
{
final Node node = nodeIterator.next();
getSink().tableRow();
// getSink().tableCell();
// getSink().tableCell_();
tableCellHelper( node.valueOf( "name" ) );
tableCellHelper( node.valueOf( NCSS ) );
tableCellHelper( node.valueOf( "ccn" ) );
getSink().tableRow_();
}
getSink().table_();
getSink().paragraph_();
}
private void doFunctionAverage( final Document document )
{
subtitleHelper( getResourceBundle().getString( "report.javancss.averages" ) );
getSink().paragraph();
getSink().table();
getSink().tableRow();
headerCellHelper( getResourceBundle().getString( "report.javancss.header.programncss" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ncssaverage" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ccnaverage" ) );
getSink().tableRow_();
final Node node = document.selectSingleNode( "//javancss/functions/function_averages" );
final String totalNcss = document.selectSingleNode( "//javancss/functions/ncss" ).getText();
getSink().tableRow();
tableCellHelper( totalNcss );
tableCellHelper( node.valueOf( NCSS ) );
tableCellHelper( node.valueOf( "ccn" ) );
getSink().tableRow_();
getSink().table_();
getSink().paragraph_();
}
private void doIntro()
{
getSink().section1();
getSink().sectionTitle1();
getSink().text( getResourceBundle().getString( "report.javancss.main.title" ) );
getSink().sectionTitle1_();
getSink().paragraph();
navigationBar();
getSink().text( getResourceBundle().getString( "report.javancss.main.text" )
+ " " );
getSink().lineBreak();
getSink().link( "http://www.kclee.de/clemens/java/javancss/" );
getSink().text( "JavaNCSS web site." );
getSink().link_();
getSink().paragraph_();
getSink().section1_();
}
@SuppressWarnings("unchecked")
private void doMainPackageAnalysis( final Document document )
{
subtitleHelper( getResourceBundle().getString( "report.javancss.package.text" ) );
getSink().table();
getSink().tableRow();
// HEADER
headerCellHelper( getResourceBundle().getString( "report.javancss.header.package" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.classe" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.function" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ncss" ) );
getSink().tableRow_();
// DATA
final List< Node > list = document.selectNodes( "//javancss/packages/package" );
Collections.sort( list,
new NumericNodeComparator( NCSS ) );
for ( final Node node : list )
{
getSink().tableRow();
tableCellHelper( node.valueOf( NAME ) );
tableCellHelper( node.valueOf( CLASSES ) );
tableCellHelper( node.valueOf( FUNCTIONS ) );
tableCellHelper( node.valueOf( NCSS ) );
getSink().tableRow_();
}
getSink().table_();
}
private void doObjectAverage( final Document document )
{
subtitleHelper( getResourceBundle().getString( "report.javancss.averages" ) );
getSink().table();
getSink().tableRow();
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ncssaverage" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.classeaverage" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.functionaverage" ) );
getSink().tableRow_();
final Node node = document.selectSingleNode( "//javancss/objects/averages" );
getSink().tableRow();
tableCellHelper( node.valueOf( NCSS ) );
tableCellHelper( node.valueOf( CLASSES ) );
tableCellHelper( node.valueOf( FUNCTIONS ) );
getSink().tableRow_();
getSink().table_();
}
@SuppressWarnings("unchecked")
private void doTopObjectFunctions( final Document document )
{
subtitleHelper( getResourceBundle().getString( "report.javancss.top" )
+ " " + lineThreshold + " " + getResourceBundle().getString( "report.javancss.object.byfunction" ) );
final List< Node > nodeList = document.selectNodes( "//javancss/objects/object" );
Collections.sort( nodeList,
new NumericNodeComparator( FUNCTIONS ) );
doTopObjectGeneric( nodeList );
}
// generic method called by doTopObjectFunctions & doTopObjectNCss
private void doTopObjectGeneric( final List< Node > nodeList )
{
getSink().table();
getSink().tableRow();
headerCellHelper( getResourceBundle().getString( "report.javancss.header.object" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ncss" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.function" ) );
getSink().tableRow_();
final Iterator< Node > nodeIterator = nodeList.iterator();
int currentIndex = 0;
while ( nodeIterator.hasNext()
&& currentIndex++ < lineThreshold )
{
final Node node = nodeIterator.next();
getSink().tableRow();
tableCellHelper( node.valueOf( NAME ) );
tableCellHelper( node.valueOf( NCSS ) );
tableCellHelper( node.valueOf( FUNCTIONS ) );
getSink().tableRow_();
}
getSink().table_();
}
@SuppressWarnings("unchecked")
private void doTopObjectNcss( final Document document )
{
subtitleHelper( getResourceBundle().getString( "report.javancss.top" )
+ " " + lineThreshold + " " + getResourceBundle().getString( "report.javancss.object.byncss" ) );
final List< Node > nodeList = document.selectNodes( "//javancss/objects/object" );
Collections.sort( nodeList,
new NumericNodeComparator( NCSS ) );
doTopObjectGeneric( nodeList );
}
private void doTotalPackageAnalysis( final Document document )
{
getSink().table();
getSink().tableRow();
headerCellHelper( getResourceBundle().getString( "report.javancss.header.classetotal" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.functiontotal" ) );
headerCellHelper( getResourceBundle().getString( "report.javancss.header.ncsstotal" ) );
getSink().tableRow_();
final Node node = document.selectSingleNode( "//javancss/packages/total" );
getSink().tableRow();
tableCellHelper( node.valueOf( CLASSES ) );
tableCellHelper( node.valueOf( FUNCTIONS ) );
tableCellHelper( node.valueOf( NCSS ) );
getSink().tableRow_();
getSink().table_();
}
private void explainCcn()
{
subtitleHelper( getResourceBundle().getString( "report.javancss.explanation.ccn.title" ) );
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ccn.paragraph1" ) );
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ccn.paragraph2" ) );
getSink().list();
codeItemListHelper( "if" );
codeItemListHelper( "for" );
codeItemListHelper( "while" );
codeItemListHelper( "case" );
codeItemListHelper( "catch" );
getSink().list_();
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ccn.paragraph3" ) );
getSink().list();
codeItemListHelper( "if" );
codeItemListHelper( "for" );
getSink().list_();
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ccn.paragraph4" ) );
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ccn.paragraph5" ) );
}
private void explainClasses()
{
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.class" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "public class Foo {" );
codeItemListHelper( "public class Foo extends Bla {" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.interface" ) );
codeCellHelper( "public interface Able {" );
getSink().tableRow_();
}
private void explainFunction()
{
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.method" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "public function cry() : void{}" );
codeItemListHelper( "public function gib() : DeadResult {}" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.constructorD" ) );
codeCellHelper( "public Foo() {" );
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.constructorI" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "super();" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
}
private void explainNcss()
{
subtitleHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.title" ) );
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.paragraph1" ) );
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.paragraph2" ) );
getSink().table();
getSink().tableRow();
headerCellHelper( "" );
headerCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.examples" ) );
getSink().tableRow_();
explainPackage();
explainClasses();
explainVariable();
explainFunction();
explainStatement();
getSink().table_();
paragraphHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.paragraph3" ) );
}
private void explainPackage()
{
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.package" ) );
codeCellHelper( "package com.adobe.ac {}" );
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.import" ) );
codeCellHelper( "import com.adobe.ac.*;" );
getSink().tableRow_();
}
private void explainStatement()
{
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.statement" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "i = 0;" );
codeItemListHelper( "if (ok)" );
codeItemListHelper( "if (exit) {" );
codeItemListHelper( "if (3 == 4);" );
codeItemListHelper( "if (4 == 4) { ;" );
codeItemListHelper( "} else {" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
}
private void explainVariable()
{
getSink().tableRow();
tableCellHelper( getResourceBundle().getString( "report.javancss.explanation.ncss.table.field" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "var a : Number;" );
codeItemListHelper( "var a : Number = 1;" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
}
// print out the navigation bar
private void navigationBar()
{
getSink().paragraph();
getSink().text( "[ " );
getSink().link( "#"
+ getResourceBundle().getString( "report.javancss.package.link" ) );
getSink().text( getResourceBundle().getString( "report.javancss.package.link" ) );
getSink().link_();
getSink().text( " ] [ " );
getSink().link( "#"
+ getResourceBundle().getString( "report.javancss.object.link" ) );
getSink().text( getResourceBundle().getString( "report.javancss.object.link" ) );
getSink().link_();
getSink().text( " ] [ " );
getSink().link( "#"
+ getResourceBundle().getString( "report.javancss.function.link" ) );
getSink().text( getResourceBundle().getString( "report.javancss.function.link" ) );
getSink().link_();
getSink().text( " ] [ " );
getSink().link( "#"
+ getResourceBundle().getString( "report.javancss.explanation.link" ) );
getSink().text( getResourceBundle().getString( "report.javancss.explanation.link" ) );
getSink().link_();
getSink().text( " ]" );
getSink().paragraph_();
}
}