package org.codehaus.mojo.dashboard.report.plugin;
/*
* Copyright 2006 David Vicente
*
* Licensed 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.IOException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.mojo.dashboard.report.plugin.beans.CheckstyleError;
import org.codehaus.mojo.dashboard.report.plugin.beans.CheckstyleReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.CloverReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.CoberturaReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.CpdReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.DashBoardMavenProject;
import org.codehaus.mojo.dashboard.report.plugin.beans.FindBugsReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.IDashBoardReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.JDependReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.PmdReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.SurefireReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.TagListReportBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.XRefPackageBean;
import org.codehaus.mojo.dashboard.report.plugin.beans.comparator.DescNbErrorCheckstyleComparator;
import org.codehaus.mojo.dashboard.report.plugin.chart.BarChartRenderer;
import org.codehaus.mojo.dashboard.report.plugin.chart.CheckstyleErrorsPieChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.CheckstylePieChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.CloverBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.CoberturaBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.FindbugsCategoriesPieChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.FindbugsPrioritiesPieChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.IChartRenderer;
import org.codehaus.mojo.dashboard.report.plugin.chart.PieChart3DRenderer;
import org.codehaus.mojo.dashboard.report.plugin.chart.PieChartRenderer;
import org.codehaus.mojo.dashboard.report.plugin.chart.SurefirePieChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.TaglistPieChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.utils.ChartUtils;
/**
* <ul>
* <li>Add "CheckStyle Violations" graph written by <a href="mailto:srivollet@objectif-informatique.fr">Sylvain
* Rivollet</a></li>
* <li>Add Clover support written by <a href="mailto:mbeerman@yahoo.com">Matthew Beermann</a></li>
* <li>Add Taglist support written by <a href="mailto:henrik.lynggaard@gmail.com">Henrik Lynggaard</a></li>
* </ul>
*
* @author <a href="dvicente72@gmail.com">David Vicente</a>
*/
public class DashBoardReportGenerator extends AbstractDashBoardGenerator
{
/**
*
*/
private static final int SPECIFIC_WIDTH = 800;
/**
*
*/
private final DashBoardMavenProject mavenProject;
private final Map map = new Hashtable();
private boolean isDBAvailable = false;
private boolean generateGraphs = true;
/**
*
*/
private boolean summary = false;
public DashBoardReportGenerator( DashBoardMavenProject mavenProject, boolean summary, boolean isDBAvailable,
boolean generateGraphs, Log log )
{
super( log );
this.mavenProject = mavenProject;
this.summary = summary;
this.isDBAvailable = isDBAvailable;
this.generateGraphs = generateGraphs;
Set reports = mavenProject.getReports();
Iterator iter = reports.iterator();
while ( iter.hasNext() )
{
IDashBoardReportBean report = (IDashBoardReportBean) iter.next();
if ( report != null )
{
this.map.put( report.getClass(), report );
}
}
}
public void doGenerateReport( ResourceBundle bundle, Sink sink )
{
this.createTitle( bundle, sink );
addDashboardCss(sink);
sink.body();
sink.anchor( "top" );
sink.anchor_();
this.createHeader( bundle, sink );
if ( this.map.get( CoberturaReportBean.class ) != null )
{
this.createCoberturaSection( bundle, sink, (CoberturaReportBean) this.map.get( CoberturaReportBean.class ) );
}
if ( this.map.get( CloverReportBean.class ) != null )
{
this.createCloverSection( bundle, sink, (CloverReportBean) this.map.get( CloverReportBean.class ) );
}
if ( this.map.get( SurefireReportBean.class ) != null )
{
this.createSurefireSection( bundle, sink, (SurefireReportBean) this.map.get( SurefireReportBean.class ) );
}
if ( this.map.get( CheckstyleReportBean.class ) != null )
{
this.createCheckStyleSection( bundle, sink,
(CheckstyleReportBean) this.map.get( CheckstyleReportBean.class ) );
}
if ( this.map.get( PmdReportBean.class ) != null )
{
this.createPmdSection( bundle, sink, (PmdReportBean) this.map.get( PmdReportBean.class ) );
}
if ( this.map.get( CpdReportBean.class ) != null )
{
this.createCpdSection( bundle, sink, (CpdReportBean) this.map.get( CpdReportBean.class ) );
}
if ( this.map.get( FindBugsReportBean.class ) != null )
{
this.createFindBugsSection( bundle, sink, (FindBugsReportBean) this.map.get( FindBugsReportBean.class ) );
}
if ( this.map.get( JDependReportBean.class ) != null )
{
this.createJDependSection( bundle, sink, (JDependReportBean) this.map.get( JDependReportBean.class ) );
}
if ( this.map.get( TagListReportBean.class ) != null )
{
this.createTaglistSection( bundle, sink, (TagListReportBean) this.map.get( TagListReportBean.class ) );
}
sink.body_();
sink.flush();
sink.close();
}
public void createTitle( ResourceBundle bundle, Sink sink )
{
sink.head();
sink.title();
sink.text( bundle.getString( "dashboard.report.name" ) );
sink.title_();
sink.head_();
}
public void createHeader( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle1();
sink.text( bundle.getString( "dashboard.report.name" ) );
sink.sectionTitle1_();
sink.text( "Date Generated: " + new SimpleDateFormat().format( new Date( System.currentTimeMillis() ) ) );
sink.horizontalRule();
if ( this.summary )
{
sink.sectionTitle3();
sink.text( "[" );
sink.link( "dashboard-report-details.html" );
sink.text( "Detailed Dashboard" );
sink.link_();
sink.text( "]" );
sink.sectionTitle3_();
sink.horizontalRule();
}
if ( this.map.get( CoberturaReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#cobertura" );
sink.text( bundle.getString( "report.cobertura.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( CloverReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#clover" );
sink.text( bundle.getString( "report.clover.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( SurefireReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#surefire" );
sink.text( bundle.getString( "report.surefire.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( CheckstyleReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#checkstyle" );
sink.text( bundle.getString( "report.checkstyle.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( PmdReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#pmd" );
sink.text( bundle.getString( "report.pmd.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( CpdReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#cpd" );
sink.text( bundle.getString( "report.cpd.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( FindBugsReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#findbugs" );
sink.text( bundle.getString( "report.findbugs.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( JDependReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#jdepend" );
sink.text( bundle.getString( "report.xrefpackage.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( this.map.get( TagListReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#taglist" );
sink.text( bundle.getString( "report.taglist.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
sink.horizontalRule();
sink.lineBreak();
if ( !this.generateGraphs )
{
sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
sink.lineBreak();
}
sink.section1_();
}
public void createSurefireSection( ResourceBundle bundle, Sink sink, SurefireReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "surefire" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#surefire" );
sink.text( bundle.getString( "report.surefire.header" ) );
sink.link_();
}
else
{
sink.link( "./surefire-report.html" );
sink.text( bundle.getString( "report.surefire.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "surefire" );
}
sink.section1_();
sink.lineBreak();
sink.table();
sink.tableRow();
this.sinkHeader( sink, bundle.getString( "report.surefire.label.successrate" ) );
this.sinkHeader( sink, bundle.getString( "report.surefire.label.tests" ) );
this.sinkHeader( sink, bundle.getString( "report.surefire.label.errors" ) );
this.sinkHeader( sink, bundle.getString( "report.surefire.label.failures" ) );
this.sinkHeader( sink, bundle.getString( "report.surefire.label.skipped" ) );
this.sinkHeader( sink, bundle.getString( "report.surefire.label.time" ) );
sink.tableRow_();
if ( report != null )
{
// List testSuites = report.parseXMLReportFiles();
// Map summary = report.getSummary( testSuites );
sink.tableRow();
this.sinkCellPercentGraphic( sink, report.getSucessRate() / 100, "surefire" );
this.sinkCell( sink, Integer.toString( report.getNbTests() ) );
this.sinkCell( sink, Integer.toString( report.getNbErrors() ) );
this.sinkCell( sink, Integer.toString( report.getNbFailures() ) );
this.sinkCell( sink, Integer.toString( report.getNbSkipped() ) );
this.sinkCell( sink, Double.toString( report.getElapsedTime() ) );
sink.tableRow_();
}
else
{
sink.tableRow();
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" + "%" );
this.sinkCell( sink, "0" );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new PieChartRenderer(
new SurefirePieChartStrategy( bundle, this.mavenProject.getProjectName(), report ),
DashBoardReportGenerator.SPECIFIC_WIDTH, ChartUtils.STANDARD_HEIGHT );
if ( !chart.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_Surefire." + chart.getFileExtension();
}
else
{
filename += "_Surefire." + chart.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
this.getLog().debug( "createSurefireGraph = " + filename );
try
{
chart.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createSurefireGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text("[" + bundle.getString("dashboard.report.generategraphs.disabled") + "]");
// sink.lineBreak();
// }
}
/**
* Fixes MOJO-813. addition of Clover support. written by <a href="mailto:mbeerman@yahoo.com">Matthew Beermann</a>
*
* @param bundle
* @param sink
*/
public void createCloverSection( ResourceBundle bundle, Sink sink, CloverReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "clover" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#clover" );
sink.text( bundle.getString( "report.clover.header" ) );
sink.link_();
}
else
{
sink.link( "./clover/index.html" );
sink.text( bundle.getString( "report.clover.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "clover" );
}
sink.section1_();
sink.lineBreak();
sink.table();
sink.tableRow();
this.sinkHeader( sink, bundle.getString( "report.clover.label.total" ) );
this.sinkHeader( sink, bundle.getString( "report.clover.label.conditionals" ) );
this.sinkHeader( sink, bundle.getString( "report.clover.label.statements" ) );
this.sinkHeader( sink, bundle.getString( "report.clover.label.methods" ) );
sink.tableRow_();
if ( report != null )
{
sink.tableRow();
if ( this.generateGraphs )
{
this.sinkCell( sink, report.getElementsLabel() );
this.sinkCell( sink, report.getConditionalsLabel() );
this.sinkCell( sink, report.getStatementsLabel() );
this.sinkCell( sink, report.getMethodsLabel() );
}
else
{
sink.tableCell();
sinkPercentGraphic( sink, report.getPercentCoveredConditionals() );
sink.text( "(" + report.getCoveredElements() + " / " + report.getElements() + ")" );
sink.tableCell_();
sink.tableCell();
sinkPercentGraphic( sink, report.getPercentCoveredConditionals() );
sink.text( "(" + report.getCoveredConditionals() + " / " + report.getConditionals() + ")" );
sink.tableCell_();
sink.tableCell();
sinkPercentGraphic( sink, report.getPercentCoveredStatements() );
sink.text( "(" + report.getCoveredStatements() + " / " + report.getStatements() + ")" );
sink.tableCell_();
sink.tableCell();
sinkPercentGraphic( sink, report.getPercentCoveredMethods() );
sink.text( "(" + report.getCoveredMethods() + " / " + report.getMethods() + ")" );
sink.tableCell_();
}
sink.tableRow_();
}
else
{
sink.tableRow();
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" );
this.sinkCell( sink, "0" + "%" );
this.sinkCell( sink, "0" );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
Map datas = new Hashtable();
datas.put( this.mavenProject.getProjectName(), report );
IChartRenderer chart =
new BarChartRenderer( new CloverBarChartStrategy( bundle, this.mavenProject.getProjectName(), datas ),
DashBoardReportGenerator.SPECIFIC_WIDTH + 50, ChartUtils.STANDARD_HEIGHT );
if ( !chart.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_Clover." + chart.getFileExtension();
}
else
{
filename += "_Clover." + chart.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
this.getLog().debug( "createCloverGraph = " + filename );
try
{
chart.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createCloverGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text("[" + bundle.getString("dashboard.report.generategraphs.disabled") + "]");
// sink.lineBreak();
// }
}
public void createCoberturaSection( ResourceBundle bundle, Sink sink, CoberturaReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "cobertura" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#cobertura" );
sink.text( bundle.getString( "report.cobertura.header" ) );
sink.link_();
}
else
{
sink.link( "./cobertura/index.html" );
sink.text( bundle.getString( "report.cobertura.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "cobertura" );
}
sink.section1_();
sink.lineBreak();
if ( report == null )
{
sink.text( "Error: Unable to read from Cobertura data file ." );
}
else
{
sink.table();
sink.tableRow();
this.sinkHeader( sink, bundle.getString( "report.cobertura.label.nbclasses" ) );
this.sinkHeader( sink, bundle.getString( "report.cobertura.label.linecover" ) );
this.sinkHeader( sink, bundle.getString( "report.cobertura.label.branchcover" ) );
sink.tableRow_();
sink.tableRow();
this.sinkCell( sink, Integer.toString( report.getNbClasses() ) );
if ( this.generateGraphs )
{
this.sinkCell( sink, getPercentValue( report.getLineCoverRate() ) );
this.sinkCell( sink, getPercentValue( report.getBranchCoverRate() ) );
}
else
{
sinkCellPercentGraphic( sink, report.getLineCoverRate(), "cobertura" );
sinkCellPercentGraphic( sink, report.getBranchCoverRate(), "cobertura" );
}
sink.tableRow_();
sink.table_();
}
sink.lineBreak();
if ( this.generateGraphs )
{
Map datas = new Hashtable();
datas.put( this.mavenProject.getProjectName(), report );
IChartRenderer chart =
new BarChartRenderer(
new CoberturaBarChartStrategy( bundle, this.mavenProject.getProjectName(), datas ),
DashBoardReportGenerator.SPECIFIC_WIDTH, ChartUtils.STANDARD_HEIGHT );
if ( !chart.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_Cobertura." + chart.getFileExtension();
}
else
{
filename += "_Cobertura." + chart.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
this.getLog().debug( "createCoberturaGraph = " + filename );
try
{
chart.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createCoberturaGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text("[" + bundle.getString("dashboard.report.generategraphs.disabled") + "]");
// sink.lineBreak();
// }
}
public void createPmdSection( ResourceBundle bundle, Sink sink, PmdReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "pmd" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#pmd" );
sink.text( bundle.getString( "report.pmd.header" ) );
sink.link_();
}
else
{
sink.link( "./pmd.html" );
sink.text( bundle.getString( "report.pmd.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "pmd" );
}
sink.section1_();
sink.lineBreak();
if ( report == null )
{
sink.text( "Error: Unable to read from PMD data file ." );
}
else
{
sink.table();
sink.tableRow();
this.sinkHeader( sink, bundle.getString( "report.pmd.label.nbclasses" ) );
this.sinkHeader( sink, bundle.getString( "report.pmd.label.nbviolations" ) );
sink.tableRow_();
sink.tableRow();
this.sinkCell( sink, Integer.toString( report.getNbClasses() ) );
this.sinkCell( sink, Integer.toString( report.getNbViolations() ) );
sink.tableRow_();
sink.table_();
}
sink.lineBreak();
}
public void createCpdSection( ResourceBundle bundle, Sink sink, CpdReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "cpd" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#cpd" );
sink.text( bundle.getString( "report.cpd.header" ) );
sink.link_();
}
else
{
sink.link( "./cpd.html" );
sink.text( bundle.getString( "report.cpd.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "cpd" );
}
sink.section1_();
sink.lineBreak();
if ( report == null )
{
sink.text( "Error: Unable to read from CPD data file ." );
}
else
{
sink.table();
sink.tableRow();
this.sinkHeader( sink, bundle.getString( "report.cpd.label.nbclasses" ) );
this.sinkHeader( sink, bundle.getString( "report.cpd.label.nbduplicate" ) );
sink.tableRow_();
sink.tableRow();
this.sinkCell( sink, Integer.toString( report.getNbClasses() ) );
this.sinkCell( sink, Integer.toString( report.getNbDuplicate() ) );
sink.tableRow_();
sink.table_();
}
sink.lineBreak();
}
public void createCheckStyleSection( ResourceBundle bundle, Sink sink, CheckstyleReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "checkstyle" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#checkstyle" );
sink.text( bundle.getString( "report.checkstyle.header" ) );
sink.link_();
}
else
{
sink.link( "./checkstyle.html" );
sink.text( bundle.getString( "report.checkstyle.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "checkstyle" );
}
sink.section1_();
if ( report == null )
{
sink.text( "Error: Unable to read from checkstyle data file ." );
}
else
{
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.checkstyle.files" ) );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.checkstyle.column.total" ) );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.checkstyle.column.infos" ) );
sink.nonBreakingSpace();
this.iconInfo( sink );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.checkstyle.column.warnings" ) );
sink.nonBreakingSpace();
this.iconWarning( sink );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.checkstyle.column.errors" ) );
sink.nonBreakingSpace();
this.iconError( sink );
sink.tableHeaderCell_();
sink.tableRow_();
sink.tableRow();
this.sinkCell( sink, Integer.toString( report.getNbClasses() ) );
this.sinkCell( sink, Integer.toString( report.getNbTotal() ) );
sink.tableCell();
sink.text( Integer.toString( report.getNbInfos() ) );
sinkInvertPercentGraphic( sink, report.getPercentInfos() );
sink.tableCell_();
sink.tableCell();
sink.text( Integer.toString( report.getNbWarnings() ) );
sinkInvertPercentGraphic( sink, report.getPercentWarnings() );
sink.tableCell_();
sink.tableCell();
sink.text( Integer.toString( report.getNbErrors() ) );
sinkInvertPercentGraphic( sink, report.getPercentErrors() );
sink.tableCell_();
sink.tableRow_();
sink.table_();
}
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new PieChartRenderer( new CheckstylePieChartStrategy( bundle, this.mavenProject.getProjectName(),
report ),
DashBoardReportGenerator.SPECIFIC_WIDTH, ChartUtils.STANDARD_HEIGHT );
if ( !chart.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_CheckStyle." + chart.getFileExtension();
}
else
{
filename += "_CheckStyle." + chart.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
this.getLog().debug( "createCheckStyleGraph = " + filename );
try
{
chart.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createCheckStyleGraph exception = " + e.getMessage() );
}
}
// error management for Checkstyle Violations Chart. Fixes MOJO-679 .
// Written by <a href="mailto:srivollet@objectif-informatique.fr">Sylvain Rivollet</a>.
IChartRenderer chartError =
new PieChart3DRenderer(
new CheckstyleErrorsPieChartStrategy(
bundle,
this.mavenProject.getProjectName()
+ " "
+ bundle.getString( "chart.checkstyle.violations.title" ),
report ), ChartUtils.STANDARD_WIDTH,
ChartUtils.STANDARD_HEIGHT );
sink.lineBreak();
sink.lineBreak();
if ( !chartError.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_CheckStyle_Error." + chartError.getFileExtension();
}
else
{
filename += "_CheckStyle_Error." + chartError.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
try
{
chartError.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createCheckStyleGraphError exception = " + e.getMessage() );
}
}
}
else
{
sink.sectionTitle3();
sink.text( this.mavenProject.getProjectName() + " "
+ bundle.getString( "chart.checkstyle.violations.title" ) );
sink.sectionTitle3_();
double percentVal = 0;
int nbItInfPercent = 0;
CheckstyleError error = new CheckstyleError();
List errorsUnSorted = report.getErrors();
Collections.sort( errorsUnSorted, new DescNbErrorCheckstyleComparator() );
Iterator iterator = errorsUnSorted.iterator();
int total = report.getNbTotal();
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( "Violations" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( "Rate" );
sink.tableHeaderCell_();
sink.tableRow_();
while ( iterator.hasNext() )
{
error = (CheckstyleError) iterator.next();
percentVal = (double) ( error.getNbIteration() * 1d / total );
if ( percentVal > 0.01d )
{
sink.tableRow();
this.sinkCell( sink, error.getMessage() );
this.sinkCellInvertPercentGraphic( sink, percentVal, "checkstyle" );
sink.tableRow_();
}
else
{
nbItInfPercent += error.getNbIteration();
}
}
if ( nbItInfPercent > 0 )
{
percentVal = (double) ( nbItInfPercent * 1d / total );
sink.tableRow();
this.sinkCell( sink, bundle.getString( "chart.checkstyle.violations.others.label" ) );
this.sinkCellInvertPercentGraphic( sink, percentVal, "checkstyle" );
sink.tableRow_();
}
sink.table_();
}
}
public void createJDependSection( ResourceBundle bundle, Sink sink, JDependReportBean report )
{
this.getLog().debug( "createJDependSection creation." );
sink.section1();
sink.sectionTitle2();
sink.anchor( "jdepend" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#jdepend" );
sink.text( "Top " + this.getNbExportedPackagesSummary() + " "
+ bundle.getString( "report.xrefpackage.header" ) );
sink.link_();
}
else
{
sink.link( "./jdepend-report.html" );
sink.text( bundle.getString( "report.xrefpackage.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
sink.section1_();
sink.lineBreak();
if ( report == null )
{
sink.text( "Error: Unable to read from Jdepend data file ." );
}
else
{
double averageAC = report.getAverageAfferentCoupling();
double calcul = ( Math.rint( averageAC * 1000 ) ) / 1000;
sink.sectionTitle3();
sink.text( bundle.getString( "report.xrefpackage.label.average" ) + " = " + calcul );
sink.lineBreak();
sink.text( " Nb Packages = " + report.getNbPackages() );
sink.sectionTitle3_();
sink.table();
sink.tableRow();
this.sinkHeader( sink, bundle.getString( "report.xrefpackage.label.package" ) );
this.sinkHeader( sink, bundle.getString( "report.xrefpackage.label.ac" ) );
this.sinkHeader( sink, bundle.getString( "report.xrefpackage.label.linecover" ) );
this.sinkHeader( sink, bundle.getString( "report.xrefpackage.label.branchcover" ) );
sink.tableRow_();
List pack = report.getPackages();
Iterator iter = pack.iterator();
boolean threshold = false;
int nbPack = 0;
while ( iter.hasNext() )
{
nbPack = nbPack + 1;
XRefPackageBean bean = (XRefPackageBean) iter.next();
Integer ac = bean.getAfferentCoupling();
if ( ac.doubleValue() <= averageAC && !threshold )
{
threshold = true;
sink.tableRow();
this.sinkCellBold( sink, bundle.getString( "report.xrefpackage.label.threshold" ) );
this.sinkCellBold( sink, String.valueOf( calcul ) );
// sinkHeader( sink, "" );
// sinkHeader( sink, "" );
sink.tableRow_();
}
sink.tableRow();
this.sinkCell( sink, bean.getPackageName() );
this.sinkCell( sink, ac.toString() );
// this.sinkCell(sink, getPercentValue(bean.getLineCoverRate()));
sinkCellPercentGraphic( sink, bean.getLineCoverRate(), "cobertura" );
// this.sinkCell(sink, getPercentValue(bean.getBranchCoverRate()));
sinkCellPercentGraphic( sink, bean.getBranchCoverRate(), "cobertura" );
sink.tableRow_();
if ( this.summary && nbPack >= this.getNbExportedPackagesSummary() )
{
break;
}
}
sink.table_();
}
sink.lineBreak();
}
public void createFindBugsSection( ResourceBundle bundle, Sink sink, FindBugsReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "findbugs" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#findbugs" );
sink.text( bundle.getString( "report.findbugs.header" ) );
sink.link_();
}
else
{
sink.link( "./findbugs.html" );
sink.text( bundle.getString( "report.findbugs.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "findbugs" );
}
sink.section1_();
if ( report == null )
{
sink.text( "Error: Unable to read from findbugs data file ." );
}
else
{
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.findbugs.label.nbclasses" ) );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.findbugs.label.nbbugs" ) );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.findbugs.label.nberrors" ) );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.findbugs.label.nbMissingClasses" ) );
sink.tableHeaderCell_();
sink.tableRow_();
sink.tableRow();
this.sinkCell( sink, Integer.toString( report.getNbClasses() ) );
this.sinkCell( sink, Integer.toString( report.getNbBugs() ) );
this.sinkCell( sink, Integer.toString( report.getNbErrors() ) );
this.sinkCell( sink, Integer.toString( report.getNbMissingClasses() ) );
sink.tableRow_();
sink.table_();
}
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chartError =
new PieChart3DRenderer(
new FindbugsCategoriesPieChartStrategy(
bundle,
this.mavenProject.getProjectName()
+ " "
+ bundle.getString( "chart.findbugs.bycategory.title" ),
report ), ChartUtils.STANDARD_WIDTH,
ChartUtils.STANDARD_HEIGHT );
sink.lineBreak();
sink.lineBreak();
if ( !chartError.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_Findbugs_Categories." + chartError.getFileExtension();
}
else
{
filename += "_Findbugs_Categories." + chartError.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
try
{
chartError.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createFindbugsCategoriesGraphError exception = " + e.getMessage() );
}
}
sink.lineBreak();
chartError =
new PieChart3DRenderer(
new FindbugsPrioritiesPieChartStrategy(
bundle,
this.mavenProject.getProjectName()
+ " "
+ bundle.getString( "chart.findbugs.bypriority.title" ),
report ), ChartUtils.STANDARD_WIDTH,
ChartUtils.STANDARD_HEIGHT );
sink.lineBreak();
sink.lineBreak();
if ( !chartError.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_Findbugs_Priorities." + chartError.getFileExtension();
}
else
{
filename += "_Findbugs_Priorities." + chartError.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
try
{
chartError.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createFindbugsPrioritiesGraphError exception = " + e.getMessage() );
}
}
}
else
{
sink.sectionTitle3();
sink.text( this.mavenProject.getProjectName() + " " + bundle.getString( "chart.findbugs.bycategory.title" ) );
sink.sectionTitle3_();
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( "Categories" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( "Rate" );
sink.tableHeaderCell_();
sink.tableRow_();
Map categories = report.getCategories();
Iterator iterator = categories.keySet().iterator();
while ( iterator.hasNext() )
{
String category = (String) iterator.next();
Integer value = (Integer) categories.get( category );
double percentVal = value.intValue() / (double) report.getNbBugs();
sink.tableRow();
this.sinkCell( sink, category );
this.sinkCellInvertPercentGraphic( sink, percentVal, "findbugs" );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
sink.sectionTitle3();
sink.text( this.mavenProject.getProjectName() + " " + bundle.getString( "chart.findbugs.bypriority.title" ) );
sink.sectionTitle3_();
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( "Priorities" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( "Rate" );
sink.tableHeaderCell_();
sink.tableRow_();
Map priorities = report.getPriorities();
Iterator iteratorP = priorities.keySet().iterator();
while ( iteratorP.hasNext() )
{
String priority = (String) iteratorP.next();
Integer value = (Integer) priorities.get( priority );
double percentVal = value.intValue() / (double) report.getNbBugs();
sink.tableRow();
this.sinkCell( sink, priority );
this.sinkCellInvertPercentGraphic( sink, percentVal, "findbugs" );
sink.tableRow_();
}
sink.table_();
}
}
public void createTaglistSection( ResourceBundle bundle, Sink sink, TagListReportBean report )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "taglist" );
sink.anchor_();
if ( this.summary )
{
sink.link( "dashboard-report-details.html#taglist" );
sink.text( bundle.getString( "report.taglist.header" ) );
sink.link_();
}
else
{
sink.link( "./taglist.html" );
sink.text( bundle.getString( "report.taglist.header" ) );
sink.link_();
}
sink.sectionTitle2_();
this.linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
this.linkToHistoricPage( sink, "taglist" );
}
sink.section1_();
if ( report == null )
{
sink.text( "Error: Unable to read from taglist data file ." );
}
else
{
sink.table();
sink.tableRow();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.taglist.column.tags" ) );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.taglist.column.nboccurs" ) );
sink.tableHeaderCell_();
sink.tableRow_();
for ( Iterator ite = report.getTags().entrySet().iterator(); ite.hasNext(); )
{
sink.tableRow();
Map.Entry entry = (Map.Entry) ite.next();
this.sinkCell( sink, (String) entry.getKey() );
this.sinkCell( sink, ( (Integer) entry.getValue() ).toString() );
sink.tableRow_();
}
sink.tableRow();
sink.tableHeaderCell();
sink.text( "Total" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( Integer.toString( report.getNbTotal() ) );
sink.tableHeaderCell_();
sink.tableRow_();
sink.tableRow();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.taglist.label.nbclasses" ) );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( Integer.toString( report.getNbClasses() ) );
sink.tableHeaderCell_();
sink.tableRow_();
sink.table_();
}
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new PieChart3DRenderer( new TaglistPieChartStrategy( bundle, this.mavenProject.getProjectName() + " "
+ bundle.getString( "chart.taglist.bytags.title" ), report ),
DashBoardReportGenerator.SPECIFIC_WIDTH, ChartUtils.STANDARD_HEIGHT );
if ( !chart.isEmpty() )
{
String filename = this.replaceForbiddenChar( this.mavenProject.getProjectName() );
if ( this.summary )
{
filename += "_Summary_Taglist." + chart.getFileExtension();
}
else
{
filename += "_Taglist." + chart.getFileExtension();
}
filename = filename.replace( ' ', '_' );
String filenameWithPath = this.getImagesPath() + "/" + filename;
this.getLog().debug( "createTaglistGraph = " + filename );
try
{
chart.saveToFile( filenameWithPath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
this.getLog().debug( "createTaglistGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text("[" + bundle.getString("dashboard.report.generategraphs.disabled") + "]");
// sink.lineBreak();
// }
}
}