001    /* ========================================================================
002     * JCommon : a free general purpose class library for the Java(tm) platform
003     * ========================================================================
004     *
005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006     * 
007     * Project Info:  http://www.jfree.org/jcommon/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     * 
027     * ------------------------------
028     * StackableRuntimeException.java
029     * ------------------------------
030     * (C)opyright 2002-2004, by Thomas Morgner and Contributors.
031     *
032     * Original Author:  Thomas Morgner;
033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
034     *
035     * $Id: StackableRuntimeException.java,v 1.3 2005/11/14 10:57:07 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 06-Dec-2002 : Initial version
040     * 10-Dec-2002 : Fixed issues reported by Checkstyle (DG);
041     * 29-Apr-2003 : Distilled from the JFreeReport project and moved into JCommon
042     *
043     */
044    
045    package org.jfree.util;
046    
047    import java.io.PrintStream;
048    import java.io.PrintWriter;
049    
050    /**
051     * A baseclass for RuntimeExceptions, which could have parent exceptions. These parent exceptions
052     * are raised in a subclass and are now wrapped into a subclass of this Exception.
053     * <p>
054     * The parents are printed when this exception is printed. This class exists mainly for
055     * debugging reasons, as with them it is easier to detect the root cause of an error.
056     *
057     * @author Thomas Morgner
058     */
059    public class StackableRuntimeException extends RuntimeException {
060    
061        /** The parent exception. */
062        private Exception parent;
063    
064        /**
065         * Creates a StackableRuntimeException with no message and no parent.
066         */
067        public StackableRuntimeException() {
068            super();
069        }
070    
071        /**
072         * Creates an exception.
073         *
074         * @param message  the exception message.
075         * @param ex  the parent exception.
076         */
077        public StackableRuntimeException(final String message, final Exception ex) {
078            super(message);
079            this.parent = ex;
080        }
081    
082        /**
083         * Creates an exception.
084         *
085         * @param message  the exception message.
086         */
087        public StackableRuntimeException(final String message) {
088            super(message);
089        }
090    
091        /**
092         * Returns the parent exception (possibly null).
093         *
094         * @return the parent exception.
095         */
096        public Exception getParent() {
097            return this.parent;
098        }
099    
100        /**
101         * Prints the stack trace to the specified stream.
102         *
103         * @param stream  the output stream.
104         */
105        public void printStackTrace(final PrintStream stream) {
106            super.printStackTrace(stream);
107            if (getParent() != null) {
108                stream.println("ParentException: ");
109                getParent().printStackTrace(stream);
110            }
111        }
112    
113        /**
114         * Prints the stack trace to the specified writer.
115         *
116         * @param writer  the writer.
117         */
118        public void printStackTrace(final PrintWriter writer) {
119            super.printStackTrace(writer);
120            if (getParent() != null) {
121                writer.println("ParentException: ");
122                getParent().printStackTrace(writer);
123            }
124        }
125    
126    }