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 +++++++++++++++++++++++++++++---------------
 1 files changed, 58 insertions(+), 31 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.

--
Gitblit v1.10.0