View Javadoc

1   package org.apache.maven.shared.io.logging;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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 }