[logback-dev] svn commit: r1696 - in logback/trunk/logback-core/src/main/java/ch/qos/logback/core: . helpers util

noreply.ceki at qos.ch noreply.ceki at qos.ch
Wed May 14 15:27:03 CEST 2008


Author: ceki
Date: Wed May 14 15:27:02 2008
New Revision: 1696

Added:
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java
Modified:
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreGlobal.java
   logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java

Log:
- refactoring of ThrowableInformation.
 Code responsible for extracting the string array has been moved into 
 the ThorableToStringArray class. This allows StatusPrinter code
 (in lb-core) to compute string representation of throwables without creating
 a ThrowableInformationConverter (in lb-classic).
 

Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreGlobal.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreGlobal.java	(original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreGlobal.java	Wed May 14 15:27:02 2008
@@ -44,4 +44,5 @@
    * An empty Class array.
    */
   public final static Class[] EMPTY_CLASS_ARRAY = new Class[] {};
+  static public final String CAUSED_BY = "Caused by: ";
 }

Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java	Wed May 14 15:27:02 2008
@@ -0,0 +1,84 @@
+/**
+ * LOGBack: the reliable, fast and flexible logging library for Java.
+ * 
+ * Copyright (C) 1999-2005, QOS.ch
+ * 
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.core.helpers;
+
+import ch.qos.logback.core.CoreGlobal;
+
+
+public class ThrowableToStringArray {
+
+  public static String[] extractStringRep(Throwable t, StackTraceElement[] parentSTE) {
+    String[] result;
+
+    StackTraceElement[] ste = t.getStackTrace();
+    final int commonFrames = findCommonFrames(ste, parentSTE);
+
+    final String[] firstArray;
+    if (commonFrames == 0) {
+      firstArray = new String[ste.length + 1];
+    } else {
+      firstArray = new String[ste.length - commonFrames + 2];
+    }
+
+    String prefix = "";
+    if (parentSTE != null) {
+      prefix = CoreGlobal.CAUSED_BY;
+    }
+
+    firstArray[0] = prefix + t.getClass().getName();
+    if (t.getMessage() != null) {
+      firstArray[0] += ": " + t.getMessage();
+    }
+
+    for (int i = 0; i < (ste.length - commonFrames); i++) {
+      firstArray[i + 1] = ste[i].toString();
+    }
+
+    if (commonFrames != 0) {
+      firstArray[firstArray.length - 1] = commonFrames
+          + " common frames omitted";
+    }
+
+    Throwable cause = t.getCause();
+    if (cause != null) {
+      final String[] causeArray = ThrowableToStringArray.extractStringRep(cause, ste);
+      String[] tmp = new String[firstArray.length + causeArray.length];
+      System.arraycopy(firstArray, 0, tmp, 0, firstArray.length);
+      System
+          .arraycopy(causeArray, 0, tmp, firstArray.length, causeArray.length);
+      result = tmp;
+    } else {
+      result = firstArray;
+    }
+    return result;
+  }
+  
+  private static int findCommonFrames(StackTraceElement[] ste,
+      StackTraceElement[] parentSTE) {
+    if (parentSTE == null) {
+      return 0;
+    }
+
+    int steIndex = ste.length - 1;
+    int parentIndex = parentSTE.length - 1;
+    int count = 0;
+    while (steIndex >= 0 && parentIndex >= 0) {
+      if (ste[steIndex].equals(parentSTE[parentIndex])) {
+        count++;
+      } else {
+        break;
+      }
+      steIndex--;
+      parentIndex--;
+    }
+    return count;
+  }
+
+}

Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java	(original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java	Wed May 14 15:27:02 2008
@@ -16,20 +16,23 @@
 import java.util.Iterator;
 
 import ch.qos.logback.core.Context;
+import ch.qos.logback.core.CoreGlobal;
 import ch.qos.logback.core.Layout;
 import ch.qos.logback.core.status.Status;
 import ch.qos.logback.core.status.StatusManager;
+import ch.qos.logback.core.helpers.ThrowableToStringArray;
 
 public class StatusPrinter {
-  
+
   private static PrintStream ps = System.out;
 
-  static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss,SSS");
-  
+  static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
+      "HH:mm:ss,SSS");
+
   public static void setPrintStream(PrintStream printStream) {
     ps = printStream;
   }
-  
+
   public static void print(Context context) {
     if (context == null) {
       throw new IllegalArgumentException("Context argument cannot be null");
@@ -46,53 +49,64 @@
   }
 
   public static void print(StatusManager sm) {
-    StringBuilder sb = buildStr(sm);
+    StringBuilder sb = new StringBuilder();
+    buildStr(sb, sm);
     ps.println(sb.toString());
   }
 
-  public static StringBuilder buildStr(StatusManager sm) {
-    StringBuilder sb = new StringBuilder();
+  public static void buildStr(StringBuilder sb, StatusManager sm) {
+
     synchronized (sm) {
       Iterator it = sm.iterator();
       while (it.hasNext()) {
         Status s = (Status) it.next();
         buildStr(sb, "", s);
       }
-      return sb;
     }
   }
-  
+
   private static void appendThrowable(StringBuilder sb, Throwable t) {
-    StackTraceElement[] steArray = t.getStackTrace();
-    for (StackTraceElement ste : steArray) {
-      sb.append(ste.toString()).append(Layout.LINE_SEP);
+    String[] stringRep = ThrowableToStringArray.extractStringRep(t, null);
+
+    for (String s : stringRep) {
+      if (s.startsWith(CoreGlobal.CAUSED_BY)) {
+        // nothing
+      } else if (Character.isDigit(s.charAt(0))) {
+        // if line resembles "48 common frames omitted"
+        sb.append("\t... ");
+      } else {
+        // most of the time. just add a tab+"at"
+        sb.append("\tat ");
+      }
+      sb.append(s).append(CoreGlobal.LINE_SEPARATOR);
     }
   }
+
   private static void buildStr(StringBuilder sb, String indentation, Status s) {
     String prefix;
-    if(s.hasChildren()) {
-       prefix = indentation + "+ ";
+    if (s.hasChildren()) {
+      prefix = indentation + "+ ";
     } else {
       prefix = indentation + "|-";
     }
-    
-    if(simpleDateFormat != null) {
+
+    if (simpleDateFormat != null) {
       Date date = new Date(s.getDate());
       String dateStr = simpleDateFormat.format(date);
       sb.append(dateStr).append(" ");
-    } 
-    sb.append(prefix+s).append(Layout.LINE_SEP);   
-    
+    }
+    sb.append(prefix + s).append(Layout.LINE_SEP);
+
     if (s.getThrowable() != null) {
       appendThrowable(sb, s.getThrowable());
     }
-    if(s.hasChildren()) {
+    if (s.hasChildren()) {
       Iterator<Status> ite = s.iterator();
-      while(ite.hasNext()) {
+      while (ite.hasNext()) {
         Status child = ite.next();
-        buildStr(sb, indentation+"  ", child);
+        buildStr(sb, indentation + "  ", child);
       }
     }
   }
-  
+
 }



More information about the logback-dev mailing list