You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2003/08/13 10:24:14 UTC

cvs commit: incubator-geronimo/modules/common/src/java/org/apache/geronimo/common AbstractNestedThrowable.java NestedError.java NestedException.java NestedRuntimeException.java NestedThrowable.java

jdillon     2003/08/13 01:24:14

  Added:       modules/common/src/java/org/apache/geronimo/common
                        AbstractNestedThrowable.java NestedError.java
                        NestedException.java NestedRuntimeException.java
                        NestedThrowable.java
  Log:
   o Nested throwables, may look into using Commons-Lang or just using the
     native 1.4 throwables eventually, but for now use these
  
  Revision  Changes    Path
  1.1                  incubator-geronimo/modules/common/src/java/org/apache/geronimo/common/AbstractNestedThrowable.java
  
  Index: AbstractNestedThrowable.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.common;
  
  import java.io.PrintWriter;
  import java.io.PrintStream;
  
  /**
   * A common superclass for <tt>Throwable</tt> classes that can contain
   * a nested <tt>Throwable</tt> detail object.
   *
   * @version <tt>$Revision: 1.1 $</tt>
   * @author  <a href="mailto:jason@planet57.com">Jason Dillon</a>
   */
  public abstract class AbstractNestedThrowable
      extends Throwable
      implements NestedThrowable
  {
      /** The nested throwable */
      protected final Throwable nested;
      
      /**
       * Construct a <tt>AbstractNestedThrowable</tt> with the specified 
       * detail message.
       *
       * @param msg  Detail message.
       */
      public AbstractNestedThrowable(final String msg) {
          super(msg);
          this.nested = null;
      }
      
      /**
       * Construct a <tt>AbstractNestedThrowable</tt> with the specified detail 
       * message and nested <tt>Throwable</tt>.
       *
       * @param msg     Detail message.
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public AbstractNestedThrowable(final String msg, final Throwable nested) {
          super(msg);
          this.nested = nested;
          NestedThrowable.Util.checkNested(this, nested);
      }
      
      /**
       * Construct a <tt>AbstractNestedThrowable</tt> with the specified
       * nested <tt>Throwable</tt>.
       *
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public AbstractNestedThrowable(final Throwable nested) {
          this(nested.getMessage(), nested);
      }
      
      /**
       * Construct a <tt>AbstractNestedThrowable</tt> with no detail.
       */
      public AbstractNestedThrowable() {
          super();
          this.nested = null;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getNested() {
          return nested;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * <p>For JDK 1.4 compatibility.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getCause() {
          return nested;
      }
      
      /**
       * Returns the composite throwable message.
       *
       * @return  The composite throwable message.
       */
      public String getMessage() {
          return NestedThrowable.Util.getMessage(super.getMessage(), nested);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print stream.
       *
       * @param stream  Stream to print to.
       */
      public void printStackTrace(final PrintStream stream) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(stream);
          }
          NestedThrowable.Util.print(nested, stream);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print writer.
       *
       * @param writer  Writer to print to.
       */
      public void printStackTrace(final PrintWriter writer) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(writer);
          }
          NestedThrowable.Util.print(nested, writer);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to 
       * <tt>System.err</tt>.
       */
      public void printStackTrace() {
          printStackTrace(System.err);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/common/src/java/org/apache/geronimo/common/NestedError.java
  
  Index: NestedError.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.common;
  
  import java.io.PrintWriter;
  import java.io.PrintStream;
  
  /**
   * A common superclass for <tt>Error</tt> classes that can
   * contain a nested <tt>Throwable</tt> detail object.
   *
   * @version <tt>$Revision: 1.1 $</tt>
   * @author  <a href="mailto:jason@planet57.com">Jason Dillon</a>
   */
  public class NestedError
      extends Error
      implements NestedThrowable
  {
      /** The nested throwable */
      protected final Throwable nested;
      
      /**
       * Construct a <tt>NestedError</tt> with the specified 
       * detail message.
       *
       * @param msg  Detail message.
       */
      public NestedError(final String msg) {
          super(msg);
          this.nested = null;
      }
      
      /**
       * Construct a <tt>NestedError</tt> with the specified
       * detail message and nested <tt>Throwable</tt>.
       *
       * @param msg     Detail message.
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public NestedError(final String msg, final Throwable nested) {
          super(msg);
          this.nested = nested;
          NestedThrowable.Util.checkNested(this, nested);
      }
      
      /**
       * Construct a <tt>NestedError</tt> with the specified
       * nested <tt>Throwable</tt>.
       *
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public NestedError(final Throwable nested) {
          this(nested.getMessage(), nested);
      }
      
      /**
       * Construct a <tt>NestedError</tt> with no detail.
       */
      public NestedError() {
          super();
          this.nested = null;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getNested() {
          return nested;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * <p>For JDK 1.4 compatibility.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getCause() {
          return nested;
      }
      
      /**
       * Returns the composite throwable message.
       *
       * @return  The composite throwable message.
       */
      public String getMessage() {
          return NestedThrowable.Util.getMessage(super.getMessage(), nested);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print stream.
       *
       * @param stream  Stream to print to.
       */
      public void printStackTrace(final PrintStream stream) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(stream);
          }
          NestedThrowable.Util.print(nested, stream);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print writer.
       *
       * @param writer  Writer to print to.
       */
      public void printStackTrace(final PrintWriter writer) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(writer);
          }
          NestedThrowable.Util.print(nested, writer);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to 
       * <tt>System.err</tt>.
       */
      public void printStackTrace() {
          printStackTrace(System.err);
      }
      
      /**
       * Wraps the give throwable in a NestedError unless it is already
       * a NestedError.
       * 
       * @param t   The target throwable to wrap.
       * @return    A NestedError.
       */
      public static NestedError wrap(Throwable t) {
          if (t instanceof NestedError) {
              return (NestedError)t;
          }
          return new NestedError(t);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/common/src/java/org/apache/geronimo/common/NestedException.java
  
  Index: NestedException.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.common;
  
  import java.io.PrintWriter;
  import java.io.PrintStream;
  
  /**
   * A common superclass for <tt>Exception</tt> classes that can contain
   * a nested <tt>Throwable</tt> detail object.
   *
   * @version <tt>$Revision: 1.1 $</tt>
   * @author  <a href="mailto:jason@planet57.com">Jason Dillon</a>
   */
  public class NestedException
      extends Exception
      implements NestedThrowable
  {
      /** The nested throwable */
      protected final Throwable nested;
      
      /**
       * Construct a <tt>NestedException</tt> with the specified detail 
       * message.
       *
       * @param msg  Detail message.
       */
      public NestedException(final String msg) {
          super(msg);
          this.nested = null;
      }
      
      /**
       * Construct a <tt>NestedException</tt> with the specified detail 
       * message and nested <tt>Throwable</tt>.
       *
       * @param msg     Detail message.
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public NestedException(final String msg, final Throwable nested) {
          super(msg);
          this.nested = nested;
          NestedThrowable.Util.checkNested(this, nested);
      }
      
      /**
       * Construct a <tt>NestedException</tt> with the specified
       * nested <tt>Throwable</tt>.
       *
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public NestedException(final Throwable nested) {
          this(nested.getMessage(), nested);
      }
      
      /**
       * Construct a <tt>NestedException</tt> with no detail.
       */
      public NestedException() {
          super();
          this.nested = null;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getNested() {
          return nested;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * <p>For JDK 1.4 compatibility.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getCause() {
          return nested;
      }
      
      /**
       * Returns the composite throwable message.
       *
       * @return  The composite throwable message.
       */
      public String getMessage() {
          return NestedThrowable.Util.getMessage(super.getMessage(), nested);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print stream.
       *
       * @param stream  Stream to print to.
       */
      public void printStackTrace(final PrintStream stream) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(stream);
          }
          NestedThrowable.Util.print(nested, stream);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print writer.
       *
       * @param writer  Writer to print to.
       */
      public void printStackTrace(final PrintWriter writer) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(writer);
          }
          NestedThrowable.Util.print(nested, writer);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to 
       * <tt>System.err</tt>.
       */
      public void printStackTrace() {
          printStackTrace(System.err);
      }
      
      /**
       * Wraps the give throwable in a NestedException unless it is already
       * a NestedException.
       * 
       * @param t   The target throwable to wrap.
       * @return    A NestedException.
       */
      public static NestedException wrap(Throwable t) {
          if (t instanceof NestedException) {
              return (NestedException)t;
          }
          return new NestedException(t);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/common/src/java/org/apache/geronimo/common/NestedRuntimeException.java
  
  Index: NestedRuntimeException.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.common;
  
  import java.io.PrintWriter;
  import java.io.PrintStream;
  
  /**
   * A common superclass for <tt>RuntimeException</tt> classes that can
   * contain a nested <tt>Throwable</tt> detail object.
   *
   * @version <tt>$Revision: 1.1 $</tt>
   * @author  <a href="mailto:jason@planet57.com">Jason Dillon</a>
   */
  public class NestedRuntimeException
      extends RuntimeException
      implements NestedThrowable
  {
      /** The nested throwable */
      protected final Throwable nested;
      
      /**
       * Construct a <tt>NestedRuntimeException</tt> with the specified
       * detail message.
       *
       * @param msg  Detail message.
       */
      public NestedRuntimeException(final String msg) {
          super(msg);
          this.nested = null;
      }
      
      /**
       * Construct a <tt>NestedRuntimeException</tt> with the specified
       * detail message and nested <tt>Throwable</tt>.
       *
       * @param msg     Detail message.
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public NestedRuntimeException(final String msg, final Throwable nested) {
          super(msg);
          this.nested = nested;
          NestedThrowable.Util.checkNested(this, nested);
      }
      
      /**
       * Construct a <tt>NestedRuntimeException</tt> with the specified
       * nested <tt>Throwable</tt>.
       *
       * @param nested  Nested <tt>Throwable</tt>.
       */
      public NestedRuntimeException(final Throwable nested) {
          this(nested.getMessage(), nested);
      }
      
      /**
       * Construct a <tt>NestedRuntimeException</tt> with no detail.
       */
      public NestedRuntimeException() {
          super();
          this.nested = null;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getNested() {
          return nested;
      }
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * <p>For JDK 1.4 compatibility.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      public Throwable getCause() {
          return nested;
      }
      
      /**
       * Returns the composite throwable message.
       *
       * @return  The composite throwable message.
       */
      public String getMessage() {
          return NestedThrowable.Util.getMessage(super.getMessage(), nested);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print stream.
       *
       * @param stream  Stream to print to.
       */
      public void printStackTrace(final PrintStream stream) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(stream);
          }
          NestedThrowable.Util.print(nested, stream);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to the
       * specified print writer.
       *
       * @param writer  Writer to print to.
       */
      public void printStackTrace(final PrintWriter writer) {
          if (nested == null || NestedThrowable.PARENT_TRACE_ENABLED) {
              super.printStackTrace(writer);
          }
          NestedThrowable.Util.print(nested, writer);
      }
      
      /**
       * Prints the composite message and the embedded stack trace to
       * <tt>System.err</tt>.
       */
      public void printStackTrace() {
          printStackTrace(System.err);
      }
      
      /**
       * Wraps the give throwable in a NestedRuntimeException unless it is already
       * a NestedRuntimeException.
       *
       * @param t   The target throwable to wrap.
       * @return    A NestedRuntimeException.
       */
      public static NestedRuntimeException wrap(Throwable t) {
          if (t instanceof NestedRuntimeException) {
              return (NestedRuntimeException)t;
          }
          return new NestedRuntimeException(t);
      }
  }
  
  
  
  1.1                  incubator-geronimo/modules/common/src/java/org/apache/geronimo/common/NestedThrowable.java
  
  Index: NestedThrowable.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.common;
  
  import java.io.PrintWriter;
  import java.io.PrintStream;
  import java.io.Serializable;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  import org.apache.geronimo.common.platform.Java;
  
  /**
   * Interface which is implemented by all the nested throwable flavors.
   *
   * @version <tt>$Revision: 1.1 $</tt>
   * @author  <a href="mailto:jason@planet57.com">Jason Dillon</a>
   */
  public interface NestedThrowable
     extends Serializable
  {
      /**
       * A system wide flag to enable or disable printing of the
       * parent throwable traces.
       *
       * <p>
       * This value is set from the system property
       * <tt>org.apache.geronimo.common.NestedThrowable.parentTraceEnabled</tt>
       * or if that is not set defaults to <tt>true</tt>.
       */
      boolean PARENT_TRACE_ENABLED = Util.getBoolean("parentTraceEnabled", true);
      
      /**
       * A system wide flag to enable or disable printing of the
       * nested detail throwable traces.
       *
       * <p>
       * This value is set from the system property
       * <tt>org.apache.geronimo.common.NestedThrowable.nestedTraceEnabled</tt>
       * or if that is not set defaults to <tt>true</tt> unless
       * using JDK 1.4 with {@link #PARENT_TRACE_ENABLED} set to false,
       * then <tt>false</tt> since there is a native mechansim for this there.
       *
       * <p>
       * Note then when running under 1.4 is is not possible to disable
       * the nested trace output, since that is handled by java.lang.Throwable
       * which we delegate the parent printing to.
       */
      boolean NESTED_TRACE_ENABLED = Util.getBoolean("nestedTraceEnabled",
                                                     (Java.isCompatible(Java.VERSION_1_4) &&
                                                      !PARENT_TRACE_ENABLED) ||
                                                      !Java.isCompatible(Java.VERSION_1_4));
  
      /**
       * A system wide flag to enable or disable checking of parent and child
       * types to detect uneeded nesting
       *
       * <p>
       * This value is set from the system property
       * <tt>org.apache.geronimo.common.NestedThrowable.detectDuplicateNesting</tt>
       * or if that is not set defaults to <tt>true</tt>.
       */
      boolean DETECT_DUPLICATE_NESTING = Util.getBoolean("detectDuplicateNesting", true);
      
      /**
       * Return the nested throwable.
       *
       * @return  Nested throwable.
       */
      Throwable getNested();
      
      /**
       * Return the nested <tt>Throwable</tt>.
       *
       * <p>For JDK 1.4 compatibility.
       *
       * @return  Nested <tt>Throwable</tt>.
       */
      Throwable getCause();
  
  
      /////////////////////////////////////////////////////////////////////////
      //                      Nested Throwable Utilities                     //
      /////////////////////////////////////////////////////////////////////////
  
      /**
       * Utilitiy methods for the various flavors of
       * <code>NestedThrowable</code>.
       */
      final class Util 
      {
          // Can not be final due to init bug, see getLogger() for details
          private static Log log = LogFactory.getLog(NestedThrowable.class);
          
          /**
           * Something is very broken with class nesting, which can sometimes
           * leave log uninitialized durring one of the following method calls.
           *
           * <p>
           * This is a HACK to keep those methods from NPE until this problem
           * can be resolved.
           */
          private static Log getLog()
          {
              if (log == null)
                  log = LogFactory.getLog(NestedThrowable.class);
              
              return log;
          }
          
          /** A helper to get a boolean property. */
          protected static boolean getBoolean(String name, boolean defaultValue)
          {
              name = NestedThrowable.class.getName() + "." + name;
              String value = System.getProperty(name, String.valueOf(defaultValue));
              
              // HACK see getLog() for details
              log = getLog();
              log.debug(name + "=" + value);
              
              return new Boolean(value).booleanValue();
          }
          
          /**
           * Check and possibly warn if the nested exception type is the same
           * as the parent type (duplicate nesting).
           */
          public static void checkNested(final NestedThrowable parent,
                                         final Throwable child)
          {
              if (!DETECT_DUPLICATE_NESTING || parent == null || child == null) return;
              
              Class parentType = parent.getClass();
              Class childType = child.getClass();
              
              //
              // This might be backwards... I always get this confused
              //
              
              if (parentType.isAssignableFrom(childType)) {
                  // HACK see getLog() for details
                  log = getLog();
                  log.warn("Duplicate throwable nesting of same base type: " +
                           parentType + " is assignable from: " + childType);
              }
          }
          
          /**
           * Returns a formated message for the given detail message
           * and nested <code>Throwable</code>.
           *
           * @param msg     Detail message.
           * @param nested  Nested <code>Throwable</code>.
           * @return        Formatted message.
           */
          public static String getMessage(final String msg,
                                          final Throwable nested)
          {
              StringBuffer buff = new StringBuffer(msg == null ? "" : msg);
              
              if (nested != null) {
                  buff.append(msg == null ? "- " : "; - ")
                      .append("nested throwable: (")
                      .append(nested)
                      .append(")");
              }
              
              return buff.toString();
          }
  
          /**
           * Prints the nested <code>Throwable</code> to the given stream.
           *
           * @param nested  Nested <code>Throwable</code>.
           * @param stream  Stream to print to.
           */
          public static void print(final Throwable nested,
                                   final PrintStream stream)
          {
              if (stream == null)
                  throw new NullArgumentException("stream");
              
              if (NestedThrowable.NESTED_TRACE_ENABLED && nested != null) {
                  synchronized (stream) {
                      if (NestedThrowable.PARENT_TRACE_ENABLED) {
                          stream.print(" + nested throwable: ");
                      }
                      else {
                          stream.print("[ parent trace omitted ]: ");
                      }
                      
                      nested.printStackTrace(stream);
                  }
              }
          }
          
          /**
           * Prints the nested <code>Throwable</code> to the given writer.
           *
           * @param nested  Nested <code>Throwable</code>.
           * @param writer  Writer to print to.
           */
          public static void print(final Throwable nested,
                                   final PrintWriter writer)
          {
              if (writer == null)
                  throw new NullArgumentException("writer");
              
              if (NestedThrowable.NESTED_TRACE_ENABLED && nested != null) {
                  synchronized (writer) {
                      if (NestedThrowable.PARENT_TRACE_ENABLED) {
                          writer.print(" + nested throwable: ");
                      }
                      else {
                          writer.print("[ parent trace omitted ]: ");
                      }
                      
                      nested.printStackTrace(writer);
                  }
              }
          }
      }
  }