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.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.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.chart.BarChartRenderer;
import org.codehaus.mojo.dashboard.report.plugin.chart.CheckstyleBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.CoberturaBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.CpdBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.FindBugsBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.IChartRenderer;
import org.codehaus.mojo.dashboard.report.plugin.chart.MultiCloverBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.PmdBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.StackedBarChartRenderer;
import org.codehaus.mojo.dashboard.report.plugin.chart.SurefireBarChartStrategy;
import org.codehaus.mojo.dashboard.report.plugin.chart.TaglistBarChartStrategy;
/**
* <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 DashBoardMultiReportGenerator extends AbstractDashBoardGenerator
{
private String dashboardReportFile = "dashboard-report.html";
private String coberturaAnchorLink = "/" + dashboardReportFile + "#cobertura";
private String cloverAnchorLink = "/" + dashboardReportFile + "#clover";
private String surefireAnchorLink = "/" + dashboardReportFile + "#surefire";
private String checkstyleAnchorLink = "/" + dashboardReportFile + "#checkstyle";
private String taglistAnchorLink = "/" + dashboardReportFile + "#taglist";
private String pmdAnchorLink = "/" + dashboardReportFile + "#pmd";
private String cpdAnchorLink = "/" + dashboardReportFile + "#cpd";
private String findbugsAnchorLink = "/" + dashboardReportFile + "#findbugs";
private DashBoardMavenProject mavenProject;
private Map map = new Hashtable();
private boolean isDBAvailable = false;
private boolean generateGraphs = true;
/**
*
* @param dashboardReport
*/
public DashBoardMultiReportGenerator( DashBoardMavenProject mavenProject, boolean isDBAvailable,
boolean generateGraphs, Log log )
{
super( log );
this.mavenProject = mavenProject;
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 )
{
map.put( report.getClass(), report );
}
}
}
public void doGenerateReport( ResourceBundle bundle, Sink sink )
{
getLog().debug( "DashBoardMultiReportGenerator doGenerateReport(...)" );
createTitle( bundle, sink );
addDashboardCss(sink);
sink.body();
sink.anchor( "top" );
sink.anchor_();
createHeader( bundle, sink );
createBodyReport( bundle, sink );
sink.body_();
sink.flush();
sink.close();
}
public void createTitle( ResourceBundle bundle, Sink sink )
{
sink.head();
sink.title();
sink.text( bundle.getString( "dashboard.multireport.name" ) );
sink.title_();
sink.head_();
}
public void createHeader( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle1();
sink.text( bundle.getString( "dashboard.multireport.name" ) + " : " + this.mavenProject.getProjectName() );
sink.sectionTitle1_();
sink.text( "Date Generated: " + new SimpleDateFormat().format( new Date( System.currentTimeMillis() ) ) );
sink.horizontalRule();
sink.sectionTitle3();
sink.text( "[" );
sink.link( "dashboard-report.html" );
sink.text( "Summary Dashboard" );
sink.link_();
sink.text( "]" );
sink.sectionTitle3_();
sink.horizontalRule();
if ( map.get( CoberturaReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#cobertura" );
sink.text( bundle.getString( "report.cobertura.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( map.get( CloverReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#clover" );
sink.text( bundle.getString( "report.clover.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( map.get( SurefireReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#surefire" );
sink.text( bundle.getString( "report.surefire.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( map.get( CheckstyleReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#checkstyle" );
sink.text( bundle.getString( "report.checkstyle.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( map.get( PmdReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#pmd" );
sink.text( bundle.getString( "report.pmd.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( map.get( CpdReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#cpd" );
sink.text( bundle.getString( "report.cpd.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( map.get( FindBugsReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#findbugs" );
sink.text( bundle.getString( "report.findbugs.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( map.get( JDependReportBean.class ) != null )
{
sink.text( "[" );
sink.link( "#jdepend" );
sink.text( bundle.getString( "report.xrefpackage.header" ) );
sink.link_();
sink.text( "]" );
sink.lineBreak();
}
if ( 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 createBodyReport( ResourceBundle bundle, Sink sink )
{
getLog().debug( "DashBoardMultiReportGenerator createBodyByReport(...)" );
if ( map.get( CoberturaReportBean.class ) != null )
{
createCoberturaSection( bundle, sink );
}
if ( map.get( CloverReportBean.class ) != null )
{
createCloverSection( bundle, sink );
}
if ( map.get( SurefireReportBean.class ) != null )
{
createSurefireSection( bundle, sink );
}
if ( map.get( CheckstyleReportBean.class ) != null )
{
createCheckStyleSection( bundle, sink );
}
if ( map.get( PmdReportBean.class ) != null )
{
createPmdSection( bundle, sink );
}
if ( map.get( CpdReportBean.class ) != null )
{
createCpdSection( bundle, sink );
}
if ( map.get( FindBugsReportBean.class ) != null )
{
createFindBugsSection( bundle, sink );
}
if ( map.get( JDependReportBean.class ) != null )
{
createJDependSection( bundle, sink );
}
if ( map.get( TagListReportBean.class ) != null )
{
createTaglistSection( bundle, sink );
}
}
public void createSurefireSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "surefire" );
sink.text( bundle.getString( "report.surefire.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "surefire" );
}
sink.section1_();
// sink.lineBreak();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
sinkHeader( sink, bundle.getString( "report.surefire.label.successrate" ) );
sinkHeader( sink, bundle.getString( "report.surefire.label.tests" ) );
sinkHeader( sink, bundle.getString( "report.surefire.label.errors" ) );
sinkHeader( sink, bundle.getString( "report.surefire.label.failures" ) );
sinkHeader( sink, bundle.getString( "report.surefire.label.skipped" ) );
sinkHeader( sink, bundle.getString( "report.surefire.label.time" ) );
sink.tableRow_();
Map datas = new Hashtable();
createSurefireLineByReport( bundle, sink, mavenProject, true, "", datas );
SurefireReportBean fireReportBean =
(SurefireReportBean) mavenProject.getReportsByType( SurefireReportBean.class );
if ( fireReportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
// sinkHeader( sink, Double.toString( fireReportBean.getSucessRate() ) + "%" );
sinkHeaderCellPercentGraphic( sink, fireReportBean.getSucessRate() / 100, "surefire" );
sinkHeader( sink, Integer.toString( fireReportBean.getNbTests() ) );
sinkHeader( sink, Integer.toString( fireReportBean.getNbErrors() ) );
sinkHeader( sink, Integer.toString( fireReportBean.getNbFailures() ) );
sinkHeader( sink, Integer.toString( fireReportBean.getNbSkipped() ) );
sinkHeader( sink, Double.toString( fireReportBean.getElapsedTime() ) );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new StackedBarChartRenderer(
new SurefireBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_Surefire." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createSurefireGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createSurefireGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
// sink.lineBreak();
// }
}
public void createSurefireLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, surefireAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createSurefireLineByReport( bundle, sink, subproject, false, prefix, datas );
}
}
else
{
SurefireReportBean fireReportBean =
(SurefireReportBean) mavenProject.getReportsByType( SurefireReportBean.class );
if ( fireReportBean != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), fireReportBean );
writeProjectCell( sink, mavenProject, prefix, surefireAnchorLink );
// sinkCell( sink, Double.toString( fireReportBean.getSucessRate() ) + "%" );
sinkCellPercentGraphic( sink, fireReportBean.getSucessRate() / 100, "surefire" );
sinkCell( sink, Integer.toString( fireReportBean.getNbTests() ) );
sinkCell( sink, Integer.toString( fireReportBean.getNbErrors() ) );
sinkCell( sink, Integer.toString( fireReportBean.getNbFailures() ) );
sinkCell( sink, Integer.toString( fireReportBean.getNbSkipped() ) );
sinkCell( sink, Double.toString( fireReportBean.getElapsedTime() ) );
sink.tableRow_();
}
}
}
/**
* 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 )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "clover" );
sink.text( bundle.getString( "report.clover.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "clover" );
}
sink.section1_();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
sinkHeader( sink, bundle.getString( "report.clover.label.total" ) );
sinkHeader( sink, bundle.getString( "report.clover.label.conditionals" ) );
sinkHeader( sink, bundle.getString( "report.clover.label.statements" ) );
sinkHeader( sink, bundle.getString( "report.clover.label.methods" ) );
sink.tableRow_();
Map datas = new Hashtable();
createCloverLineByReport( bundle, sink, mavenProject, true, "", datas );
CloverReportBean reportBean = (CloverReportBean) mavenProject.getReportsByType( CloverReportBean.class );
if ( reportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
if ( this.generateGraphs )
{
sinkHeader( sink, reportBean.getElementsLabel() );
sinkHeader( sink, reportBean.getConditionalsLabel() );
sinkHeader( sink, reportBean.getStatementsLabel() );
sinkHeader( sink, reportBean.getMethodsLabel() );
}
else
{
sink.tableHeaderCell();
sinkPercentGraphic( sink, reportBean.getPercentCoveredConditionals() );
sink.text( "(" + reportBean.getCoveredElements() + " / " + reportBean.getElements() + ")" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sinkPercentGraphic( sink, reportBean.getPercentCoveredConditionals() );
sink.text( "(" + reportBean.getCoveredConditionals() + " / " + reportBean.getConditionals() + ")" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sinkPercentGraphic( sink, reportBean.getPercentCoveredStatements() );
sink.text( "(" + reportBean.getCoveredStatements() + " / " + reportBean.getStatements() + ")" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sinkPercentGraphic( sink, reportBean.getPercentCoveredMethods() );
sink.text( "(" + reportBean.getCoveredMethods() + " / " + reportBean.getMethods() + ")" );
sink.tableHeaderCell_();
}
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new BarChartRenderer( new MultiCloverBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_Clover." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createCloverGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createCloverGraph 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
* @param DashBoardMavenProject
* @param isRoot
* @param prefix
*/
public void createCloverLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, cloverAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createCloverLineByReport( bundle, sink, subproject, false, prefix, datas );
}
}
else
{
CloverReportBean cloverReportBean =
(CloverReportBean) mavenProject.getReportsByType( CloverReportBean.class );
if ( cloverReportBean != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), cloverReportBean );
writeProjectCell( sink, mavenProject, prefix, cloverAnchorLink );
if ( this.generateGraphs )
{
sinkCell( sink, cloverReportBean.getElementsLabel() );
}
else
{
sink.tableCell();
sinkPercentGraphic( sink, cloverReportBean.getPercentCoveredConditionals() );
sink.text( "(" + cloverReportBean.getCoveredElements() + " / " + cloverReportBean.getElements()
+ ")" );
sink.tableCell_();
}
sinkCell( sink, cloverReportBean.getConditionalsLabel() );
sinkCell( sink, cloverReportBean.getStatementsLabel() );
sinkCell( sink, cloverReportBean.getMethodsLabel() );
sink.tableRow_();
}
}
}
public void createCoberturaSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "cobertura" );
sink.text( bundle.getString( "report.cobertura.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "cobertura" );
}
sink.section1_();
// sink.lineBreak();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
sinkHeader( sink, bundle.getString( "report.cobertura.label.nbclasses" ) );
sinkHeader( sink, bundle.getString( "report.cobertura.label.linecover" ) );
sinkHeader( sink, bundle.getString( "report.cobertura.label.branchcover" ) );
sink.tableRow_();
Map datas = new Hashtable();
createCoberturaLineByReport( bundle, sink, mavenProject, true, "", datas );
CoberturaReportBean reportBean =
(CoberturaReportBean) mavenProject.getReportsByType( CoberturaReportBean.class );
if ( reportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
// sinkHeader( sink, getPercentValue( reportBean.getLineCoverRate() ) );
sinkHeaderCellPercentGraphic( sink, reportBean.getLineCoverRate(), "cobertura" );
// sinkHeader( sink, getPercentValue( reportBean.getBranchCoverRate() ) );
sinkHeaderCellPercentGraphic( sink, reportBean.getBranchCoverRate(), "cobertura" );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new BarChartRenderer( new CoberturaBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_Cobertura." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createCoberturaGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createCoberturaGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
// sink.lineBreak();
// }
}
public void createCoberturaLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, coberturaAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createCoberturaLineByReport( bundle, sink, subproject, false, prefix, datas );
}
}
else
{
CoberturaReportBean coberReportBean =
(CoberturaReportBean) mavenProject.getReportsByType( CoberturaReportBean.class );
if ( coberReportBean != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), coberReportBean );
writeProjectCell( sink, mavenProject, prefix, coberturaAnchorLink );
sinkCell( sink, Integer.toString( coberReportBean.getNbClasses() ) );
if ( this.generateGraphs )
{
sinkCell( sink, getPercentValue( coberReportBean.getLineCoverRate() ) );
sinkCell( sink, getPercentValue( coberReportBean.getBranchCoverRate() ) );
}
else
{
sinkCellPercentGraphic( sink, coberReportBean.getLineCoverRate(), "cobertura" );
sinkCellPercentGraphic( sink, coberReportBean.getBranchCoverRate(), "cobertura" );
}
sink.tableRow_();
}
}
}
public void createPmdSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "pmd" );
sink.text( bundle.getString( "report.pmd.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "pmd" );
}
sink.section1_();
// sink.lineBreak();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
sinkHeader( sink, bundle.getString( "report.pmd.label.nbclasses" ) );
sinkHeader( sink, bundle.getString( "report.pmd.label.nbviolations" ) );
sink.tableRow_();
Map datas = new Hashtable();
createPmdLineByReport( bundle, sink, mavenProject, true, "", datas );
PmdReportBean reportBean = (PmdReportBean) mavenProject.getReportsByType( PmdReportBean.class );
if ( reportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
sinkHeader( sink, Integer.toString( reportBean.getNbViolations() ) );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new BarChartRenderer( new PmdBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_Pmd." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createPmdGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createPmdGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
// sink.lineBreak();
// }
}
public void createPmdLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, pmdAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createPmdLineByReport( bundle, sink, subproject, false, prefix, datas );
}
}
else
{
PmdReportBean pmdReportBean = (PmdReportBean) mavenProject.getReportsByType( PmdReportBean.class );
if ( pmdReportBean != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), pmdReportBean );
writeProjectCell( sink, mavenProject, prefix, pmdAnchorLink );
sinkCell( sink, Integer.toString( pmdReportBean.getNbClasses() ) );
sinkCell( sink, Integer.toString( pmdReportBean.getNbViolations() ) );
sink.tableRow_();
}
}
}
public void createCpdSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "cpd" );
sink.text( bundle.getString( "report.cpd.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "cpd" );
}
sink.section1_();
// sink.lineBreak();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
sinkHeader( sink, bundle.getString( "report.cpd.label.nbclasses" ) );
sinkHeader( sink, bundle.getString( "report.cpd.label.nbduplicate" ) );
sink.tableRow_();
Map datas = new Hashtable();
createCpdLineByReport( bundle, sink, mavenProject, true, "", datas );
CpdReportBean reportBean = (CpdReportBean) mavenProject.getReportsByType( CpdReportBean.class );
if ( reportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
sinkHeader( sink, Integer.toString( reportBean.getNbDuplicate() ) );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new BarChartRenderer( new CpdBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_Cpd." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createCpdGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createCpdGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
// sink.lineBreak();
// }
}
public void createCpdLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, cpdAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createCpdLineByReport( bundle, sink, subproject, false, prefix, datas );
}
}
else
{
CpdReportBean cpdReportBean = (CpdReportBean) mavenProject.getReportsByType( CpdReportBean.class );
if ( cpdReportBean != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), cpdReportBean );
writeProjectCell( sink, mavenProject, prefix, cpdAnchorLink );
sinkCell( sink, Integer.toString( cpdReportBean.getNbClasses() ) );
sinkCell( sink, Integer.toString( cpdReportBean.getNbDuplicate() ) );
sink.tableRow_();
}
}
}
public void createFindBugsSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "findbugs" );
sink.text( bundle.getString( "report.findbugs.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "findbugs" );
}
sink.section1_();
// sink.lineBreak();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
sinkHeader( sink, bundle.getString( "report.findbugs.label.nbclasses" ) );
sinkHeader( sink, bundle.getString( "report.findbugs.label.nbbugs" ) );
sinkHeader( sink, bundle.getString( "report.findbugs.label.nberrors" ) );
sinkHeader( sink, bundle.getString( "report.findbugs.label.nbMissingClasses" ) );
sink.tableRow_();
Map datas = new Hashtable();
createFindBugsLineByReport( bundle, sink, mavenProject, true, "", datas );
FindBugsReportBean reportBean = (FindBugsReportBean) mavenProject.getReportsByType( FindBugsReportBean.class );
if ( reportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
sinkHeader( sink, Integer.toString( reportBean.getNbBugs() ) );
sinkHeader( sink, Integer.toString( reportBean.getNbErrors() ) );
sinkHeader( sink, Integer.toString( reportBean.getNbMissingClasses() ) );
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new BarChartRenderer( new FindBugsBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_FindBugs." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createFindBugsGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createFindBugsGraph exception = " + e.getMessage() );
}
}
}
// else
// {
// sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
// sink.lineBreak();
// }
}
public void createFindBugsLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, this.findbugsAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createFindBugsLineByReport( bundle, sink, subproject, false, prefix, datas );
}
}
else
{
FindBugsReportBean findBugsReportBean =
(FindBugsReportBean) mavenProject.getReportsByType( FindBugsReportBean.class );
if ( findBugsReportBean != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), findBugsReportBean );
writeProjectCell( sink, mavenProject, prefix, this.findbugsAnchorLink );
sinkCell( sink, Integer.toString( findBugsReportBean.getNbClasses() ) );
sinkCell( sink, Integer.toString( findBugsReportBean.getNbBugs() ) );
sinkCell( sink, Integer.toString( findBugsReportBean.getNbErrors() ) );
sinkCell( sink, Integer.toString( findBugsReportBean.getNbMissingClasses() ) );
sink.tableRow_();
}
}
}
public void createCheckStyleSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "checkstyle" );
sink.text( bundle.getString( "report.checkstyle.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "checkstyle" );
}
sink.section1_();
// sink.lineBreak();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
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();
iconInfo( sink );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.checkstyle.column.warnings" ) );
sink.nonBreakingSpace();
iconWarning( sink );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( bundle.getString( "report.checkstyle.column.errors" ) );
sink.nonBreakingSpace();
iconError( sink );
sink.tableHeaderCell_();
sink.tableRow_();
Map datas = new Hashtable();
CheckstyleReportBean reportBean =
(CheckstyleReportBean) mavenProject.getReportsByType( CheckstyleReportBean.class );
createCheckStyleLineByReport( bundle, sink, mavenProject, true, "", datas, reportBean.getNbTotal() );
if ( reportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
sinkHeader( sink, Integer.toString( reportBean.getNbTotal() ) );
sink.tableHeaderCell();
sink.text( Integer.toString( reportBean.getNbInfos() ) );
sinkInvertPercentGraphic( sink, reportBean.getPercentInfos() );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( Integer.toString( reportBean.getNbWarnings() ) );
sinkInvertPercentGraphic( sink, reportBean.getPercentWarnings() );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.text( Integer.toString( reportBean.getNbErrors() ) );
sinkInvertPercentGraphic( sink, reportBean.getPercentErrors() );
sink.tableHeaderCell_();
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new StackedBarChartRenderer( new CheckstyleBarChartStrategy( bundle, mavenProject.getProjectName(),
datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_CheckStyle." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createCheckStyleGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createCheckStyleGraph exception = " + e.getMessage() );
}
}
}
}
public void createCheckStyleLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas, int total )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, checkstyleAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createCheckStyleLineByReport( bundle, sink, subproject, false, prefix, datas, total );
}
}
else
{
CheckstyleReportBean checkStyleReport =
(CheckstyleReportBean) mavenProject.getReportsByType( CheckstyleReportBean.class );
if ( checkStyleReport != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), checkStyleReport );
writeProjectCell( sink, mavenProject, prefix, checkstyleAnchorLink );
sinkCell( sink, Integer.toString( checkStyleReport.getNbClasses() ) );
if ( this.generateGraphs )
{
sinkCell( sink, Integer.toString( checkStyleReport.getNbTotal() ) );
}
else
{
// sinkCellInvertPercentGraphic( sink, checkStyleReport.getNbTotal()/(double)total,
// "taglist",Integer.toString( checkStyleReport.getNbTotal()) );
sink.tableCell();
sink.text( Integer.toString( checkStyleReport.getNbTotal() ) );
sinkInvertPercentGraphic( sink, checkStyleReport.getNbTotal() / (double) total );
sink.tableCell_();
}
sinkCell( sink, Integer.toString( checkStyleReport.getNbInfos() ) );
sinkCell( sink, Integer.toString( checkStyleReport.getNbWarnings() ) );
sinkCell( sink, Integer.toString( checkStyleReport.getNbErrors() ) );
sink.tableRow_();
}
}
}
/**
*
* @param bundle
* @param sink
* @throws MavenReportException
*/
public void createJDependSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "jdepend" );
sink.text( bundle.getString( "report.xrefpackage.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.section1_();
JDependReportBean report = (JDependReportBean) mavenProject.getReportsByType( JDependReportBean.class );
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();
sinkHeader( sink, bundle.getString( "report.xrefpackage.label.package" ) );
sinkHeader( sink, bundle.getString( "report.xrefpackage.label.ac" ) );
sinkHeader( sink, bundle.getString( "report.xrefpackage.label.linecover" ) );
sinkHeader( sink, bundle.getString( "report.xrefpackage.label.branchcover" ) );
sink.tableRow_();
List pack = report.getPackages();
Iterator iter = pack.iterator();
boolean threshold = false;
while ( iter.hasNext() )
{
XRefPackageBean bean = (XRefPackageBean) iter.next();
Integer ac = bean.getAfferentCoupling();
if ( ac.doubleValue() <= averageAC && !threshold )
{
threshold = true;
sink.tableRow();
sinkCellBold( sink, bundle.getString( "report.xrefpackage.label.threshold" ) );
sinkCellBold( sink, String.valueOf( calcul ) );
// sinkHeader( sink, "" );
// sinkHeader( sink, "" );
sink.tableRow_();
}
sink.tableRow();
sinkCell( sink, bean.getPackageName() );
sinkCell( sink, ac.toString() );
// sinkCell( sink, getPercentValue( bean.getLineCoverRate() ) );
sinkCellPercentGraphic( sink, bean.getLineCoverRate(), "cobertura" );
// sinkCell( sink, getPercentValue( bean.getBranchCoverRate() ) );
sinkCellPercentGraphic( sink, bean.getBranchCoverRate(), "cobertura" );
sink.tableRow_();
}
sink.table_();
}
sink.lineBreak();
}
private void writeProjectCell( Sink sink, DashBoardMavenProject mavenProject, String prefix, String suffix )
{
if ( prefix == null || prefix.length() == 0 )
{
String artefactId = mavenProject.getArtifactId();
String link = artefactId;
sinkCellWithLink( sink, mavenProject.getProjectName(), link + suffix );
}
else
{
int nbTab = prefix.split( "/" ).length;
String artefactId = mavenProject.getArtifactId();
String link = prefix + "/" + artefactId;
sinkCellTabWithLink( sink, mavenProject.getProjectName(), nbTab, link + suffix );
}
}
private String writeMultiProjectRow( Sink sink, DashBoardMavenProject mavenProject, String prefix, String suffix )
{
if ( prefix == null || prefix.length() == 0 )
{
String artefactId = mavenProject.getArtifactId();
prefix = artefactId;
sink.tableRow();
sinkCellBoldWithLink( sink, mavenProject.getProjectName(), prefix + suffix );
sink.tableRow_();
}
else
{
sink.tableRow();
int nbTab = prefix.split( "/" ).length;
String artefactId = mavenProject.getArtifactId();
prefix = prefix + "/" + artefactId;
sinkCellTabBoldWithLink( sink, mavenProject.getProjectName(), nbTab, prefix + suffix );
sink.tableRow_();
}
return prefix;
}
public void createTaglistSection( ResourceBundle bundle, Sink sink )
{
sink.section1();
sink.sectionTitle2();
sink.anchor( "taglist" );
sink.text( bundle.getString( "report.taglist.header" ) );
sink.anchor_();
sink.sectionTitle2_();
linkToTopPage( sink );
sink.lineBreak();
if ( this.isDBAvailable )
{
linkToHistoricPage( sink, "taglist" );
}
sink.section1_();
sink.table();
sink.tableRow();
sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
sinkHeader( sink, bundle.getString( "report.taglist.label.nbclasses" ) );
sinkHeader( sink, "Total" );
TagListReportBean reportBean = (TagListReportBean) mavenProject.getReportsByType( TagListReportBean.class );
String[] keys = new String[reportBean.getTags().size()];
int i = 0;
for ( Iterator ite = reportBean.getTags().entrySet().iterator(); ite.hasNext(); )
{
Map.Entry entry = (Map.Entry) ite.next();
sink.tableHeaderCell();
sink.text( (String) entry.getKey() );
keys[i] = (String) entry.getKey();
i++;
sink.tableHeaderCell_();
}
sink.tableRow_();
Map datas = new Hashtable();
createTaglistLineByReport( bundle, sink, mavenProject, true, "", datas, keys, reportBean.getNbTotal() );
if ( reportBean != null )
{
sink.tableRow();
sinkHeader( sink, "Total" );
sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
sinkHeader( sink, Integer.toString( reportBean.getNbTotal() ) );
for ( Iterator ite = reportBean.getTags().entrySet().iterator(); ite.hasNext(); )
{
Map.Entry entry = (Map.Entry) ite.next();
sinkHeader( sink, entry.getValue().toString() );
}
sink.tableRow_();
}
sink.table_();
sink.lineBreak();
if ( this.generateGraphs )
{
IChartRenderer chart =
new StackedBarChartRenderer( new TaglistBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
if ( !chart.isEmpty() )
{
String filename = replaceForbiddenChar( mavenProject.getProjectName() );
filename = filename + "_Taglist." + chart.getFileExtension();
filename = filename.replace( ' ', '_' );
String filenamePath = getImagesPath() + "/" + filename;
getLog().debug( "createTaglistStyleGraph = " + filenamePath );
try
{
chart.saveToFile( filenamePath );
String link = "images/" + filename;
link = link.replace( ' ', '_' );
sink.figure();
sink.figureGraphics( link );
sink.figure_();
}
catch ( IOException e )
{
getLog().debug( "createTaglistStyleGraph exception = " + e.getMessage() );
}
}
}
}
public void createTaglistLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
boolean isRoot, String prefix, Map datas, String[] keys, int total )
{
if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
{
Iterator iter = mavenProject.getModules().iterator();
if ( !isRoot )
{
prefix = writeMultiProjectRow( sink, mavenProject, prefix, taglistAnchorLink );
}
while ( iter.hasNext() )
{
DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
createTaglistLineByReport( bundle, sink, subproject, false, prefix, datas, keys, total );
}
}
else
{
TagListReportBean taglistReport =
(TagListReportBean) mavenProject.getReportsByType( TagListReportBean.class );
if ( taglistReport != null )
{
sink.tableRow();
datas.put( mavenProject.getProjectName(), taglistReport );
writeProjectCell( sink, mavenProject, prefix, taglistAnchorLink );
sinkCell( sink, Integer.toString( taglistReport.getNbClasses() ) );
if ( this.generateGraphs )
{
sinkCell( sink, Integer.toString( taglistReport.getNbTotal() ) );
}
else
{
sinkCellInvertPercentGraphic( sink, taglistReport.getNbTotal() / (double) total, "taglist",
Integer.toString( taglistReport.getNbTotal() ) );
}
for ( int i = 0; i < keys.length; i++ )
{
sinkCell( sink, taglistReport.getTags().get( keys[i] ).toString() );
}
sink.tableRow_();
}
}
}
}