some comment stripping
[sdbl4j] / src / java / org / gc / sdbl4j / DBUtils.java
1 /*
2  *
3  * Copyright (C) 2010 Guillaume Cottenceau and MNC S.A.
4  *
5  * This file is part of sdbl4j, and is licensed under the Apache 2.0 license.
6  *
7  */
8
9 package org.gc.sdbl4j;
10
11 import javax.servlet.ServletException;
12
13 /**
14  * Generic utils.
15  * 
16  * These generic utils are not tied to DB stuff. They should probably go into a separate JAR of utils but it is
17  * so small that it probably doesn't deserve it.
18  */
19 public class DBUtils {
20
21     /** Go up the chain of exception causes, and print a nice trace of that all. */ 
22     public static String prettyPrint( Exception e ) { 
23         StringBuilder out = new StringBuilder();
24         String causePrefix = "";
25         Throwable t = e;
26         while ( t != null ) {
27             out.append( causePrefix )
28                .append( "exception: " )
29                .append( t )
30                .append( " at: " );
31             if ( t.getCause() == null ) {
32                 // no more cause, print full backtrace now because that's the most interesting exception
33                 out.append( "\n" )
34                    .append( backtrace( t.getStackTrace() ) )
35                    .append( "\n" );
36             } else {
37                 // there's a cause, print only one line of trace because that is not the most interesting exception
38                 out.append( t.getStackTrace()[ 0 ] )
39                    .append( "\n" );                    
40             }
41             t = t.getCause();
42             // grow the cause prefix 
43             causePrefix += "...cause: ";
44         }
45         if ( e instanceof ServletException ) {
46             // in case of servlet exception, normally the root cause is an interesting exception
47             Throwable rc = ( (ServletException) e ).getRootCause();
48             if ( rc != null ) {
49                 out.append( "rootCause: " )
50                    .append( rc )
51                    .append( " at:\n" )
52                    .append( backtrace( rc.getStackTrace() ) )
53                    .append( "\n" );
54             }
55         }
56         return out.toString();
57     }
58     
59     public static String backtrace( StackTraceElement[] trace ) {
60         StringBuilder out = new StringBuilder();
61         for ( StackTraceElement ste : trace ) {
62             out.append( "\t" ).append( ste ).append( "\n" );
63         }
64         return out.toString();
65     }
66
67     /**
68      * Returns the backtrace corresponding to the StackTraceElement's passed.
69      * This is useful to get the backtrace from a catch block.
70      */
71     public static String backtrace( StackTraceElement[] trace, int from ) {
72         StringBuilder sb = new StringBuilder();
73         for ( int i = 2; i < trace.length && trace[i].toString().startsWith( "org" ); i++ ) {
74             sb.append( "\t" ).append( trace[ i ].toString() ).append( "\n" );
75         }
76         return sb.toString();
77     }
78     
79     /**
80      * Returns the backtrace of the caller method, skipping n levels.
81      */
82     public static String backtrace( int skip ) {
83         return backtrace( getStackTrace(), 2 + skip );
84     }
85
86     public static StackTraceElement[] getStackTrace() {
87         try {
88             throw new Exception();
89         } catch ( Exception e ) { 
90             return e.getStackTrace();
91         }
92     }
93
94     public static String backtrace() {
95         return backtrace( getStackTrace() );
96     }
97
98     public static String join( String separator, Iterable<?> elements ) {
99
100         StringBuilder sb = null;
101         for ( Object elem : elements ) {
102             if ( sb == null ) {
103                 sb = new StringBuilder();
104                 sb.append( elem.toString() );
105             } else {
106                 sb.append( separator ).append( elem.toString() );
107             }
108         }
109         return sb == null ? "" : sb.toString();
110     }
111     
112 }