View Javadoc

1   package org.codehaus.mojo.dashboard.report.plugin;
2   
3   /*
4    * Copyright 2006 David Vicente
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *      http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  import java.text.NumberFormat;
20  import java.util.ResourceBundle;
21  
22  import org.apache.maven.plugin.logging.Log;
23  import org.codehaus.doxia.sink.Sink;
24  
25  /**
26   *
27   * @author <a href="dvicente72@gmail.com">David Vicente</a>
28   *
29   */
30  public abstract class AbstractDashBoardGenerator
31  {
32      private String imagesPath = "";
33  
34      private static final int SPACE_NUMBER = 5;
35  
36      private int nbExportedPackagesSummary = 10;
37  
38      private char[] forbiddenChar = new char[] { '\\', '/', ':', '*', '?', '"', '<', '>', ';' };
39  
40      private Log log;
41  
42      public AbstractDashBoardGenerator( Log log )
43      {
44          this.log = log;
45      }
46  
47      public abstract void doGenerateReport( ResourceBundle bundle, Sink sink );
48  
49      protected void sinkHeader( Sink sink, String header )
50      {
51          sink.tableHeaderCell();
52          if ( header != null && header.length() > 0 )
53          {
54              sink.text( header );
55          }
56          else
57          {
58              sink.nonBreakingSpace();
59          }
60          sink.tableHeaderCell_();
61      }
62  
63      protected void tableHeaderCellClass( Sink sink, String CssClass )
64      {
65          sink.rawText( "<th class=\"" + CssClass + "\">" );
66      }
67  
68      protected void tableHeaderCell_( Sink sink )
69      {
70          sink.tableHeaderCell_();
71      }
72  
73      protected void sinkHeaderClass( Sink sink, String header, String CssClass )
74      {
75          if ( header != null && header.length() > 0 )
76          {
77              sink.rawText( "<th class=\"" + CssClass + "\">" + header + "</th>" );
78          }
79          else
80          {
81              sink.rawText( "<th class=\"" + CssClass + "\">&#160;</th>" );
82          }
83      }
84  
85      protected void sinkHeaderBold( Sink sink, String header )
86      {
87          sink.tableHeaderCell();
88          sink.bold();
89          if ( header != null && header.length() > 0 )
90          {
91              sink.text( header );
92          }
93          else
94          {
95              sink.nonBreakingSpace();
96          }
97          sink.bold_();
98          sink.tableHeaderCell_();
99      }
100 
101     protected void sinkSuperHeader( Sink sink, String header, int colspan )
102     {
103         sink.rawText( "<th colspan=\"" + colspan + "\">" + header + "</th>" );
104     }
105 
106     protected void sinkSuperHeaderClass( Sink sink, String header, int colspan, String CssClass )
107     {
108         sink.rawText( "<th class=\"" + CssClass + "\" colspan=\"" + colspan + "\">" + header + "</th>" );
109     }
110 
111     protected void sinkCell( Sink sink, String text )
112     {
113         sink.tableCell();
114         if ( text != null && text.length() > 0 )
115         {
116             sink.text( text );
117         }
118         else
119         {
120             sink.nonBreakingSpace();
121         }
122         sink.tableCell_();
123     }
124 
125     protected void sinkCellClass( Sink sink, String text, String CssClass )
126     {
127 
128         if ( text != null && text.length() > 0 )
129         {
130             sink.rawText( "<td class=\"" + CssClass + "\">" + text + "</td>" );
131         }
132         else
133         {
134             sink.rawText( "<td class=\"" + CssClass + "\">&#160;</td>" );
135         }
136     }
137 
138     protected void sinkCellBold( Sink sink, String text )
139     {
140         sink.tableCell();
141         sink.bold();
142         if ( text != null && text.length() > 0 )
143         {
144             sink.text( text );
145         }
146         else
147         {
148             sink.nonBreakingSpace();
149         }
150         sink.bold_();
151         sink.tableCell_();
152     }
153 
154     protected void sinkCellWithLink( Sink sink, String text, String link )
155     {
156         // sink.tableCell();
157         sink.rawText( "<td NOWRAP>" );
158         sink.link( link );
159         sink.text( text );
160         sink.link_();
161         sink.tableCell_();
162 
163     }
164 
165     protected void sinkCellBoldWithLink( Sink sink, String text, String link )
166     {
167         // sink.tableCell();
168         sink.rawText( "<td NOWRAP>" );
169         sink.bold();
170         sink.link( link );
171         sink.text( text );
172         sink.link_();
173         sink.bold_();
174         sink.tableCell_();
175     }
176 
177     protected void sinkCellTab( Sink sink, String text, int nbTabulation )
178     {
179         sink.tableCell();
180         int loop = AbstractDashBoardGenerator.SPACE_NUMBER * nbTabulation;
181         for ( int i = 0; i < loop; i++ )
182         {
183             sink.nonBreakingSpace();
184         }
185         sink.text( text );
186         sink.tableCell_();
187     }
188 
189     protected void sinkCellTabWithLink( Sink sink, String text, int nbTabulation, String link )
190     {
191         // sink.tableCell();
192         sink.rawText( "<td NOWRAP>" );
193         int loop = AbstractDashBoardGenerator.SPACE_NUMBER * nbTabulation;
194         for ( int i = 0; i < loop; i++ )
195         {
196             sink.nonBreakingSpace();
197         }
198         sink.link( link );
199         sink.text( text );
200         sink.link_();
201         sink.tableCell_();
202     }
203 
204     protected void sinkCellTabBold( Sink sink, String text, int nbTabulation )
205     {
206         sink.tableCell();
207         int loop = AbstractDashBoardGenerator.SPACE_NUMBER * nbTabulation;
208         for ( int i = 0; i < loop; i++ )
209         {
210             sink.nonBreakingSpace();
211         }
212         sink.bold();
213         sink.text( text );
214         sink.bold_();
215         sink.tableCell_();
216     }
217 
218     protected void sinkCellTabBoldWithLink( Sink sink, String text, int nbTabulation, String link )
219     {
220         // sink.tableCell();
221         sink.rawText( "<td NOWRAP>" );
222         int loop = AbstractDashBoardGenerator.SPACE_NUMBER * nbTabulation;
223         for ( int i = 0; i < loop; i++ )
224         {
225             sink.nonBreakingSpace();
226         }
227         sink.bold();
228         sink.link( link );
229         sink.text( text );
230         sink.link_();
231         sink.bold_();
232         sink.tableCell_();
233     }
234 
235     protected static String getPercentValue( double value )
236     {
237         String sValue;
238         NumberFormat formatter;
239         formatter = NumberFormat.getPercentInstance();
240         if ( value == -1.0 )
241         {
242             sValue = "0%";
243         }
244         else
245         {
246             sValue = formatter.format( value );
247         }
248         return sValue;
249     }
250 
251     protected void iconInfo( Sink sink )
252     {
253         sink.figure();
254         sink.figureCaption();
255         sink.text( "info" );
256         sink.figureCaption_();
257         sink.figureGraphics( "./images/icon_info_sml.gif" );
258         sink.figure_();
259     }
260 
261     protected void iconWarning( Sink sink )
262     {
263         sink.figure();
264         sink.figureCaption();
265         sink.text( "warning" );
266         sink.figureCaption_();
267         sink.figureGraphics( "./images/icon_warning_sml.gif" );
268         sink.figure_();
269     }
270 
271     protected void iconError( Sink sink )
272     {
273         sink.figure();
274         sink.figureCaption();
275         sink.text( "error" );
276         sink.figureCaption_();
277         sink.figureGraphics( "./images/icon_error_sml.gif" );
278         sink.figure_();
279     }
280 
281     protected void linkToTopPage( Sink sink )
282     {
283         sink.bold();
284         sink.text( "[" );
285         sink.link( "#top" );
286         sink.text( "Top" );
287         sink.link_();
288         sink.text( "]" );
289         sink.bold_();
290     }
291 
292     protected void linkToHistoricPage( Sink sink, String anchor )
293     {
294         sink.bold();
295         sink.text( "[" );
296         sink.link( "dashboard-report-historic.html#" + anchor );
297         sink.text( "Go to Historic page" );
298         sink.link_();
299         sink.text( "]" );
300         sink.bold_();
301     }
302 
303     protected void setImagesPath( String path )
304     {
305         this.imagesPath = path;
306     }
307 
308     protected String getImagesPath()
309     {
310         return this.imagesPath;
311     }
312 
313     public void setNbExportedPackagesSummary( int nbExportedPackagesSummary )
314     {
315         this.nbExportedPackagesSummary = nbExportedPackagesSummary;
316     }
317 
318     public int getNbExportedPackagesSummary()
319     {
320         return nbExportedPackagesSummary;
321     }
322 
323     /**
324      * replace all invalid characters as {'\\','/',':','*','?','"','<','>',';'} by '-'. MOJO-623 correction
325      *
326      * @param value
327      * @return
328      */
329     protected String replaceForbiddenChar( String value )
330     {
331         String replaced = value;
332         for ( int i = 0; i < forbiddenChar.length; i++ )
333         {
334             char rep = forbiddenChar[i];
335             replaced = replaced.replace( rep, '-' );
336         }
337         return replaced;
338     }
339 
340     public Log getLog()
341     {
342         return log;
343     }
344 
345     protected void sinkCellPercentGraphic( Sink sink, double value, String CssClass )
346     {
347         sinkDefaultCellPercentGraphic( sink, value, CssClass, false, null );
348     }
349 
350     protected void sinkCellInvertPercentGraphic( Sink sink, double value, String CssClass )
351     {
352         sinkDefaultInvertCellPercentGraphic( sink, value, CssClass, false, null );
353     }
354     protected void sinkCellInvertPercentGraphic( Sink sink, double value, String CssClass , String label)
355     {
356         sinkDefaultInvertCellPercentGraphic( sink, value, CssClass, false, label );
357     }
358 
359     protected void sinkHeaderCellPercentGraphic( Sink sink, double value, String CssClass )
360     {
361         sinkDefaultCellPercentGraphic( sink, value, CssClass, true, null );
362     }
363 
364     protected void sinkCellPercentGraphic( Sink sink, double value, String CssClass, String label )
365     {
366         sinkDefaultCellPercentGraphic( sink, value, CssClass, false, label );
367     }
368 
369     protected void sinkHeaderCellPercentGraphic( Sink sink, double value, String CssClass, String label )
370     {
371         sinkDefaultCellPercentGraphic( sink, value, CssClass, true, label );
372     }
373 
374     protected void sinkDefaultCellPercentGraphic( Sink sink, double value, String CssClass, boolean header, String label )
375     {
376         if ( value == -1.0 )
377         {
378             value = 0d;
379         }
380         if ( header )
381         {
382             sink.rawText( "<th class=\"" + CssClass + "\">" );
383         }
384         else
385         {
386             sink.rawText( "<td class=\"" + CssClass + "\">" );
387         }
388         sinkPercentGraphic( sink, value );
389         if ( label != null && label.length() > 0 )
390         {
391             sink.rawText( label );
392         }
393         if ( header )
394         {
395             sink.rawText( "</th>" );
396         }
397         else
398         {
399             sink.rawText( "</td>" );
400         }
401 
402     }
403 
404 //    protected void sinkPercentGraphic( Sink sink, double value )
405 //    {
406 //        sink.rawText( "<div style=\"border: 1px solid #808080; padding: 0px; background-color: #FF5555; width: 100px; border-collapse: collapse;\">" );
407 //        sink.rawText( "<div style=\"padding: 0px; background-color: #77FF77; height: 1.3em; border-collapse: collapse; width: "
408 //                        + (int) Math.floor( value * 100 ) + "px;\">" );
409 //        sink.rawText( "<span style=\"display:block; position:absolute; text-align:center; width:100px; border-collapse:collapse;\">"
410 //                        + getPercentValue( value ) + "</span>" );
411 //        sink.rawText( "</div>" );
412 //        sink.rawText( "</div>" );
413 //    }
414     protected void sinkPercentGraphic( Sink sink, double value )
415     {
416         sink.rawText( "<div class=\"percentOuter\">" );
417         sink.rawText( "<div class=\"percentInner\" style=\"width: "
418                         + (int) Math.floor( value * 100 ) + "px;\">" );
419         sink.rawText( "<span class=\"percentLabel\">"
420                         + getPercentValue( value ) + "</span>" );
421         sink.rawText( "</div>" );
422         sink.rawText( "</div>" );
423     }
424 
425     protected void sinkDefaultInvertCellPercentGraphic( Sink sink, double value, String CssClass, boolean header, String label )
426     {
427         if ( value == -1.0 )
428         {
429             value = 0d;
430         }
431         if ( header )
432         {
433             sink.rawText( "<th class=\"" + CssClass + "\">" );
434         }
435         else
436         {
437             sink.rawText( "<td class=\"" + CssClass + "\">" );
438         }
439         sinkInvertPercentGraphic( sink, value );
440         if ( label != null && label.length() > 0 )
441         {
442             sink.rawText( label );
443         }
444         if ( header )
445         {
446             sink.rawText( "</th>" );
447         }
448         else
449         {
450             sink.rawText( "</td>" );
451         }
452 
453     }
454 
455 //    protected void sinkInvertPercentGraphic( Sink sink, double value )
456 //    {
457 //        sink.rawText( "<div style=\"border: 1px solid #808080; padding: 0px; background-color: #77FF77; width: 100px; border-collapse: collapse;\">" );
458 //        sink.rawText( "<div style=\"padding: 0px; background-color: #FF5555; height: 1.3em; border-collapse: collapse; width: "
459 //                        + (int) Math.floor( value * 100 ) + "px;\">" );
460 //        sink.rawText( "<span style=\"display:block; position:absolute; text-align:center; width:100px; border-collapse:collapse;\">"
461 //                        + getPercentValue( value ) + "</span>" );
462 //        sink.rawText( "</div>" );
463 //        sink.rawText( "</div>" );
464 //    }
465     protected void sinkInvertPercentGraphic( Sink sink, double value )
466     {
467         sink.rawText( "<div class=\"invertPercentOuter\">" );
468         sink.rawText( "<div class=\"invertPercentInner\" style=\"width: "
469                         + (int) Math.floor( value * 100 ) + "px;\">" );
470         sink.rawText( "<span class=\"percentLabel\">"
471                         + getPercentValue( value ) + "</span>" );
472         sink.rawText( "</div>" );
473         sink.rawText( "</div>" );
474     }
475 
476     protected void addDashboardCss(Sink sink)
477     {
478         sink.rawText( "<link rel=\"stylesheet\" href=\"./css/print.css\" type=\"text/css\" media=\"print\" />" );
479         sink.rawText( "<link rel=\"stylesheet\" href=\"./css/dashboard.css\" type=\"text/css\" media=\"all\" />" );
480         sink.rawText( "<link rel=\"stylesheet\" href=\"./css/dashboard2.css\" type=\"text/css\" media=\"all\" />" );
481         sink.rawText( "<!--[if IE]>");
482         sink.rawText( "<link rel=\"stylesheet\" href=\"./css/dashboard2IE.css\" type=\"text/css\" media=\"all\" />" );
483         sink.rawText( "<![endif]-->");
484     }
485 
486 }