1 package org.codehaus.mojo.dashboard.report.plugin;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
57
58
59
60
61
62
63
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
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
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
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
386
387
388
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
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
438
439
440
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
540
541
542
543
544 }
545
546
547
548
549
550
551
552
553
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
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
639 sinkHeaderCellPercentGraphic( sink, reportBean.getLineCoverRate(), "cobertura" );
640
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
675
676
677
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
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
792
793
794
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
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
895
896
897
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
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
1004
1005
1006
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
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
1187
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
1205
1206
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
1264
1265 sink.tableRow_();
1266 }
1267 sink.tableRow();
1268 sinkCell( sink, bean.getPackageName() );
1269 sinkCell( sink, ac.toString() );
1270
1271 sinkCellPercentGraphic( sink, bean.getLineCoverRate(), "cobertura" );
1272
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 }