1 package org.apache.maven.shared.io.logging;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.PrintWriter;
23 import java.io.StringWriter;
24 import java.util.ArrayList;
25 import java.util.Iterator;
26 import java.util.List;
27
28 public class DefaultMessageHolder
29 implements MessageHolder
30 {
31
32 private List messages = new ArrayList();
33
34 private Message currentMessage;
35
36 private int defaultMessageLevel = MessageLevels.LEVEL_INFO;
37
38 private boolean[] messageLevelStates;
39
40 private MessageSink onDemandSink;
41
42 public DefaultMessageHolder()
43 {
44 this.messageLevelStates = MessageLevels.getLevelStates( MessageLevels.LEVEL_INFO );
45 }
46
47 public DefaultMessageHolder( int maxMessageLevel, int defaultMessageLevel )
48 {
49 this.defaultMessageLevel = defaultMessageLevel;
50 this.messageLevelStates = MessageLevels.getLevelStates( maxMessageLevel );
51 }
52
53 public DefaultMessageHolder( int maxMessageLevel, int defaultMessageLevel, MessageSink onDemandSink )
54 {
55 this.defaultMessageLevel = defaultMessageLevel;
56 this.onDemandSink = onDemandSink;
57 this.messageLevelStates = MessageLevels.getLevelStates( maxMessageLevel );
58 }
59
60 public MessageHolder addMessage( CharSequence messagePart, Throwable error )
61 {
62 return addMessage( defaultMessageLevel, messagePart, error );
63 }
64
65 protected MessageHolder addMessage( int level, CharSequence messagePart, Throwable error )
66 {
67 newMessage( level );
68 append( messagePart.toString() );
69 append( error );
70
71 return this;
72 }
73
74 public MessageHolder addMessage( CharSequence messagePart )
75 {
76 return addMessage( defaultMessageLevel, messagePart );
77 }
78
79 protected MessageHolder addMessage( int level, CharSequence messagePart )
80 {
81 newMessage( level );
82 append( messagePart.toString() );
83
84 return this;
85 }
86
87 public MessageHolder addMessage( Throwable error )
88 {
89 return addMessage( defaultMessageLevel, error );
90 }
91
92 protected MessageHolder addMessage( int level, Throwable error )
93 {
94 newMessage( level );
95 append( error );
96
97 return this;
98 }
99
100 public MessageHolder append( CharSequence messagePart )
101 {
102 if ( currentMessage == null )
103 {
104 newMessage();
105 }
106
107 currentMessage.append( messagePart.toString() );
108
109 return this;
110 }
111
112 public MessageHolder append( Throwable error )
113 {
114 if ( currentMessage == null )
115 {
116 newMessage();
117 }
118
119 currentMessage.setError( error );
120
121 return this;
122 }
123
124 public boolean isEmpty()
125 {
126 return messages.isEmpty();
127 }
128
129 public MessageHolder newMessage()
130 {
131 newMessage( defaultMessageLevel );
132
133 return this;
134 }
135
136 protected void newMessage( int messageLevel )
137 {
138 if ( onDemandSink != null && currentMessage != null )
139 {
140 renderTo( currentMessage, onDemandSink );
141 }
142
143 currentMessage = new Message( messageLevel, onDemandSink );
144 messages.add( currentMessage );
145 }
146
147 public String render()
148 {
149 StringBuffer buffer = new StringBuffer();
150
151 int counter = 1;
152 for ( Iterator it = messages.iterator(); it.hasNext(); )
153 {
154 Message message = (Message) it.next();
155
156 int ml = message.getMessageLevel();
157
158 if ( ml >= messageLevelStates.length || ml < 0 )
159 {
160 ml = MessageLevels.LEVEL_DEBUG;
161 }
162
163 if ( !messageLevelStates[ml] )
164 {
165 continue;
166 }
167
168 CharSequence content = message.render();
169 String label = MessageLevels.getLevelLabel( message.getMessageLevel() );
170
171 if ( content.length() > label.length() + 3 )
172 {
173 buffer.append( '[' ).append( counter++ ).append( "] " );
174 buffer.append( content.toString() );
175
176 if ( it.hasNext() )
177 {
178 buffer.append( "\n\n" );
179 }
180 }
181 }
182
183 return buffer.toString();
184 }
185
186 public int size()
187 {
188 return messages.size();
189 }
190
191 private static final class Message
192 {
193 private StringBuffer message = new StringBuffer();
194
195 private Throwable error;
196
197 private final int messageLevel;
198
199 private final MessageSink onDemandSink;
200
201 public Message( int messageLevel, MessageSink onDemandSink )
202 {
203 this.messageLevel = messageLevel;
204
205 this.onDemandSink = onDemandSink;
206 }
207
208 public Message setError( Throwable error )
209 {
210 this.error = error;
211 return this;
212 }
213
214 public Message append( CharSequence message )
215 {
216 this.message.append( message.toString() );
217 return this;
218 }
219
220 public int getMessageLevel()
221 {
222 return messageLevel;
223 }
224
225 public CharSequence render()
226 {
227 StringBuffer buffer = new StringBuffer();
228
229 if ( onDemandSink == null )
230 {
231 buffer.append( '[' ).append( MessageLevels.getLevelLabel( messageLevel ) ).append( "] " );
232 }
233 if ( message != null && message.length() > 0 )
234 {
235 buffer.append( message );
236
237 if ( error != null )
238 {
239 buffer.append( '\n' );
240 }
241 }
242
243 if ( error != null )
244 {
245 buffer.append( "Error:\n" );
246
247 StringWriter sw = new StringWriter();
248 PrintWriter pw = new PrintWriter( sw );
249 error.printStackTrace( pw );
250
251 buffer.append( sw.toString() );
252 }
253
254 return buffer;
255 }
256 }
257
258 public MessageHolder addDebugMessage( CharSequence messagePart, Throwable error )
259 {
260 return addMessage( MessageLevels.LEVEL_DEBUG, messagePart, error );
261 }
262
263 public MessageHolder addDebugMessage( CharSequence messagePart )
264 {
265 return addMessage( MessageLevels.LEVEL_DEBUG, messagePart );
266 }
267
268 public MessageHolder addDebugMessage( Throwable error )
269 {
270 return addMessage( MessageLevels.LEVEL_DEBUG, error );
271 }
272
273 public MessageHolder addErrorMessage( CharSequence messagePart, Throwable error )
274 {
275 return addMessage( MessageLevels.LEVEL_ERROR, messagePart, error );
276 }
277
278 public MessageHolder addErrorMessage( CharSequence messagePart )
279 {
280 return addMessage( MessageLevels.LEVEL_ERROR, messagePart );
281 }
282
283 public MessageHolder addErrorMessage( Throwable error )
284 {
285 return addMessage( MessageLevels.LEVEL_ERROR, error );
286 }
287
288 public MessageHolder addInfoMessage( CharSequence messagePart, Throwable error )
289 {
290 return addMessage( MessageLevels.LEVEL_INFO, messagePart, error );
291 }
292
293 public MessageHolder addInfoMessage( CharSequence messagePart )
294 {
295 return addMessage( MessageLevels.LEVEL_INFO, messagePart );
296 }
297
298 public MessageHolder addInfoMessage( Throwable error )
299 {
300 return addMessage( MessageLevels.LEVEL_INFO, error );
301 }
302
303 public MessageHolder addSevereMessage( CharSequence messagePart, Throwable error )
304 {
305 return addMessage( MessageLevels.LEVEL_SEVERE, messagePart, error );
306 }
307
308 public MessageHolder addSevereMessage( CharSequence messagePart )
309 {
310 return addMessage( MessageLevels.LEVEL_SEVERE, messagePart );
311 }
312
313 public MessageHolder addSevereMessage( Throwable error )
314 {
315 return addMessage( MessageLevels.LEVEL_SEVERE, error );
316 }
317
318 public MessageHolder addWarningMessage( CharSequence messagePart, Throwable error )
319 {
320 return addMessage( MessageLevels.LEVEL_WARNING, messagePart, error );
321 }
322
323 public MessageHolder addWarningMessage( CharSequence messagePart )
324 {
325 return addMessage( MessageLevels.LEVEL_WARNING, messagePart );
326 }
327
328 public MessageHolder addWarningMessage( Throwable error )
329 {
330 return addMessage( MessageLevels.LEVEL_WARNING, error );
331 }
332
333 public int countDebugMessages()
334 {
335 return countMessagesOfType( MessageLevels.LEVEL_DEBUG );
336 }
337
338 public int countErrorMessages()
339 {
340 return countMessagesOfType( MessageLevels.LEVEL_ERROR );
341 }
342
343 public int countInfoMessages()
344 {
345 return countMessagesOfType( MessageLevels.LEVEL_INFO );
346 }
347
348 public int countMessages()
349 {
350 return size();
351 }
352
353 public int countSevereMessages()
354 {
355 return countMessagesOfType( MessageLevels.LEVEL_SEVERE );
356 }
357
358 public int countWarningMessages()
359 {
360 return countMessagesOfType( MessageLevels.LEVEL_WARNING );
361 }
362
363 private int countMessagesOfType( int messageLevel )
364 {
365 int count = 0;
366
367 for ( Iterator it = messages.iterator(); it.hasNext(); )
368 {
369 Message message = (Message) it.next();
370 if ( messageLevel == message.getMessageLevel() )
371 {
372 count++;
373 }
374 }
375
376 return count;
377 }
378
379 public boolean isDebugEnabled()
380 {
381 return messageLevelStates[MessageLevels.LEVEL_DEBUG];
382 }
383
384 public boolean isErrorEnabled()
385 {
386 return messageLevelStates[MessageLevels.LEVEL_ERROR];
387 }
388
389 public boolean isInfoEnabled()
390 {
391 return messageLevelStates[MessageLevels.LEVEL_INFO];
392 }
393
394 public boolean isSevereEnabled()
395 {
396 return messageLevelStates[MessageLevels.LEVEL_SEVERE];
397 }
398
399 public boolean isWarningEnabled()
400 {
401 return messageLevelStates[MessageLevels.LEVEL_WARNING];
402 }
403
404 public MessageHolder newDebugMessage()
405 {
406 if ( isDebugEnabled() )
407 {
408 newMessage( MessageLevels.LEVEL_DEBUG );
409 }
410
411 return this;
412 }
413
414 public MessageHolder newErrorMessage()
415 {
416 if ( isErrorEnabled() )
417 {
418 newMessage( MessageLevels.LEVEL_ERROR );
419 }
420
421 return this;
422 }
423
424 public MessageHolder newInfoMessage()
425 {
426 if ( isInfoEnabled() )
427 {
428 newMessage( MessageLevels.LEVEL_INFO );
429 }
430
431 return this;
432 }
433
434 public MessageHolder newSevereMessage()
435 {
436 if ( isSevereEnabled() )
437 {
438 newMessage( MessageLevels.LEVEL_SEVERE );
439 }
440
441 return this;
442 }
443
444 public MessageHolder newWarningMessage()
445 {
446 if ( isWarningEnabled() )
447 {
448 newMessage( MessageLevels.LEVEL_WARNING );
449 }
450
451 return this;
452 }
453
454 public void setDebugEnabled( boolean enabled )
455 {
456 messageLevelStates[MessageLevels.LEVEL_DEBUG] = enabled;
457 }
458
459 public void setErrorEnabled( boolean enabled )
460 {
461 messageLevelStates[MessageLevels.LEVEL_ERROR] = enabled;
462 }
463
464 public void setInfoEnabled( boolean enabled )
465 {
466 messageLevelStates[MessageLevels.LEVEL_INFO] = enabled;
467 }
468
469 public void setSevereEnabled( boolean enabled )
470 {
471 messageLevelStates[MessageLevels.LEVEL_SEVERE] = enabled;
472 }
473
474 public void setWarningEnabled( boolean enabled )
475 {
476 messageLevelStates[MessageLevels.LEVEL_WARNING] = enabled;
477 }
478
479 public void flush()
480 {
481 if ( onDemandSink != null && currentMessage != null )
482 {
483 renderTo( currentMessage, onDemandSink );
484 currentMessage = null;
485 }
486 }
487
488 public void render( MessageSink sink )
489 {
490 for ( Iterator it = messages.iterator(); it.hasNext(); )
491 {
492 Message message = (Message) it.next();
493
494 renderTo( message, sink );
495 }
496 }
497
498 protected void renderTo( Message message, MessageSink sink )
499 {
500 switch( message.getMessageLevel() )
501 {
502 case( MessageLevels.LEVEL_SEVERE ):
503 {
504 sink.severe( message.render().toString() );
505 break;
506 }
507 case( MessageLevels.LEVEL_ERROR ):
508 {
509 sink.error( message.render().toString() );
510 break;
511 }
512 case( MessageLevels.LEVEL_WARNING ):
513 {
514 sink.warning( message.render().toString() );
515 break;
516 }
517 case( MessageLevels.LEVEL_INFO ):
518 {
519 sink.info( message.render().toString() );
520 break;
521 }
522 default:
523 {
524 sink.debug( message.render().toString() );
525 break;
526 }
527 }
528 }
529
530 }