1 22 23 24 package com.mchange.v2.debug; 25 26 import java.text.*; 27 import java.util.*; 28 import com.mchange.lang.ThrowableUtils; 29 30 public class ThreadNameStackTraceRecorder 31 { 32 final static String NL = System.getProperty("line.separator", "\r\n"); 33 34 Set set = new HashSet(); 35 36 String dumpHeader; 37 String stackTraceHeader; 38 39 public ThreadNameStackTraceRecorder( String dumpHeader ) 40 { this( dumpHeader, "Debug Stack Trace." ); } 41 42 public ThreadNameStackTraceRecorder( String dumpHeader, String stackTraceHeader ) 43 { 44 this.dumpHeader = dumpHeader; 45 this.stackTraceHeader = stackTraceHeader; 46 } 47 48 public synchronized Object record() 49 { 50 Record r = new Record( stackTraceHeader ); 51 set.add( r ); 52 return r; 53 } 54 55 public synchronized void remove( Object rec ) 56 { set.remove( rec ); } 57 58 public synchronized int size() 59 { return set.size(); } 60 61 public synchronized String getDump() 62 { return getDump(null); } 63 64 public synchronized String getDump(String locationSpecificNote) 65 { 66 DateFormat df = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss.SSSS"); 67 68 StringBuffer sb = new StringBuffer (2047); 69 sb.append(NL); 70 sb.append("----------------------------------------------------"); 71 sb.append(NL); 72 sb.append( dumpHeader ); 73 sb.append(NL); 74 if (locationSpecificNote != null) 75 { 76 sb.append( locationSpecificNote ); 77 sb.append( NL ); 78 } 79 boolean first = true; 80 for (Iterator ii = set.iterator(); ii.hasNext(); ) 81 { 82 if (first) 83 first = false; 84 else 85 { 86 sb.append("---"); 87 sb.append( NL ); 88 } 89 90 Record r = (Record) ii.next(); 91 sb.append(df.format( new Date( r.time ) )); 92 sb.append(" --> Thread Name: "); 93 sb.append(r.threadName); 94 sb.append(NL); 95 sb.append("Stack Trace: "); 96 sb.append( ThrowableUtils.extractStackTrace( r.stackTrace ) ); 97 } 98 sb.append("----------------------------------------------------"); 99 sb.append(NL); 100 return sb.toString(); 101 } 102 103 private final static class Record implements Comparable 104 { 105 long time; 106 String threadName; 107 Throwable stackTrace; 108 109 Record(String sth) 110 { 111 this.time = System.currentTimeMillis(); 112 this.threadName = Thread.currentThread().getName(); 113 this.stackTrace = new Exception ( sth ); 114 } 115 116 public int compareTo( Object o ) 117 { 118 Record oo = (Record) o; 119 if ( this.time > oo.time ) 120 return 1; 121 else if (this.time < oo.time ) 122 return -1; 123 else 124 { 125 int mine = System.identityHashCode( this ); 126 int yours = System.identityHashCode( oo ); 127 if (mine > yours) 128 return 1; 129 else if (mine < yours) 130 return -1; 131 return 0; 132 } 133 } 134 } 135 } | Popular Tags |