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.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.doxia.sink.Sink;
import org.dom4j.Document;
import org.dom4j.Node;
/**
* Generates the javaNcss maven report.
*
* @author <a href="jeanlaurentATgmail.com">Jean-Laurent de Morlhon</a>
* @version $Id$
*/
public class NcssReportGenerator
extends AbstractNcssReportGenerator
{
private String xrefLocation;
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.
* @param log the log to output log with.
* @param xrefLocation the location of the xref file.
*/
public NcssReportGenerator( Sink sink, ResourceBundle bundle, Log log, String xrefLocation )
{
super( sink, bundle, log );
this.xrefLocation = xrefLocation;
}
/**
* Generates the JavaNcss reports.
*
* @param document the javaNcss raw report as an XML document.
* @param lineThreshold the maximum number of lines to keep in major reports.
*/
public void doReport( Document document, int lineThreshold )
{
this.lineThreshold = lineThreshold;
// HEADER
getSink().head();
getSink().title();
getSink().text( getString( "report.javancss.title" ) );
getSink().title_();
getSink().head_();
// BODY
getSink().body();
doIntro( true );
// 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_();
getSink().close();
}
private void doMainPackageAnalysis( Document document )
{
subtitleHelper( getString( "report.javancss.package.text" ) );
getSink().table();
getSink().tableRow();
// HEADER
headerCellHelper( getString( "report.javancss.header.package" ) );
headerCellHelper( getString( "report.javancss.header.classe" ) );
headerCellHelper( getString( "report.javancss.header.function" ) );
headerCellHelper( getString( "report.javancss.header.ncss" ) );
headerCellHelper( getString( "report.javancss.header.javadoc" ) );
headerCellHelper( getString( "report.javancss.header.javadoc_line" ) );
headerCellHelper( getString( "report.javancss.header.single_comment" ) );
headerCellHelper( getString( "report.javancss.header.multi_comment" ) );
getSink().tableRow_();
// DATA
List list = document.selectNodes( "//javancss/packages/package" );
Collections.sort( list, new NumericNodeComparator( "ncss" ) );
Iterator nodeIterator = list.iterator();
while ( nodeIterator.hasNext() )
{
Node node = (Node) nodeIterator.next();
getSink().tableRow();
tableCellHelper( node.valueOf( "name" ) );
tableCellHelper( node.valueOf( "classes" ) );
tableCellHelper( node.valueOf( "functions" ) );
tableCellHelper( node.valueOf( "ncss" ) );
tableCellHelper( node.valueOf( "javadocs" ) );
tableCellHelper( node.valueOf( "javadoc_lines" ) );
tableCellHelper( node.valueOf( "single_comment_lines" ) );
tableCellHelper( node.valueOf( "multi_comment_lines" ) );
getSink().tableRow_();
}
getSink().table_();
}
private void doTotalPackageAnalysis( Document document )
{
getSink().table();
getSink().tableRow();
headerCellHelper( getString( "report.javancss.header.classetotal" ) );
headerCellHelper( getString( "report.javancss.header.functiontotal" ) );
headerCellHelper( getString( "report.javancss.header.ncsstotal" ) );
headerCellHelper( getString( "report.javancss.header.javadoc" ) );
headerCellHelper( getString( "report.javancss.header.javadoc_line" ) );
headerCellHelper( getString( "report.javancss.header.single_comment" ) );
headerCellHelper( getString( "report.javancss.header.multi_comment" ) );
getSink().tableRow_();
Node node = document.selectSingleNode( "//javancss/packages/total" );
getSink().tableRow();
tableCellHelper( node.valueOf( "classes" ) );
tableCellHelper( node.valueOf( "functions" ) );
tableCellHelper( node.valueOf( "ncss" ) );
tableCellHelper( node.valueOf( "javadocs" ) );
tableCellHelper( node.valueOf( "javadoc_lines" ) );
tableCellHelper( node.valueOf( "single_comment_lines" ) );
tableCellHelper( node.valueOf( "multi_comment_lines" ) );
getSink().tableRow_();
getSink().table_();
}
private void doTopObjectNcss( Document document )
{
subtitleHelper( getString( "report.javancss.top" ) + " " + lineThreshold + " "
+ getString( "report.javancss.object.byncss" ) );
List nodeList = document.selectNodes( "//javancss/objects/object" );
Collections.sort( nodeList, new NumericNodeComparator( "ncss" ) );
doTopObjectGeneric( nodeList );
}
private void doTopObjectFunctions( Document document )
{
subtitleHelper( getString( "report.javancss.top" ) + " " + lineThreshold + " "
+ getString( "report.javancss.object.byfunction" ) );
List nodeList = document.selectNodes( "//javancss/objects/object" );
Collections.sort( nodeList, new NumericNodeComparator( "functions" ) );
doTopObjectGeneric( nodeList );
}
// generic method called by doTopObjectFunctions & doTopObjectNCss
private void doTopObjectGeneric( List nodeList )
{
getSink().table();
getSink().tableRow();
headerCellHelper( getString( "report.javancss.header.object" ) );
headerCellHelper( getString( "report.javancss.header.ncss" ) );
headerCellHelper( getString( "report.javancss.header.function" ) );
headerCellHelper( getString( "report.javancss.header.classe" ) );
headerCellHelper( getString( "report.javancss.header.javadoc" ) );
getSink().tableRow_();
Iterator nodeIterator = nodeList.iterator();
int i = 0;
while ( nodeIterator.hasNext() && ( i++ < lineThreshold ) )
{
Node node = (Node) nodeIterator.next();
getSink().tableRow();
getSink().tableCell();
jxrLink( node.valueOf( "name" ) );
getSink().tableCell_();
tableCellHelper( node.valueOf( "ncss" ) );
tableCellHelper( node.valueOf( "functions" ) );
tableCellHelper( node.valueOf( "classes" ) );
tableCellHelper( node.valueOf( "javadocs" ) );
getSink().tableRow_();
}
getSink().table_();
}
private void doObjectAverage( Document document )
{
subtitleHelper( getString( "report.javancss.averages" ) );
getSink().table();
getSink().tableRow();
headerCellHelper( getString( "report.javancss.header.ncssaverage" ) );
headerCellHelper( getString( "report.javancss.header.programncss" ) );
headerCellHelper( getString( "report.javancss.header.classeaverage" ) );
headerCellHelper( getString( "report.javancss.header.functionaverage" ) );
headerCellHelper( getString( "report.javancss.header.javadocaverage" ) );
getSink().tableRow_();
Node node = document.selectSingleNode( "//javancss/objects/averages" );
String totalNcss = document.selectSingleNode( "//javancss/objects/ncss" ).getText();
getSink().tableRow();
tableCellHelper( node.valueOf( "ncss" ) );
tableCellHelper( totalNcss );
tableCellHelper( node.valueOf( "classes" ) );
tableCellHelper( node.valueOf( "functions" ) );
tableCellHelper( node.valueOf( "javadocs" ) );
getSink().tableRow_();
getSink().table_();
}
private void doFunctionAnalysis( Document document )
{
subtitleHelper( getString( "report.javancss.top" ) + " " + lineThreshold + " "
+ getString( "report.javancss.function.byncss" ) );
getSink().table();
getSink().tableRow();
headerCellHelper( getString( "report.javancss.header.function" ) );
headerCellHelper( getString( "report.javancss.header.ncss" ) );
headerCellHelper( getString( "report.javancss.header.ccn" ) );
headerCellHelper( getString( "report.javancss.header.javadoc" ) );
getSink().tableRow_();
List list = document.selectNodes( "//javancss/functions/function" );
Collections.sort( list, new NumericNodeComparator( "ncss" ) );
Iterator nodeIterator = list.iterator();
int i = 0;
while ( nodeIterator.hasNext() && ( i++ < lineThreshold ) )
{
Node node = (Node) nodeIterator.next();
getSink().tableRow();
getSink().tableCell();
jxrFunctionLink( node.valueOf( "name" ) );
getSink().tableCell_();
tableCellHelper( node.valueOf( "ncss" ) );
tableCellHelper( node.valueOf( "ccn" ) );
tableCellHelper( node.valueOf( "javadocs" ) );
getSink().tableRow_();
}
getSink().table_();
}
private void doFunctionAverage( Document document )
{
subtitleHelper( getString( "report.javancss.averages" ) );
getSink().table();
getSink().tableRow();
headerCellHelper( getString( "report.javancss.header.programncss" ) );
headerCellHelper( getString( "report.javancss.header.ncssaverage" ) );
headerCellHelper( getString( "report.javancss.header.ccnaverage" ) );
headerCellHelper( getString( "report.javancss.header.javadocaverage" ) );
getSink().tableRow_();
Node node = document.selectSingleNode( "//javancss/functions/function_averages" );
String totalNcss = document.selectSingleNode( "//javancss/functions/ncss" ).getText();
getSink().tableRow();
tableCellHelper( totalNcss );
tableCellHelper( node.valueOf( "ncss" ) );
tableCellHelper( node.valueOf( "ccn" ) );
tableCellHelper( node.valueOf( "javadocs" ) );
getSink().tableRow_();
getSink().table_();
}
private void doExplanation()
{
subtitleHelper( getString( "report.javancss.explanation.ncss.title" ) );
paragraphHelper( getString( "report.javancss.explanation.ncss.paragraph1" ) );
paragraphHelper( getString( "report.javancss.explanation.ncss.paragraph2" ) );
getSink().table();
getSink().tableRow();
headerCellHelper( "" );
headerCellHelper( getString( "report.javancss.explanation.ncss.table.examples" ) );
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getString( "report.javancss.explanation.ncss.table.package" ) );
codeCellHelper( "package java.lang;" );
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getString( "report.javancss.explanation.ncss.table.import" ) );
codeCellHelper( "import java.awt.*;" );
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( 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( getString( "report.javancss.explanation.ncss.table.interface" ) );
codeCellHelper( "public interface Able ; {" );
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getString( "report.javancss.explanation.ncss.table.field" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "int a; " );
codeItemListHelper( "int a, b, c = 5, d = 6;" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getString( "report.javancss.explanation.ncss.table.method" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "public void cry();" );
codeItemListHelper( "public void gib() throws DeadException {" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getString( "report.javancss.explanation.ncss.table.constructorD" ) );
codeCellHelper( "public Foo() {" );
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( getString( "report.javancss.explanation.ncss.table.constructorI" ) );
getSink().tableCell();
getSink().list();
codeItemListHelper( "this();" );
codeItemListHelper( "super();" );
getSink().list_();
getSink().tableCell_();
getSink().tableRow_();
getSink().tableRow();
tableCellHelper( 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_();
getSink().tableRow();
tableCellHelper( getString( "report.javancss.explanation.ncss.table.label" ) );
codeCellHelper( "fine :" );
getSink().tableRow_();
getSink().table_();
paragraphHelper( getString( "report.javancss.explanation.ncss.paragraph3" ) );
// CCN Explanation
subtitleHelper( getString( "report.javancss.explanation.ccn.title" ) );
paragraphHelper( getString( "report.javancss.explanation.ccn.paragraph1" ) );
paragraphHelper( getString( "report.javancss.explanation.ccn.paragraph2" ) );
getSink().list();
codeItemListHelper( "if" );
codeItemListHelper( "for" );
codeItemListHelper( "while" );
codeItemListHelper( "case" );
codeItemListHelper( "catch" );
getSink().list_();
paragraphHelper( getString( "report.javancss.explanation.ccn.paragraph3" ) );
getSink().list();
codeItemListHelper( "if" );
codeItemListHelper( "for" );
getSink().list_();
paragraphHelper( getString( "report.javancss.explanation.ccn.paragraph4" ) );
paragraphHelper( getString( "report.javancss.explanation.ccn.paragraph5" ) );
}
// sink helper to start a section
protected void startSection( String link, String title )
{
super.startSection( link, title );
navigationBar();
}
protected void jxrLink( String clazz )
{
if ( xrefLocation != null )
{
getSink().link( xrefLocation + "/" + clazz.replace( '.', '/' ) + ".html" );
}
getSink().text( clazz );
if ( xrefLocation != null )
{
getSink().link_();
}
}
protected void jxrFunctionLink( String clazz )
{
int indexDot = -1;
if ( xrefLocation != null )
{
indexDot = clazz.lastIndexOf( '.' );
if ( indexDot != -1 )
{
getSink().link( xrefLocation + "/" + clazz.substring( 0, indexDot ).replace( '.', '/' ) + ".html" );
}
}
getSink().text( clazz );
if ( xrefLocation != null && indexDot != -1 )
{
getSink().link_();
}
}
}