From d416e7431781541eb33bf743e94b9c2ea29f080b Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Wed, 02 Jan 2008 22:32:06 +0000
Subject: [PATCH] Fixed debug logger so the message from the exception that caused a thrown exception is printed along with its stack trace. 

---
 opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugStackTraceFormatter.java |   89 +++++++++++++++++++++++++++++---------------
 opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugTracer.java              |   22 +++++-----
 opendj-sdk/opends/src/server/org/opends/server/loggers/debug/TextDebugLogPublisher.java    |    6 +-
 3 files changed, 72 insertions(+), 45 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugStackTraceFormatter.java b/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugStackTraceFormatter.java
index 079af66..dccc8a6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugStackTraceFormatter.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugStackTraceFormatter.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
  */
 package org.opends.server.loggers.debug;
 
@@ -140,45 +140,72 @@
   {
     StringBuilder buffer= new StringBuilder();
 
-    while(t != null)
+    StackTraceElement[] trace = t.getStackTrace();
+    int frameLimit = Math.min(maxDepth, trace.length);
+    for (int i=0; i < frameLimit; i++)
     {
-      StackTraceElement[] frames = t.getStackTrace();
+      buffer.append("  at ");
+      buffer.append(trace[i]);
+      buffer.append(EOL);
+    }
+    if(frameLimit < trace.length)
+    {
+      buffer.append("  ... ");
+      buffer.append(trace.length - frameLimit);
+      buffer.append(" more");
+      buffer.append(EOL);
+    }
 
-      if (frames != null) {
-        int frameLimit=  Math.min(maxDepth, frames.length);
-        if (frameLimit > 0) {
-
-
-          for (int i= 0; i < frameLimit; i++) {
-            buffer.append("  ");
-            buffer.append(frames[i]);
-            buffer.append(EOL);
-          }
-
-          if(frameLimit < frames.length)
-          {
-            buffer.append("  ...(");
-            buffer.append(frames.length - frameLimit);
-            buffer.append(" more)");
-            buffer.append(EOL);
-          }
-        }
-      }
-
-      if(includeCause && t.getCause() != null)
+    if(includeCause)
+    {
+      Throwable ourCause = t.getCause();
+      if (ourCause != null)
       {
-        t = t.getCause();
-        buffer.append("  caused by ");
-      }
-      else
-      {
-        t = null;
+        formatStackTraceForCause(ourCause, maxDepth, buffer, trace);
       }
     }
 
     return buffer.toString();
   }
 
+  private static void formatStackTraceForCause(Throwable t, int maxDepth,
+                                        StringBuilder buffer,
+                                        StackTraceElement[] causedTrace)
+  {
+    StackTraceElement[] trace = t.getStackTrace();
+    int framesToSkip = Math.max(trace.length - maxDepth, 0);
+
+    // Compute number of frames in common between this and caused
+    int m = trace.length - 1 - framesToSkip;
+    int n = causedTrace.length - 1 - framesToSkip;
+    while (m >= 0 && n >=0 && trace[m].equals(causedTrace[n])) {
+      m--; n--;
+    }
+    framesToSkip = trace.length - 1 - m;
+
+    buffer.append("Caused by: ");
+    buffer.append(t);
+    buffer.append(EOL);
+    for (int i=0; i <= m; i++)
+    {
+      buffer.append("  at ");
+      buffer.append(trace[i]);
+      buffer.append(EOL);
+    }
+    if (framesToSkip != 0)
+    {
+      buffer.append("  ... ");
+      buffer.append(framesToSkip);
+      buffer.append(" more");
+      buffer.append(EOL);
+    }
+
+    // Recurse if we have a cause
+    Throwable ourCause = t.getCause();
+    if (ourCause != null)
+      formatStackTraceForCause(ourCause, maxDepth, buffer, trace);
+  }
+
   /**
    * Generate a String representation of the possibly filtered stack trace
    * from the current position in executation.
diff --git a/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugTracer.java b/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugTracer.java
index 5c06a4f..bdefce1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugTracer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/DebugTracer.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
  */
 package org.opends.server.loggers.debug;
 
@@ -176,7 +176,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (activeSettings.noArgs)
@@ -266,7 +266,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (activeSettings.noArgs)
@@ -355,7 +355,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (activeSettings.noArgs)
@@ -444,7 +444,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (activeSettings.noRetVal)
@@ -533,7 +533,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (filteredStackTrace == null && activeSettings.stackDepth > 0)
@@ -721,7 +721,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if(msgArgs != null && msgArgs.length > 0)
@@ -808,7 +808,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (filteredStackTrace == null && activeSettings.stackDepth > 0)
@@ -896,7 +896,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (filteredStackTrace == null && activeSettings.stackDepth > 0)
@@ -980,7 +980,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (filteredStackTrace == null && activeSettings.stackDepth > 0)
@@ -1062,7 +1062,7 @@
             }
           }
 
-          String sl = callerFrame.getFileName() + " @ " +
+          String sl = callerFrame.getFileName() + ":" +
               callerFrame.getLineNumber();
 
           if (filteredStackTrace == null && activeSettings.stackDepth > 0)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/TextDebugLogPublisher.java b/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/TextDebugLogPublisher.java
index f97f2fe..ecf600e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/TextDebugLogPublisher.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/loggers/debug/TextDebugLogPublisher.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
  */
 package org.opends.server.loggers.debug;
 import org.opends.messages.Message;
@@ -817,9 +817,9 @@
     // Emit method info.
     buf.append("method={");
     buf.append(signature);
-    buf.append(" @ ");
+    buf.append("(");
     buf.append(sourceLocation);
-    buf.append("} ");
+    buf.append(")} ");
 
     // Emit message.
     buf.append(msg);

--
Gitblit v1.10.0