View Javadoc

1   package org.codehaus.mojo.dashboard.report.plugin;
2   
3   /*
4    * Copyright 2006 David Vicente
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *      http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  import java.io.IOException;
20  import java.text.SimpleDateFormat;
21  import java.util.Date;
22  import java.util.Hashtable;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.Map;
26  import java.util.ResourceBundle;
27  import java.util.Set;
28  
29  import org.apache.maven.plugin.logging.Log;
30  import org.codehaus.doxia.sink.Sink;
31  import org.codehaus.mojo.dashboard.report.plugin.beans.CheckstyleReportBean;
32  import org.codehaus.mojo.dashboard.report.plugin.beans.CloverReportBean;
33  import org.codehaus.mojo.dashboard.report.plugin.beans.CoberturaReportBean;
34  import org.codehaus.mojo.dashboard.report.plugin.beans.CpdReportBean;
35  import org.codehaus.mojo.dashboard.report.plugin.beans.DashBoardMavenProject;
36  import org.codehaus.mojo.dashboard.report.plugin.beans.FindBugsReportBean;
37  import org.codehaus.mojo.dashboard.report.plugin.beans.IDashBoardReportBean;
38  import org.codehaus.mojo.dashboard.report.plugin.beans.JDependReportBean;
39  import org.codehaus.mojo.dashboard.report.plugin.beans.PmdReportBean;
40  import org.codehaus.mojo.dashboard.report.plugin.beans.SurefireReportBean;
41  import org.codehaus.mojo.dashboard.report.plugin.beans.TagListReportBean;
42  import org.codehaus.mojo.dashboard.report.plugin.beans.XRefPackageBean;
43  import org.codehaus.mojo.dashboard.report.plugin.chart.BarChartRenderer;
44  import org.codehaus.mojo.dashboard.report.plugin.chart.CheckstyleBarChartStrategy;
45  import org.codehaus.mojo.dashboard.report.plugin.chart.CoberturaBarChartStrategy;
46  import org.codehaus.mojo.dashboard.report.plugin.chart.CpdBarChartStrategy;
47  import org.codehaus.mojo.dashboard.report.plugin.chart.FindBugsBarChartStrategy;
48  import org.codehaus.mojo.dashboard.report.plugin.chart.IChartRenderer;
49  import org.codehaus.mojo.dashboard.report.plugin.chart.MultiCloverBarChartStrategy;
50  import org.codehaus.mojo.dashboard.report.plugin.chart.PmdBarChartStrategy;
51  import org.codehaus.mojo.dashboard.report.plugin.chart.StackedBarChartRenderer;
52  import org.codehaus.mojo.dashboard.report.plugin.chart.SurefireBarChartStrategy;
53  import org.codehaus.mojo.dashboard.report.plugin.chart.TaglistBarChartStrategy;
54  
55  /**
56   * <ul>
57   * <li>Add "CheckStyle Violations" graph written by <a href="mailto:srivollet@objectif-informatique.fr">Sylvain
58   * Rivollet</a></li>
59   * <li>Add Clover support written by <a href="mailto:mbeerman@yahoo.com">Matthew Beermann</a></li>
60   * <li>Add Taglist support written by <a href="mailto:henrik.lynggaard@gmail.com">Henrik Lynggaard</a></li>
61   * </ul>
62   *
63   * @author <a href="dvicente72@gmail.com">David Vicente</a>
64   *
65   */
66  public class DashBoardMultiReportGenerator extends AbstractDashBoardGenerator
67  {
68  
69      private String dashboardReportFile = "dashboard-report.html";
70  
71      private String coberturaAnchorLink = "/" + dashboardReportFile + "#cobertura";
72  
73      private String cloverAnchorLink = "/" + dashboardReportFile + "#clover";
74  
75      private String surefireAnchorLink = "/" + dashboardReportFile + "#surefire";
76  
77      private String checkstyleAnchorLink = "/" + dashboardReportFile + "#checkstyle";
78  
79      private String taglistAnchorLink = "/" + dashboardReportFile + "#taglist";
80  
81      private String pmdAnchorLink = "/" + dashboardReportFile + "#pmd";
82  
83      private String cpdAnchorLink = "/" + dashboardReportFile + "#cpd";
84  
85      private String findbugsAnchorLink = "/" + dashboardReportFile + "#findbugs";
86  
87      private DashBoardMavenProject mavenProject;
88  
89      private Map map = new Hashtable();
90  
91      private boolean isDBAvailable = false;
92  
93      private boolean generateGraphs = true;
94  
95      /**
96       *
97       * @param dashboardReport
98       */
99      public DashBoardMultiReportGenerator( DashBoardMavenProject mavenProject, boolean isDBAvailable,
100                                           boolean generateGraphs, Log log )
101     {
102         super( log );
103         this.mavenProject = mavenProject;
104         this.isDBAvailable = isDBAvailable;
105         this.generateGraphs = generateGraphs;
106         Set reports = mavenProject.getReports();
107         Iterator iter = reports.iterator();
108         while ( iter.hasNext() )
109         {
110             IDashBoardReportBean report = (IDashBoardReportBean) iter.next();
111             if ( report != null )
112             {
113                 map.put( report.getClass(), report );
114             }
115         }
116 
117     }
118 
119     public void doGenerateReport( ResourceBundle bundle, Sink sink )
120     {
121 
122         getLog().debug( "DashBoardMultiReportGenerator doGenerateReport(...)" );
123 
124         createTitle( bundle, sink );
125         addDashboardCss(sink);
126         sink.body();
127         sink.anchor( "top" );
128         sink.anchor_();
129         createHeader( bundle, sink );
130 
131         createBodyReport( bundle, sink );
132 
133         sink.body_();
134 
135         sink.flush();
136 
137         sink.close();
138     }
139 
140     public void createTitle( ResourceBundle bundle, Sink sink )
141     {
142         sink.head();
143         sink.title();
144         sink.text( bundle.getString( "dashboard.multireport.name" ) );
145         sink.title_();
146         sink.head_();
147     }
148 
149     public void createHeader( ResourceBundle bundle, Sink sink )
150     {
151         sink.section1();
152 
153         sink.sectionTitle1();
154         sink.text( bundle.getString( "dashboard.multireport.name" ) + " : " + this.mavenProject.getProjectName() );
155         sink.sectionTitle1_();
156 
157         sink.text( "Date Generated: " + new SimpleDateFormat().format( new Date( System.currentTimeMillis() ) ) );
158         sink.horizontalRule();
159         sink.sectionTitle3();
160         sink.text( "[" );
161         sink.link( "dashboard-report.html" );
162         sink.text( "Summary Dashboard" );
163         sink.link_();
164         sink.text( "]" );
165         sink.sectionTitle3_();
166         sink.horizontalRule();
167 
168         if ( map.get( CoberturaReportBean.class ) != null )
169         {
170             sink.text( "[" );
171             sink.link( "#cobertura" );
172             sink.text( bundle.getString( "report.cobertura.header" ) );
173             sink.link_();
174             sink.text( "]" );
175             sink.lineBreak();
176         }
177         if ( map.get( CloverReportBean.class ) != null )
178         {
179             sink.text( "[" );
180             sink.link( "#clover" );
181             sink.text( bundle.getString( "report.clover.header" ) );
182             sink.link_();
183             sink.text( "]" );
184             sink.lineBreak();
185         }
186         if ( map.get( SurefireReportBean.class ) != null )
187         {
188             sink.text( "[" );
189             sink.link( "#surefire" );
190             sink.text( bundle.getString( "report.surefire.header" ) );
191             sink.link_();
192             sink.text( "]" );
193             sink.lineBreak();
194         }
195         if ( map.get( CheckstyleReportBean.class ) != null )
196         {
197             sink.text( "[" );
198             sink.link( "#checkstyle" );
199             sink.text( bundle.getString( "report.checkstyle.header" ) );
200             sink.link_();
201             sink.text( "]" );
202             sink.lineBreak();
203         }
204         if ( map.get( PmdReportBean.class ) != null )
205         {
206             sink.text( "[" );
207             sink.link( "#pmd" );
208             sink.text( bundle.getString( "report.pmd.header" ) );
209             sink.link_();
210             sink.text( "]" );
211             sink.lineBreak();
212         }
213         if ( map.get( CpdReportBean.class ) != null )
214         {
215             sink.text( "[" );
216             sink.link( "#cpd" );
217             sink.text( bundle.getString( "report.cpd.header" ) );
218             sink.link_();
219             sink.text( "]" );
220             sink.lineBreak();
221         }
222         if ( map.get( FindBugsReportBean.class ) != null )
223         {
224             sink.text( "[" );
225             sink.link( "#findbugs" );
226             sink.text( bundle.getString( "report.findbugs.header" ) );
227             sink.link_();
228             sink.text( "]" );
229             sink.lineBreak();
230         }
231         if ( map.get( JDependReportBean.class ) != null )
232         {
233             sink.text( "[" );
234             sink.link( "#jdepend" );
235             sink.text( bundle.getString( "report.xrefpackage.header" ) );
236             sink.link_();
237             sink.text( "]" );
238             sink.lineBreak();
239         }
240         if ( map.get( TagListReportBean.class ) != null )
241         {
242             sink.text( "[" );
243             sink.link( "#taglist" );
244             sink.text( bundle.getString( "report.taglist.header" ) );
245             sink.link_();
246             sink.text( "]" );
247             sink.lineBreak();
248         }
249 
250         sink.horizontalRule();
251         sink.lineBreak();
252         if ( !this.generateGraphs )
253         {
254             sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
255             sink.lineBreak();
256         }
257         sink.section1_();
258     }
259 
260     public void createBodyReport( ResourceBundle bundle, Sink sink )
261     {
262         getLog().debug( "DashBoardMultiReportGenerator createBodyByReport(...)" );
263         if ( map.get( CoberturaReportBean.class ) != null )
264         {
265             createCoberturaSection( bundle, sink );
266         }
267         if ( map.get( CloverReportBean.class ) != null )
268         {
269             createCloverSection( bundle, sink );
270         }
271         if ( map.get( SurefireReportBean.class ) != null )
272         {
273             createSurefireSection( bundle, sink );
274         }
275         if ( map.get( CheckstyleReportBean.class ) != null )
276         {
277             createCheckStyleSection( bundle, sink );
278         }
279         if ( map.get( PmdReportBean.class ) != null )
280         {
281             createPmdSection( bundle, sink );
282         }
283         if ( map.get( CpdReportBean.class ) != null )
284         {
285             createCpdSection( bundle, sink );
286         }
287         if ( map.get( FindBugsReportBean.class ) != null )
288         {
289             createFindBugsSection( bundle, sink );
290         }
291         if ( map.get( JDependReportBean.class ) != null )
292         {
293             createJDependSection( bundle, sink );
294         }
295         if ( map.get( TagListReportBean.class ) != null )
296         {
297             createTaglistSection( bundle, sink );
298         }
299     }
300 
301     public void createSurefireSection( ResourceBundle bundle, Sink sink )
302     {
303         sink.section1();
304         sink.sectionTitle2();
305         sink.anchor( "surefire" );
306         sink.text( bundle.getString( "report.surefire.header" ) );
307         sink.anchor_();
308         sink.sectionTitle2_();
309         linkToTopPage( sink );
310         sink.lineBreak();
311         if ( this.isDBAvailable )
312         {
313             linkToHistoricPage( sink, "surefire" );
314         }
315         sink.section1_();
316         // sink.lineBreak();
317 
318         sink.table();
319         sink.tableRow();
320         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
321         sinkHeader( sink, bundle.getString( "report.surefire.label.successrate" ) );
322         sinkHeader( sink, bundle.getString( "report.surefire.label.tests" ) );
323         sinkHeader( sink, bundle.getString( "report.surefire.label.errors" ) );
324         sinkHeader( sink, bundle.getString( "report.surefire.label.failures" ) );
325         sinkHeader( sink, bundle.getString( "report.surefire.label.skipped" ) );
326         sinkHeader( sink, bundle.getString( "report.surefire.label.time" ) );
327         sink.tableRow_();
328         Map datas = new Hashtable();
329         createSurefireLineByReport( bundle, sink, mavenProject, true, "", datas );
330 
331         SurefireReportBean fireReportBean =
332             (SurefireReportBean) mavenProject.getReportsByType( SurefireReportBean.class );
333         if ( fireReportBean != null )
334         {
335             sink.tableRow();
336 
337             sinkHeader( sink, "Total" );
338 
339             // sinkHeader( sink, Double.toString( fireReportBean.getSucessRate() ) + "%" );
340             sinkHeaderCellPercentGraphic( sink, fireReportBean.getSucessRate() / 100, "surefire" );
341 
342             sinkHeader( sink, Integer.toString( fireReportBean.getNbTests() ) );
343 
344             sinkHeader( sink, Integer.toString( fireReportBean.getNbErrors() ) );
345 
346             sinkHeader( sink, Integer.toString( fireReportBean.getNbFailures() ) );
347 
348             sinkHeader( sink, Integer.toString( fireReportBean.getNbSkipped() ) );
349 
350             sinkHeader( sink, Double.toString( fireReportBean.getElapsedTime() ) );
351 
352             sink.tableRow_();
353         }
354 
355         sink.table_();
356 
357         sink.lineBreak();
358         if ( this.generateGraphs )
359         {
360             IChartRenderer chart =
361                 new StackedBarChartRenderer(
362                                              new SurefireBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
363             if ( !chart.isEmpty() )
364             {
365                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
366                 filename = filename + "_Surefire." + chart.getFileExtension();
367                 filename = filename.replace( ' ', '_' );
368                 String filenamePath = getImagesPath() + "/" + filename;
369                 getLog().debug( "createSurefireGraph = " + filenamePath );
370                 try
371                 {
372                     chart.saveToFile( filenamePath );
373                     String link = "images/" + filename;
374                     link = link.replace( ' ', '_' );
375                     sink.figure();
376                     sink.figureGraphics( link );
377                     sink.figure_();
378                 }
379                 catch ( IOException e )
380                 {
381                     getLog().debug( "createSurefireGraph exception = " + e.getMessage() );
382                 }
383             }
384         }
385         // else
386         // {
387         // sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
388         // sink.lineBreak();
389         // }
390     }
391 
392     public void createSurefireLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
393                                             boolean isRoot, String prefix, Map datas )
394     {
395 
396         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
397         {
398             Iterator iter = mavenProject.getModules().iterator();
399             if ( !isRoot )
400             {
401                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, surefireAnchorLink );
402             }
403             while ( iter.hasNext() )
404             {
405                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
406                 createSurefireLineByReport( bundle, sink, subproject, false, prefix, datas );
407             }
408         }
409         else
410         {
411             SurefireReportBean fireReportBean =
412                 (SurefireReportBean) mavenProject.getReportsByType( SurefireReportBean.class );
413             if ( fireReportBean != null )
414             {
415                 sink.tableRow();
416                 datas.put( mavenProject.getProjectName(), fireReportBean );
417                 writeProjectCell( sink, mavenProject, prefix, surefireAnchorLink );
418 
419                 // sinkCell( sink, Double.toString( fireReportBean.getSucessRate() ) + "%" );
420                 sinkCellPercentGraphic( sink, fireReportBean.getSucessRate() / 100, "surefire" );
421 
422                 sinkCell( sink, Integer.toString( fireReportBean.getNbTests() ) );
423 
424                 sinkCell( sink, Integer.toString( fireReportBean.getNbErrors() ) );
425 
426                 sinkCell( sink, Integer.toString( fireReportBean.getNbFailures() ) );
427 
428                 sinkCell( sink, Integer.toString( fireReportBean.getNbSkipped() ) );
429 
430                 sinkCell( sink, Double.toString( fireReportBean.getElapsedTime() ) );
431                 sink.tableRow_();
432             }
433         }
434     }
435 
436     /**
437      * Fixes MOJO-813. addition of Clover support written by <a href="mailto:mbeerman@yahoo.com">Matthew Beermann</a>
438      *
439      * @param bundle
440      * @param sink
441      */
442     public void createCloverSection( ResourceBundle bundle, Sink sink )
443     {
444         sink.section1();
445         sink.sectionTitle2();
446         sink.anchor( "clover" );
447         sink.text( bundle.getString( "report.clover.header" ) );
448         sink.anchor_();
449         sink.sectionTitle2_();
450         linkToTopPage( sink );
451         sink.lineBreak();
452         if ( this.isDBAvailable )
453         {
454             linkToHistoricPage( sink, "clover" );
455         }
456         sink.section1_();
457 
458         sink.table();
459         sink.tableRow();
460         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
461         sinkHeader( sink, bundle.getString( "report.clover.label.total" ) );
462         sinkHeader( sink, bundle.getString( "report.clover.label.conditionals" ) );
463         sinkHeader( sink, bundle.getString( "report.clover.label.statements" ) );
464         sinkHeader( sink, bundle.getString( "report.clover.label.methods" ) );
465 
466         sink.tableRow_();
467         Map datas = new Hashtable();
468         createCloverLineByReport( bundle, sink, mavenProject, true, "", datas );
469 
470         CloverReportBean reportBean = (CloverReportBean) mavenProject.getReportsByType( CloverReportBean.class );
471         if ( reportBean != null )
472         {
473             sink.tableRow();
474 
475             sinkHeader( sink, "Total" );
476 
477             if ( this.generateGraphs )
478             {
479                 sinkHeader( sink, reportBean.getElementsLabel() );
480 
481                 sinkHeader( sink, reportBean.getConditionalsLabel() );
482 
483                 sinkHeader( sink, reportBean.getStatementsLabel() );
484 
485                 sinkHeader( sink, reportBean.getMethodsLabel() );
486 
487             }
488             else
489             {
490                 sink.tableHeaderCell();
491                 sinkPercentGraphic( sink, reportBean.getPercentCoveredConditionals() );
492                 sink.text( "(" + reportBean.getCoveredElements() + " / " + reportBean.getElements() + ")" );
493                 sink.tableHeaderCell_();
494                 sink.tableHeaderCell();
495                 sinkPercentGraphic( sink, reportBean.getPercentCoveredConditionals() );
496                 sink.text( "(" + reportBean.getCoveredConditionals() + " / " + reportBean.getConditionals() + ")" );
497                 sink.tableHeaderCell_();
498                 sink.tableHeaderCell();
499                 sinkPercentGraphic( sink, reportBean.getPercentCoveredStatements() );
500                 sink.text( "(" + reportBean.getCoveredStatements() + " / " + reportBean.getStatements() + ")" );
501                 sink.tableHeaderCell_();
502                 sink.tableHeaderCell();
503                 sinkPercentGraphic( sink, reportBean.getPercentCoveredMethods() );
504                 sink.text( "(" + reportBean.getCoveredMethods() + " / " + reportBean.getMethods() + ")" );
505                 sink.tableHeaderCell_();
506             }
507 
508             sink.tableRow_();
509         }
510         sink.table_();
511 
512         sink.lineBreak();
513         if ( this.generateGraphs )
514         {
515             IChartRenderer chart =
516                 new BarChartRenderer( new MultiCloverBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
517             if ( !chart.isEmpty() )
518             {
519                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
520                 filename = filename + "_Clover." + chart.getFileExtension();
521                 filename = filename.replace( ' ', '_' );
522                 String filenamePath = getImagesPath() + "/" + filename;
523                 getLog().debug( "createCloverGraph = " + filenamePath );
524                 try
525                 {
526                     chart.saveToFile( filenamePath );
527                     String link = "images/" + filename;
528                     link = link.replace( ' ', '_' );
529                     sink.figure();
530                     sink.figureGraphics( link );
531                     sink.figure_();
532                 }
533                 catch ( IOException e )
534                 {
535                     getLog().debug( "createCloverGraph exception = " + e.getMessage() );
536                 }
537             }
538         }
539         // else
540         // {
541         // sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
542         // sink.lineBreak();
543         // }
544     }
545 
546     /**
547      * Fixes MOJO-813. addition of Clover support written by <a href="mailto:mbeerman@yahoo.com">Matthew Beermann</a>
548      *
549      * @param bundle
550      * @param sink
551      * @param DashBoardMavenProject
552      * @param isRoot
553      * @param prefix
554      */
555     public void createCloverLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
556                                           boolean isRoot, String prefix, Map datas )
557     {
558         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
559         {
560             Iterator iter = mavenProject.getModules().iterator();
561             if ( !isRoot )
562             {
563                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, cloverAnchorLink );
564             }
565             while ( iter.hasNext() )
566             {
567                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
568                 createCloverLineByReport( bundle, sink, subproject, false, prefix, datas );
569             }
570         }
571         else
572         {
573             CloverReportBean cloverReportBean =
574                 (CloverReportBean) mavenProject.getReportsByType( CloverReportBean.class );
575             if ( cloverReportBean != null )
576             {
577                 sink.tableRow();
578                 datas.put( mavenProject.getProjectName(), cloverReportBean );
579                 writeProjectCell( sink, mavenProject, prefix, cloverAnchorLink );
580 
581                 if ( this.generateGraphs )
582                 {
583                     sinkCell( sink, cloverReportBean.getElementsLabel() );
584                 }
585                 else
586                 {
587                     sink.tableCell();
588                     sinkPercentGraphic( sink, cloverReportBean.getPercentCoveredConditionals() );
589                     sink.text( "(" + cloverReportBean.getCoveredElements() + " / " + cloverReportBean.getElements()
590                                     + ")" );
591                     sink.tableCell_();
592                 }
593                 sinkCell( sink, cloverReportBean.getConditionalsLabel() );
594 
595                 sinkCell( sink, cloverReportBean.getStatementsLabel() );
596 
597                 sinkCell( sink, cloverReportBean.getMethodsLabel() );
598 
599                 sink.tableRow_();
600             }
601         }
602     }
603 
604     public void createCoberturaSection( ResourceBundle bundle, Sink sink )
605     {
606         sink.section1();
607         sink.sectionTitle2();
608         sink.anchor( "cobertura" );
609         sink.text( bundle.getString( "report.cobertura.header" ) );
610         sink.anchor_();
611         sink.sectionTitle2_();
612         linkToTopPage( sink );
613         sink.lineBreak();
614         if ( this.isDBAvailable )
615         {
616             linkToHistoricPage( sink, "cobertura" );
617         }
618         sink.section1_();
619         // sink.lineBreak();
620 
621         sink.table();
622         sink.tableRow();
623         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
624         sinkHeader( sink, bundle.getString( "report.cobertura.label.nbclasses" ) );
625         sinkHeader( sink, bundle.getString( "report.cobertura.label.linecover" ) );
626         sinkHeader( sink, bundle.getString( "report.cobertura.label.branchcover" ) );
627         sink.tableRow_();
628         Map datas = new Hashtable();
629         createCoberturaLineByReport( bundle, sink, mavenProject, true, "", datas );
630         CoberturaReportBean reportBean =
631             (CoberturaReportBean) mavenProject.getReportsByType( CoberturaReportBean.class );
632         if ( reportBean != null )
633         {
634             sink.tableRow();
635 
636             sinkHeader( sink, "Total" );
637             sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
638             // sinkHeader( sink, getPercentValue( reportBean.getLineCoverRate() ) );
639             sinkHeaderCellPercentGraphic( sink, reportBean.getLineCoverRate(), "cobertura" );
640             // sinkHeader( sink, getPercentValue( reportBean.getBranchCoverRate() ) );
641             sinkHeaderCellPercentGraphic( sink, reportBean.getBranchCoverRate(), "cobertura" );
642 
643             sink.tableRow_();
644         }
645         sink.table_();
646 
647         sink.lineBreak();
648         if ( this.generateGraphs )
649         {
650             IChartRenderer chart =
651                 new BarChartRenderer( new CoberturaBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
652             if ( !chart.isEmpty() )
653             {
654                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
655                 filename = filename + "_Cobertura." + chart.getFileExtension();
656                 filename = filename.replace( ' ', '_' );
657                 String filenamePath = getImagesPath() + "/" + filename;
658                 getLog().debug( "createCoberturaGraph = " + filenamePath );
659                 try
660                 {
661                     chart.saveToFile( filenamePath );
662                     String link = "images/" + filename;
663                     link = link.replace( ' ', '_' );
664                     sink.figure();
665                     sink.figureGraphics( link );
666                     sink.figure_();
667                 }
668                 catch ( IOException e )
669                 {
670                     getLog().debug( "createCoberturaGraph exception = " + e.getMessage() );
671                 }
672             }
673         }
674         // else
675         // {
676         // sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
677         // sink.lineBreak();
678         // }
679     }
680 
681     public void createCoberturaLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
682                                              boolean isRoot, String prefix, Map datas )
683     {
684         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
685         {
686             Iterator iter = mavenProject.getModules().iterator();
687             if ( !isRoot )
688             {
689                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, coberturaAnchorLink );
690             }
691             while ( iter.hasNext() )
692             {
693                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
694                 createCoberturaLineByReport( bundle, sink, subproject, false, prefix, datas );
695             }
696         }
697         else
698         {
699             CoberturaReportBean coberReportBean =
700                 (CoberturaReportBean) mavenProject.getReportsByType( CoberturaReportBean.class );
701             if ( coberReportBean != null )
702             {
703                 sink.tableRow();
704                 datas.put( mavenProject.getProjectName(), coberReportBean );
705                 writeProjectCell( sink, mavenProject, prefix, coberturaAnchorLink );
706 
707                 sinkCell( sink, Integer.toString( coberReportBean.getNbClasses() ) );
708 
709                 if ( this.generateGraphs )
710                 {
711                     sinkCell( sink, getPercentValue( coberReportBean.getLineCoverRate() ) );
712                     sinkCell( sink, getPercentValue( coberReportBean.getBranchCoverRate() ) );
713                 }
714                 else
715                 {
716                     sinkCellPercentGraphic( sink, coberReportBean.getLineCoverRate(), "cobertura" );
717                     sinkCellPercentGraphic( sink, coberReportBean.getBranchCoverRate(), "cobertura" );
718                 }
719 
720                 sink.tableRow_();
721             }
722         }
723     }
724 
725     public void createPmdSection( ResourceBundle bundle, Sink sink )
726     {
727         sink.section1();
728         sink.sectionTitle2();
729         sink.anchor( "pmd" );
730         sink.text( bundle.getString( "report.pmd.header" ) );
731         sink.anchor_();
732         sink.sectionTitle2_();
733         linkToTopPage( sink );
734         sink.lineBreak();
735         if ( this.isDBAvailable )
736         {
737             linkToHistoricPage( sink, "pmd" );
738         }
739         sink.section1_();
740         // sink.lineBreak();
741 
742         sink.table();
743         sink.tableRow();
744         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
745         sinkHeader( sink, bundle.getString( "report.pmd.label.nbclasses" ) );
746         sinkHeader( sink, bundle.getString( "report.pmd.label.nbviolations" ) );
747         sink.tableRow_();
748 
749         Map datas = new Hashtable();
750         createPmdLineByReport( bundle, sink, mavenProject, true, "", datas );
751         PmdReportBean reportBean = (PmdReportBean) mavenProject.getReportsByType( PmdReportBean.class );
752         if ( reportBean != null )
753         {
754             sink.tableRow();
755 
756             sinkHeader( sink, "Total" );
757             sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
758             sinkHeader( sink, Integer.toString( reportBean.getNbViolations() ) );
759 
760             sink.tableRow_();
761         }
762         sink.table_();
763 
764         sink.lineBreak();
765         if ( this.generateGraphs )
766         {
767             IChartRenderer chart =
768                 new BarChartRenderer( new PmdBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
769             if ( !chart.isEmpty() )
770             {
771                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
772                 filename = filename + "_Pmd." + chart.getFileExtension();
773                 filename = filename.replace( ' ', '_' );
774                 String filenamePath = getImagesPath() + "/" + filename;
775                 getLog().debug( "createPmdGraph = " + filenamePath );
776                 try
777                 {
778                     chart.saveToFile( filenamePath );
779                     String link = "images/" + filename;
780                     link = link.replace( ' ', '_' );
781                     sink.figure();
782                     sink.figureGraphics( link );
783                     sink.figure_();
784                 }
785                 catch ( IOException e )
786                 {
787                     getLog().debug( "createPmdGraph exception = " + e.getMessage() );
788                 }
789             }
790         }
791         // else
792         // {
793         // sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
794         // sink.lineBreak();
795         // }
796     }
797 
798     public void createPmdLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
799                                        boolean isRoot, String prefix, Map datas )
800     {
801         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
802         {
803             Iterator iter = mavenProject.getModules().iterator();
804             if ( !isRoot )
805             {
806                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, pmdAnchorLink );
807             }
808             while ( iter.hasNext() )
809             {
810                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
811                 createPmdLineByReport( bundle, sink, subproject, false, prefix, datas );
812             }
813         }
814         else
815         {
816             PmdReportBean pmdReportBean = (PmdReportBean) mavenProject.getReportsByType( PmdReportBean.class );
817             if ( pmdReportBean != null )
818             {
819                 sink.tableRow();
820                 datas.put( mavenProject.getProjectName(), pmdReportBean );
821                 writeProjectCell( sink, mavenProject, prefix, pmdAnchorLink );
822 
823                 sinkCell( sink, Integer.toString( pmdReportBean.getNbClasses() ) );
824                 sinkCell( sink, Integer.toString( pmdReportBean.getNbViolations() ) );
825                 sink.tableRow_();
826             }
827         }
828     }
829 
830     public void createCpdSection( ResourceBundle bundle, Sink sink )
831     {
832         sink.section1();
833         sink.sectionTitle2();
834         sink.anchor( "cpd" );
835         sink.text( bundle.getString( "report.cpd.header" ) );
836         sink.anchor_();
837         sink.sectionTitle2_();
838         linkToTopPage( sink );
839         sink.lineBreak();
840         if ( this.isDBAvailable )
841         {
842             linkToHistoricPage( sink, "cpd" );
843         }
844         sink.section1_();
845         // sink.lineBreak();
846 
847         sink.table();
848         sink.tableRow();
849         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
850         sinkHeader( sink, bundle.getString( "report.cpd.label.nbclasses" ) );
851         sinkHeader( sink, bundle.getString( "report.cpd.label.nbduplicate" ) );
852         sink.tableRow_();
853         Map datas = new Hashtable();
854         createCpdLineByReport( bundle, sink, mavenProject, true, "", datas );
855         CpdReportBean reportBean = (CpdReportBean) mavenProject.getReportsByType( CpdReportBean.class );
856         if ( reportBean != null )
857         {
858             sink.tableRow();
859 
860             sinkHeader( sink, "Total" );
861             sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
862             sinkHeader( sink, Integer.toString( reportBean.getNbDuplicate() ) );
863             sink.tableRow_();
864         }
865         sink.table_();
866 
867         sink.lineBreak();
868         if ( this.generateGraphs )
869         {
870             IChartRenderer chart =
871                 new BarChartRenderer( new CpdBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
872             if ( !chart.isEmpty() )
873             {
874                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
875                 filename = filename + "_Cpd." + chart.getFileExtension();
876                 filename = filename.replace( ' ', '_' );
877                 String filenamePath = getImagesPath() + "/" + filename;
878                 getLog().debug( "createCpdGraph = " + filenamePath );
879                 try
880                 {
881                     chart.saveToFile( filenamePath );
882                     String link = "images/" + filename;
883                     link = link.replace( ' ', '_' );
884                     sink.figure();
885                     sink.figureGraphics( link );
886                     sink.figure_();
887                 }
888                 catch ( IOException e )
889                 {
890                     getLog().debug( "createCpdGraph exception = " + e.getMessage() );
891                 }
892             }
893         }
894         // else
895         // {
896         // sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
897         // sink.lineBreak();
898         // }
899     }
900 
901     public void createCpdLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
902                                        boolean isRoot, String prefix, Map datas )
903     {
904 
905         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
906         {
907             Iterator iter = mavenProject.getModules().iterator();
908             if ( !isRoot )
909             {
910                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, cpdAnchorLink );
911             }
912             while ( iter.hasNext() )
913             {
914                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
915                 createCpdLineByReport( bundle, sink, subproject, false, prefix, datas );
916             }
917         }
918         else
919         {
920             CpdReportBean cpdReportBean = (CpdReportBean) mavenProject.getReportsByType( CpdReportBean.class );
921             if ( cpdReportBean != null )
922             {
923                 sink.tableRow();
924                 datas.put( mavenProject.getProjectName(), cpdReportBean );
925                 writeProjectCell( sink, mavenProject, prefix, cpdAnchorLink );
926 
927                 sinkCell( sink, Integer.toString( cpdReportBean.getNbClasses() ) );
928                 sinkCell( sink, Integer.toString( cpdReportBean.getNbDuplicate() ) );
929                 sink.tableRow_();
930             }
931         }
932     }
933 
934     public void createFindBugsSection( ResourceBundle bundle, Sink sink )
935     {
936         sink.section1();
937         sink.sectionTitle2();
938         sink.anchor( "findbugs" );
939         sink.text( bundle.getString( "report.findbugs.header" ) );
940         sink.anchor_();
941         sink.sectionTitle2_();
942         linkToTopPage( sink );
943         sink.lineBreak();
944         if ( this.isDBAvailable )
945         {
946             linkToHistoricPage( sink, "findbugs" );
947         }
948         sink.section1_();
949         // sink.lineBreak();
950 
951         sink.table();
952         sink.tableRow();
953         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
954         sinkHeader( sink, bundle.getString( "report.findbugs.label.nbclasses" ) );
955         sinkHeader( sink, bundle.getString( "report.findbugs.label.nbbugs" ) );
956         sinkHeader( sink, bundle.getString( "report.findbugs.label.nberrors" ) );
957         sinkHeader( sink, bundle.getString( "report.findbugs.label.nbMissingClasses" ) );
958         sink.tableRow_();
959         Map datas = new Hashtable();
960         createFindBugsLineByReport( bundle, sink, mavenProject, true, "", datas );
961         FindBugsReportBean reportBean = (FindBugsReportBean) mavenProject.getReportsByType( FindBugsReportBean.class );
962         if ( reportBean != null )
963         {
964             sink.tableRow();
965 
966             sinkHeader( sink, "Total" );
967             sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
968             sinkHeader( sink, Integer.toString( reportBean.getNbBugs() ) );
969             sinkHeader( sink, Integer.toString( reportBean.getNbErrors() ) );
970             sinkHeader( sink, Integer.toString( reportBean.getNbMissingClasses() ) );
971 
972             sink.tableRow_();
973         }
974         sink.table_();
975 
976         sink.lineBreak();
977         if ( this.generateGraphs )
978         {
979             IChartRenderer chart =
980                 new BarChartRenderer( new FindBugsBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
981             if ( !chart.isEmpty() )
982             {
983                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
984                 filename = filename + "_FindBugs." + chart.getFileExtension();
985                 filename = filename.replace( ' ', '_' );
986                 String filenamePath = getImagesPath() + "/" + filename;
987                 getLog().debug( "createFindBugsGraph = " + filenamePath );
988                 try
989                 {
990                     chart.saveToFile( filenamePath );
991                     String link = "images/" + filename;
992                     link = link.replace( ' ', '_' );
993                     sink.figure();
994                     sink.figureGraphics( link );
995                     sink.figure_();
996                 }
997                 catch ( IOException e )
998                 {
999                     getLog().debug( "createFindBugsGraph exception = " + e.getMessage() );
1000                 }
1001             }
1002         }
1003         // else
1004         // {
1005         // sink.text( "[" + bundle.getString( "dashboard.report.generategraphs.disabled" ) + "]" );
1006         // sink.lineBreak();
1007         // }
1008     }
1009 
1010     public void createFindBugsLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
1011                                             boolean isRoot, String prefix, Map datas )
1012     {
1013 
1014         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
1015         {
1016             Iterator iter = mavenProject.getModules().iterator();
1017             if ( !isRoot )
1018             {
1019                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, this.findbugsAnchorLink );
1020             }
1021             while ( iter.hasNext() )
1022             {
1023                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
1024                 createFindBugsLineByReport( bundle, sink, subproject, false, prefix, datas );
1025             }
1026         }
1027         else
1028         {
1029             FindBugsReportBean findBugsReportBean =
1030                 (FindBugsReportBean) mavenProject.getReportsByType( FindBugsReportBean.class );
1031             if ( findBugsReportBean != null )
1032             {
1033                 sink.tableRow();
1034                 datas.put( mavenProject.getProjectName(), findBugsReportBean );
1035                 writeProjectCell( sink, mavenProject, prefix, this.findbugsAnchorLink );
1036 
1037                 sinkCell( sink, Integer.toString( findBugsReportBean.getNbClasses() ) );
1038                 sinkCell( sink, Integer.toString( findBugsReportBean.getNbBugs() ) );
1039                 sinkCell( sink, Integer.toString( findBugsReportBean.getNbErrors() ) );
1040                 sinkCell( sink, Integer.toString( findBugsReportBean.getNbMissingClasses() ) );
1041                 sink.tableRow_();
1042             }
1043         }
1044     }
1045 
1046     public void createCheckStyleSection( ResourceBundle bundle, Sink sink )
1047     {
1048         sink.section1();
1049         sink.sectionTitle2();
1050         sink.anchor( "checkstyle" );
1051         sink.text( bundle.getString( "report.checkstyle.header" ) );
1052         sink.anchor_();
1053         sink.sectionTitle2_();
1054         linkToTopPage( sink );
1055         sink.lineBreak();
1056         if ( this.isDBAvailable )
1057         {
1058             linkToHistoricPage( sink, "checkstyle" );
1059         }
1060         sink.section1_();
1061         // sink.lineBreak();
1062 
1063         sink.table();
1064         sink.tableRow();
1065         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
1066         sink.tableHeaderCell();
1067         sink.text( bundle.getString( "report.checkstyle.files" ) );
1068         sink.tableHeaderCell_();
1069 
1070         sink.tableHeaderCell();
1071         sink.text( bundle.getString( "report.checkstyle.column.total" ) );
1072         sink.tableHeaderCell_();
1073 
1074         sink.tableHeaderCell();
1075         sink.text( bundle.getString( "report.checkstyle.column.infos" ) );
1076         sink.nonBreakingSpace();
1077         iconInfo( sink );
1078         sink.tableHeaderCell_();
1079 
1080         sink.tableHeaderCell();
1081         sink.text( bundle.getString( "report.checkstyle.column.warnings" ) );
1082         sink.nonBreakingSpace();
1083         iconWarning( sink );
1084         sink.tableHeaderCell_();
1085 
1086         sink.tableHeaderCell();
1087         sink.text( bundle.getString( "report.checkstyle.column.errors" ) );
1088         sink.nonBreakingSpace();
1089         iconError( sink );
1090         sink.tableHeaderCell_();
1091         sink.tableRow_();
1092         Map datas = new Hashtable();
1093         CheckstyleReportBean reportBean =
1094             (CheckstyleReportBean) mavenProject.getReportsByType( CheckstyleReportBean.class );
1095         createCheckStyleLineByReport( bundle, sink, mavenProject, true, "", datas, reportBean.getNbTotal() );
1096 
1097         if ( reportBean != null )
1098         {
1099             sink.tableRow();
1100 
1101             sinkHeader( sink, "Total" );
1102             sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
1103             sinkHeader( sink, Integer.toString( reportBean.getNbTotal() ) );
1104             sink.tableHeaderCell();
1105             sink.text( Integer.toString( reportBean.getNbInfos() ) );
1106             sinkInvertPercentGraphic( sink, reportBean.getPercentInfos() );
1107             sink.tableHeaderCell_();
1108             sink.tableHeaderCell();
1109             sink.text( Integer.toString( reportBean.getNbWarnings() ) );
1110             sinkInvertPercentGraphic( sink, reportBean.getPercentWarnings() );
1111             sink.tableHeaderCell_();
1112             sink.tableHeaderCell();
1113             sink.text( Integer.toString( reportBean.getNbErrors() ) );
1114             sinkInvertPercentGraphic( sink, reportBean.getPercentErrors() );
1115             sink.tableHeaderCell_();
1116 
1117             sink.tableRow_();
1118         }
1119         sink.table_();
1120 
1121         sink.lineBreak();
1122         if ( this.generateGraphs )
1123         {
1124             IChartRenderer chart =
1125                 new StackedBarChartRenderer( new CheckstyleBarChartStrategy( bundle, mavenProject.getProjectName(),
1126                                                                              datas ) );
1127             if ( !chart.isEmpty() )
1128             {
1129                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
1130                 filename = filename + "_CheckStyle." + chart.getFileExtension();
1131                 filename = filename.replace( ' ', '_' );
1132                 String filenamePath = getImagesPath() + "/" + filename;
1133                 getLog().debug( "createCheckStyleGraph = " + filenamePath );
1134                 try
1135                 {
1136                     chart.saveToFile( filenamePath );
1137                     String link = "images/" + filename;
1138                     link = link.replace( ' ', '_' );
1139                     sink.figure();
1140                     sink.figureGraphics( link );
1141                     sink.figure_();
1142                 }
1143                 catch ( IOException e )
1144                 {
1145                     getLog().debug( "createCheckStyleGraph exception = " + e.getMessage() );
1146                 }
1147             }
1148         }
1149 
1150     }
1151 
1152     public void createCheckStyleLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
1153                                               boolean isRoot, String prefix, Map datas, int total )
1154     {
1155 
1156         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
1157         {
1158             Iterator iter = mavenProject.getModules().iterator();
1159             if ( !isRoot )
1160             {
1161                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, checkstyleAnchorLink );
1162             }
1163             while ( iter.hasNext() )
1164             {
1165                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
1166                 createCheckStyleLineByReport( bundle, sink, subproject, false, prefix, datas, total );
1167             }
1168         }
1169         else
1170         {
1171             CheckstyleReportBean checkStyleReport =
1172                 (CheckstyleReportBean) mavenProject.getReportsByType( CheckstyleReportBean.class );
1173             if ( checkStyleReport != null )
1174             {
1175                 sink.tableRow();
1176                 datas.put( mavenProject.getProjectName(), checkStyleReport );
1177                 writeProjectCell( sink, mavenProject, prefix, checkstyleAnchorLink );
1178 
1179                 sinkCell( sink, Integer.toString( checkStyleReport.getNbClasses() ) );
1180                 if ( this.generateGraphs )
1181                 {
1182                     sinkCell( sink, Integer.toString( checkStyleReport.getNbTotal() ) );
1183                 }
1184                 else
1185                 {
1186                     // sinkCellInvertPercentGraphic( sink, checkStyleReport.getNbTotal()/(double)total,
1187                     // "taglist",Integer.toString( checkStyleReport.getNbTotal()) );
1188                     sink.tableCell();
1189                     sink.text( Integer.toString( checkStyleReport.getNbTotal() ) );
1190                     sinkInvertPercentGraphic( sink, checkStyleReport.getNbTotal() / (double) total );
1191                     sink.tableCell_();
1192 
1193                 }
1194                 sinkCell( sink, Integer.toString( checkStyleReport.getNbInfos() ) );
1195                 sinkCell( sink, Integer.toString( checkStyleReport.getNbWarnings() ) );
1196                 sinkCell( sink, Integer.toString( checkStyleReport.getNbErrors() ) );
1197                 sink.tableRow_();
1198             }
1199         }
1200     }
1201 
1202     /**
1203      *
1204      * @param bundle
1205      * @param sink
1206      * @throws MavenReportException
1207      */
1208     public void createJDependSection( ResourceBundle bundle, Sink sink )
1209     {
1210 
1211         sink.section1();
1212         sink.sectionTitle2();
1213         sink.anchor( "jdepend" );
1214         sink.text( bundle.getString( "report.xrefpackage.header" ) );
1215         sink.anchor_();
1216         sink.sectionTitle2_();
1217         linkToTopPage( sink );
1218         sink.section1_();
1219 
1220         JDependReportBean report = (JDependReportBean) mavenProject.getReportsByType( JDependReportBean.class );
1221         if ( report == null )
1222         {
1223             sink.text( "Error: Unable to read from Jdepend data file ." );
1224         }
1225         else
1226         {
1227             double averageAC = report.getAverageAfferentCoupling();
1228 
1229             double calcul = ( Math.rint( averageAC * 1000 ) ) / 1000;
1230 
1231             sink.sectionTitle3();
1232             sink.text( bundle.getString( "report.xrefpackage.label.average" ) + " = " + calcul );
1233             sink.lineBreak();
1234             sink.text( " Nb Packages = " + report.getNbPackages() );
1235             sink.sectionTitle3_();
1236             sink.table();
1237             sink.tableRow();
1238 
1239             sinkHeader( sink, bundle.getString( "report.xrefpackage.label.package" ) );
1240 
1241             sinkHeader( sink, bundle.getString( "report.xrefpackage.label.ac" ) );
1242 
1243             sinkHeader( sink, bundle.getString( "report.xrefpackage.label.linecover" ) );
1244 
1245             sinkHeader( sink, bundle.getString( "report.xrefpackage.label.branchcover" ) );
1246 
1247             sink.tableRow_();
1248 
1249             List pack = report.getPackages();
1250             Iterator iter = pack.iterator();
1251             boolean threshold = false;
1252             while ( iter.hasNext() )
1253             {
1254 
1255                 XRefPackageBean bean = (XRefPackageBean) iter.next();
1256                 Integer ac = bean.getAfferentCoupling();
1257                 if ( ac.doubleValue() <= averageAC && !threshold )
1258                 {
1259                     threshold = true;
1260                     sink.tableRow();
1261                     sinkCellBold( sink, bundle.getString( "report.xrefpackage.label.threshold" ) );
1262                     sinkCellBold( sink, String.valueOf( calcul ) );
1263                     // sinkHeader( sink, "" );
1264                     // sinkHeader( sink, "" );
1265                     sink.tableRow_();
1266                 }
1267                 sink.tableRow();
1268                 sinkCell( sink, bean.getPackageName() );
1269                 sinkCell( sink, ac.toString() );
1270                 // sinkCell( sink, getPercentValue( bean.getLineCoverRate() ) );
1271                 sinkCellPercentGraphic( sink, bean.getLineCoverRate(), "cobertura" );
1272                 // sinkCell( sink, getPercentValue( bean.getBranchCoverRate() ) );
1273                 sinkCellPercentGraphic( sink, bean.getBranchCoverRate(), "cobertura" );
1274                 sink.tableRow_();
1275             }
1276 
1277             sink.table_();
1278         }
1279         sink.lineBreak();
1280     }
1281 
1282     private void writeProjectCell( Sink sink, DashBoardMavenProject mavenProject, String prefix, String suffix )
1283     {
1284         if ( prefix == null || prefix.length() == 0 )
1285         {
1286             String artefactId = mavenProject.getArtifactId();
1287             String link = artefactId;
1288             sinkCellWithLink( sink, mavenProject.getProjectName(), link + suffix );
1289         }
1290         else
1291         {
1292             int nbTab = prefix.split( "/" ).length;
1293             String artefactId = mavenProject.getArtifactId();
1294             String link = prefix + "/" + artefactId;
1295             sinkCellTabWithLink( sink, mavenProject.getProjectName(), nbTab, link + suffix );
1296         }
1297     }
1298 
1299     private String writeMultiProjectRow( Sink sink, DashBoardMavenProject mavenProject, String prefix, String suffix )
1300     {
1301         if ( prefix == null || prefix.length() == 0 )
1302         {
1303             String artefactId = mavenProject.getArtifactId();
1304             prefix = artefactId;
1305             sink.tableRow();
1306             sinkCellBoldWithLink( sink, mavenProject.getProjectName(), prefix + suffix );
1307             sink.tableRow_();
1308         }
1309         else
1310         {
1311             sink.tableRow();
1312             int nbTab = prefix.split( "/" ).length;
1313             String artefactId = mavenProject.getArtifactId();
1314             prefix = prefix + "/" + artefactId;
1315             sinkCellTabBoldWithLink( sink, mavenProject.getProjectName(), nbTab, prefix + suffix );
1316             sink.tableRow_();
1317 
1318         }
1319         return prefix;
1320     }
1321 
1322     public void createTaglistSection( ResourceBundle bundle, Sink sink )
1323     {
1324         sink.section1();
1325         sink.sectionTitle2();
1326         sink.anchor( "taglist" );
1327         sink.text( bundle.getString( "report.taglist.header" ) );
1328         sink.anchor_();
1329         sink.sectionTitle2_();
1330         linkToTopPage( sink );
1331         sink.lineBreak();
1332         if ( this.isDBAvailable )
1333         {
1334             linkToHistoricPage( sink, "taglist" );
1335         }
1336         sink.section1_();
1337 
1338         sink.table();
1339         sink.tableRow();
1340         sinkHeader( sink, bundle.getString( "report.project.name.header" ) );
1341         sinkHeader( sink, bundle.getString( "report.taglist.label.nbclasses" ) );
1342         sinkHeader( sink, "Total" );
1343 
1344         TagListReportBean reportBean = (TagListReportBean) mavenProject.getReportsByType( TagListReportBean.class );
1345 
1346         String[] keys = new String[reportBean.getTags().size()];
1347         int i = 0;
1348 
1349         for ( Iterator ite = reportBean.getTags().entrySet().iterator(); ite.hasNext(); )
1350         {
1351             Map.Entry entry = (Map.Entry) ite.next();
1352 
1353             sink.tableHeaderCell();
1354             sink.text( (String) entry.getKey() );
1355             keys[i] = (String) entry.getKey();
1356             i++;
1357             sink.tableHeaderCell_();
1358         }
1359 
1360         sink.tableRow_();
1361         Map datas = new Hashtable();
1362         createTaglistLineByReport( bundle, sink, mavenProject, true, "", datas, keys, reportBean.getNbTotal() );
1363         if ( reportBean != null )
1364         {
1365             sink.tableRow();
1366 
1367             sinkHeader( sink, "Total" );
1368 
1369             sinkHeader( sink, Integer.toString( reportBean.getNbClasses() ) );
1370             sinkHeader( sink, Integer.toString( reportBean.getNbTotal() ) );
1371 
1372             for ( Iterator ite = reportBean.getTags().entrySet().iterator(); ite.hasNext(); )
1373             {
1374                 Map.Entry entry = (Map.Entry) ite.next();
1375 
1376                 sinkHeader( sink, entry.getValue().toString() );
1377 
1378             }
1379 
1380             sink.tableRow_();
1381         }
1382         sink.table_();
1383 
1384         sink.lineBreak();
1385         if ( this.generateGraphs )
1386         {
1387             IChartRenderer chart =
1388                 new StackedBarChartRenderer( new TaglistBarChartStrategy( bundle, mavenProject.getProjectName(), datas ) );
1389             if ( !chart.isEmpty() )
1390             {
1391                 String filename = replaceForbiddenChar( mavenProject.getProjectName() );
1392                 filename = filename + "_Taglist." + chart.getFileExtension();
1393                 filename = filename.replace( ' ', '_' );
1394                 String filenamePath = getImagesPath() + "/" + filename;
1395                 getLog().debug( "createTaglistStyleGraph = " + filenamePath );
1396                 try
1397                 {
1398                     chart.saveToFile( filenamePath );
1399                     String link = "images/" + filename;
1400                     link = link.replace( ' ', '_' );
1401                     sink.figure();
1402                     sink.figureGraphics( link );
1403                     sink.figure_();
1404                 }
1405                 catch ( IOException e )
1406                 {
1407                     getLog().debug( "createTaglistStyleGraph exception = " + e.getMessage() );
1408                 }
1409             }
1410         }
1411     }
1412 
1413     public void createTaglistLineByReport( ResourceBundle bundle, Sink sink, DashBoardMavenProject mavenProject,
1414                                            boolean isRoot, String prefix, Map datas, String[] keys, int total )
1415     {
1416 
1417         if ( mavenProject.getModules() != null && !mavenProject.getModules().isEmpty() )
1418         {
1419             Iterator iter = mavenProject.getModules().iterator();
1420             if ( !isRoot )
1421             {
1422                 prefix = writeMultiProjectRow( sink, mavenProject, prefix, taglistAnchorLink );
1423             }
1424             while ( iter.hasNext() )
1425             {
1426                 DashBoardMavenProject subproject = (DashBoardMavenProject) iter.next();
1427                 createTaglistLineByReport( bundle, sink, subproject, false, prefix, datas, keys, total );
1428             }
1429         }
1430         else
1431         {
1432             TagListReportBean taglistReport =
1433                 (TagListReportBean) mavenProject.getReportsByType( TagListReportBean.class );
1434             if ( taglistReport != null )
1435             {
1436                 sink.tableRow();
1437                 datas.put( mavenProject.getProjectName(), taglistReport );
1438                 writeProjectCell( sink, mavenProject, prefix, taglistAnchorLink );
1439                 sinkCell( sink, Integer.toString( taglistReport.getNbClasses() ) );
1440                 if ( this.generateGraphs )
1441                 {
1442                     sinkCell( sink, Integer.toString( taglistReport.getNbTotal() ) );
1443                 }
1444                 else
1445                 {
1446                     sinkCellInvertPercentGraphic( sink, taglistReport.getNbTotal() / (double) total, "taglist",
1447                                                   Integer.toString( taglistReport.getNbTotal() ) );
1448                 }
1449                 for ( int i = 0; i < keys.length; i++ )
1450                 {
1451                     sinkCell( sink, taglistReport.getTags().get( keys[i] ).toString() );
1452                 }
1453                 sink.tableRow_();
1454             }
1455         }
1456     }
1457 }