View Javadoc

1   /*
2    * Copyright (c) 1998, 2005 Gargoyle Software Inc. All rights reserved.
3    *
4    * Redistribution and use in source and binary forms, with or without
5    * modification, are permitted provided that the following conditions are met:
6    *
7    * 1. Redistributions of source code must retain the above copyright notice,
8    *    this list of conditions and the following disclaimer.
9    * 2. Redistributions in binary form must reproduce the above copyright notice,
10   *    this list of conditions and the following disclaimer in the documentation
11   *    and/or other materials provided with the distribution.
12   * 3. The end-user documentation included with the redistribution, if any, must
13   *    include the following acknowledgment:
14   *
15   *       "This product includes software developed by Gargoyle Software Inc.
16   *        (http://www.GargoyleSoftware.com/)."
17   *
18   *    Alternately, this acknowledgment may appear in the software itself, if
19   *    and wherever such third-party acknowledgments normally appear.
20   * 4. The name "Gargoyle Software" must not be used to endorse or promote
21   *    products derived from this software without prior written permission.
22   *    For written permission, please contact info@GargoyleSoftware.com.
23   * 5. Products derived from this software may not be called "GSBase", nor may
24   *    "GSBase" appear in their name, without prior written permission of
25   *    Gargoyle Software Inc.
26   *
27   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
28   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
29   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARGOYLE
30   * SOFTWARE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
33   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
36   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37   */
38  package com.gargoylesoftware.base.trace;
39  
40  import com.gargoylesoftware.base.util.StringUtil;
41  import java.io.PrintStream;
42  import java.text.Format;
43  import java.text.SimpleDateFormat;
44  import java.util.Date;
45  
46  /***
47   * A trace writer specifically designed for the bash shell.  The
48   * reason it requires "bash" is that is colour codes the tracing
49   * using bash specific escape codes.
50   *
51   * @version $Revision: 1.4 $
52   * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
53   */
54  public class BashTraceWriter implements TraceWriter {
55      private static String lastPrefix_ = "";
56  
57      // Format used for the timestamp in the trace lines
58      private static final Format TIMESTAMP_FORMAT
59          = new SimpleDateFormat("HH:mm");
60  
61  
62      /***
63       * Create a new writer.
64       */
65      public BashTraceWriter() {
66      }
67  
68  
69      /***
70       * Write the specified item.
71       *
72       * @param item The TraceItem to be written.
73       */
74      public void write( final TraceItem item ) {
75  
76          final PrintStream outStream
77          = Trace.getController().getRealSystemOut();
78          final StringBuffer prefixBuffer = new StringBuffer();
79  
80          // Bash shell specific - change colour to blue
81          prefixBuffer.append("\033[0;34m");
82  
83          final Date timestamp = item.getTime();
84          if( timestamp != null ) {
85              prefixBuffer.append( "Time=[" );
86              prefixBuffer.append( TIMESTAMP_FORMAT.format(timestamp) );
87              prefixBuffer.append("] ");
88          }
89  
90          final String threadName = item.getThreadName();
91          if( threadName != null ) {
92              prefixBuffer.append( "Thread=[" );
93              prefixBuffer.append( threadName );
94              prefixBuffer.append( "] " );
95          }
96  
97          prefixBuffer.append("Channel=[");
98          prefixBuffer.append(item.getChannel().getName());
99          prefixBuffer.append("]");
100 
101         // Bash shell specific - revert colour
102         prefixBuffer.append("\033[0m");
103 
104         final String prefix = prefixBuffer.toString();
105         if( prefix.equals(lastPrefix_) == false ) {
106             lastPrefix_ = prefix;
107 
108            outStream.println("");
109             outStream.println(prefix);
110         }
111         final String message = item.getMessage();
112 
113         if( message != null ) {
114             outStream.print("\033[0;34m>> \033[0m");
115             outStream.print( StringUtil.expandTabs(message,3) );
116         }
117 
118         final Throwable throwable = item.getThrowable();
119 
120         if( throwable != null ) {
121             int i;
122             final String strings[]
123                 = Trace.throwableToStringArray(throwable);
124 
125             outStream.print("\033[0;34m>> \033[0m");
126             outStream.println(strings[0]);
127 
128             for( i=1; i<strings.length; i++ ) {
129                 outStream.println( StringUtil.expandTabs(strings[i],3) );
130             }
131         }
132     }
133 }
134