dlr 01/08/09 15:06:56 Modified: util/src/java/org/apache/commons/util/exception Nestable.java NestableDelegate.java NestableException.java NestableRuntimeException.java Log: * Incorporated patch by Kasper Nielsen to make the Nestable family of exceptions more closely emulate the interface of exceptions found in JDK 1.4. * Fix by myself for infinite recursion issue reported by Jon Stevens and Jason van Zyl. I must have introduced this problem to these TurbineException decendants when I added NestableDelegate. Revision Changes Path 1.3 +12 -7 jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/Nestable.java Index: Nestable.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/Nestable.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -u -r1.2 -r1.3 --- Nestable.java 2001/08/08 23:56:48 1.2 +++ Nestable.java 2001/08/09 22:06:56 1.3 @@ -62,6 +62,7 @@ * inside themselves. * * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Kasper Nielsen</a> */ public interface Nestable { @@ -69,7 +70,7 @@ * Returns the reference to the exception or error that caused the * exception implementing the <code>Nestable</code> to be thrown. */ - public Throwable getNested(); + public Throwable getCause(); /** * Returns the error message of this and any nested @@ -81,18 +82,22 @@ /** * Prints the stack trace of this exception to the specified print - * writer. + * writer. Includes inforamation from the exception--if + * any--which caused this exception. * * @param out <code>PrintWriter</code> to use for output. */ public void printStackTrace(PrintWriter out); /** - * Prints the stack trace of this exception skiping a specified number - * of stack frames. + * Prints the stack trace for this exception only--root cause not + * included--using the provided writer. Used by {@link + * org.apache.commons.util.exception.NestableDelegate} to write + * individual stack traces to a buffer. The implementation of + * this method should call + * <code>super.printStackTrace(out);</code> in most cases. * - * @param out <code>PrintWriter</code> to use for output. - * @param skip The numbere of stack frames to skip. + * @param out The writer to use. */ - public void printStackTrace(PrintWriter out, int skip); + public void printPartialStackTrace(PrintWriter out); } 1.3 +43 -43 jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/NestableDelegate.java Index: NestableDelegate.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/NestableDelegate.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -u -r1.2 -r1.3 --- NestableDelegate.java 2001/08/08 23:56:48 1.2 +++ NestableDelegate.java 2001/08/09 22:06:56 1.3 @@ -65,6 +65,7 @@ /** * @author <a href="mailto:[EMAIL PROTECTED]">Rafal Krzewski</a> * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Kasper Nielsen</a> */ public class NestableDelegate { @@ -79,17 +80,17 @@ * Holds the reference to the exception or error that caused * this exception to be thrown. */ - private Nestable t = null; + private Nestable cause = null; /** - * @param t The Nestable implementation to get a stack trace for + * @param cause The Nestable implementation to get a stack trace for * (<i>must</i> extend {@link java.lang.Throwable}). */ - public NestableDelegate(Nestable t) + public NestableDelegate(Nestable cause) { - if (t instanceof Throwable) + if (cause instanceof Throwable) { - this.t = t; + this.cause = cause; } else { @@ -114,17 +115,17 @@ msg.append(baseMsg); } - Throwable nested = t.getNested(); - if (nested != null) + Throwable nestedCause = cause.getCause(); + if (nestedCause != null) { - String nestedMsg = nested.getMessage(); - if (nestedMsg != null) + String causeMsg = nestedCause.getMessage(); + if (causeMsg != null) { if (baseMsg != null) { msg.append(": "); } - msg.append(nestedMsg); + msg.append(causeMsg); } } @@ -168,43 +169,31 @@ { synchronized (out) { - printStackTrace(out, 0); - } - } - - /** - * Prints the stack trace of the provided exception, skiping the - * specified number of stack frames. - * - * @param out <code>PrintWriter</code> to use for output. - * @param skip The number of stack frames to skip. - */ - public void printStackTrace(PrintWriter out, int skip) - { - // Retreive full stack trace. - String[] st = decompose((Throwable) t); - Throwable nested = t.getNested(); - if (nested != null) - { - if (nested instanceof Nestable) - { - ((Nestable) nested).printStackTrace(out, st.length - 2); - } - else + String[] st = decompose((Throwable) cause); + Throwable nestedCause = cause.getCause(); + if (nestedCause != null) { - String[] nst = decompose(nested); - for (int i = 0; i < nst.length - st.length + 2; i++) + if (nestedCause instanceof Nestable) + { + // Recurse until a non-Nestable is encountered. + ((Nestable) nestedCause).printStackTrace(out); + } + else { - out.println(nst[i]); + String[] nst = decompose(nestedCause); + for (int i = 0; i < nst.length; i++) + { + out.println(nst[i]); + } } + out.print("rethrown as "); } - out.print("rethrown as "); - } - // Output desired frames from stack trace. - for (int i = 0; i < st.length - skip; i++) - { - out.println(st[i]); + // Output desired frames from stack trace. + for (int i = 0; i < st.length; i++) + { + out.println(st[i]); + } } } @@ -218,7 +207,18 @@ private String[] decompose(Throwable t) { StringWriter sw = new StringWriter(); - t.printStackTrace(new PrintWriter(sw, true)); + PrintWriter pw = new PrintWriter(sw, true); + + // Avoid infinite loop between decompose() and printStackTrace(). + if (t instanceof Nestable) + { + ((Nestable) t).printPartialStackTrace(pw); + } + else + { + t.printStackTrace(pw); + } + String linebreak = System.getProperty("line.separator"); StringTokenizer st = new StringTokenizer(sw.getBuffer().toString(), linebreak); 1.3 +16 -15 jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/NestableException.java Index: NestableException.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/NestableException.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -u -r1.2 -r1.3 --- NestableException.java 2001/08/08 23:56:48 1.2 +++ NestableException.java 2001/08/09 22:06:56 1.3 @@ -123,6 +123,7 @@ * * @author <a href="mailto:[EMAIL PROTECTED]">Rafal Krzewski</a> * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Kasper Nielsen</a> */ public class NestableException extends Exception implements Nestable { @@ -136,7 +137,7 @@ * Holds the reference to the exception or error that caused * this exception to be thrown. */ - private Throwable nested = null; + private Throwable cause = null; /** * Constructs a new <code>NestableException</code> without specified @@ -165,10 +166,10 @@ * @param nested The exception or error that caused this exception * to be thrown. */ - public NestableException(Throwable nested) + public NestableException(Throwable cause) { super(); - this.nested = nested; + this.cause = cause; } /** @@ -179,18 +180,18 @@ * @param nested The exception or error that caused this exception * to be thrown. */ - public NestableException(String msg, Throwable nested) + public NestableException(String msg, Throwable cause) { super(msg); - this.nested = nested; + this.cause = cause; } /** - * @see org.apache.commons.util.exception.Nestable#getNested() + * @see org.apache.commons.util.exception.Nestable#getCause() */ - public Throwable getNested() + public Throwable getCause() { - return nested; + return cause; } /** @@ -204,16 +205,16 @@ { msg.append(ourMsg); } - if (nested != null) + if (cause != null) { - String nestedMsg = nested.getMessage(); - if (nestedMsg != null) + String causeMsg = cause.getMessage(); + if (causeMsg != null) { if (ourMsg != null) { msg.append(": "); } - msg.append(nestedMsg); + msg.append(causeMsg); } } @@ -248,10 +249,10 @@ } /** - * @see org.apache.commons.util.exception.Nestable#printStackTrace(PrintWriter out, int skip) + * @see org.apache.commons.util.exception.Nestable#printPartialStackTrace(PrintWriter out) */ - public void printStackTrace(PrintWriter out, int skip) + public final void printPartialStackTrace(PrintWriter out) { - delegate.printStackTrace(out, skip); + super.printStackTrace(out); } } 1.3 +16 -15 jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/NestableRuntimeException.java Index: NestableRuntimeException.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/util/src/java/org/apache/commons/util/exception/NestableRuntimeException.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -u -r1.2 -r1.3 --- NestableRuntimeException.java 2001/08/08 23:56:48 1.2 +++ NestableRuntimeException.java 2001/08/09 22:06:56 1.3 @@ -69,6 +69,7 @@ * @see org.apache.commons.util.exception.NestableException * @author <a href="mailto:[EMAIL PROTECTED]">Rafal Krzewski</a> * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Kasper Nielsen</a> */ public class NestableRuntimeException extends RuntimeException implements Nestable @@ -83,7 +84,7 @@ * Holds the reference to the exception or error that caused * this exception to be thrown. */ - private Throwable nested = null; + private Throwable cause = null; /** * Constructs a new <code>NestableRuntimeException</code> without specified @@ -112,10 +113,10 @@ * @param nested The exception or error that caused this exception * to be thrown. */ - public NestableRuntimeException(Throwable nested) + public NestableRuntimeException(Throwable cause) { super(); - this.nested = nested; + this.cause = cause; } /** @@ -126,18 +127,18 @@ * @param nested The exception or error that caused this exception * to be thrown. */ - public NestableRuntimeException(String msg, Throwable nested) + public NestableRuntimeException(String msg, Throwable cause) { super(msg); - this.nested = nested; + this.cause = cause; } /** - * @see org.apache.commons.util.exception.Nestable#getNested() + * @see org.apache.commons.util.exception.Nestable#getCause() */ - public Throwable getNested() + public Throwable getCause() { - return nested; + return cause; } /** @@ -151,16 +152,16 @@ { msg.append(ourMsg); } - if (nested != null) + if (cause != null) { - String nestedMsg = nested.getMessage(); - if (nestedMsg != null) + String causeMsg = cause.getMessage(); + if (causeMsg != null) { if (ourMsg != null) { msg.append(": "); } - msg.append(nestedMsg); + msg.append(causeMsg); } } @@ -195,10 +196,10 @@ } /** - * @see org.apache.commons.util.exception.Nestable#printStackTrace(PrintWriter out, int skip) + * @see org.apache.commons.util.exception.Nestable#printPartialStackTrace(PrintWriter out) */ - public void printStackTrace(PrintWriter out, int skip) + public final void printPartialStackTrace(PrintWriter out) { - delegate.printStackTrace(out, skip); + super.printStackTrace(out); } }