View Javadoc

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