1 package org.codehaus.mojo.dashboard.report.plugin;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.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
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 + "\"> </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 + "\"> </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
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
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
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
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
325
326
327
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
405
406
407
408
409
410
411
412
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
456
457
458
459
460
461
462
463
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 }