/ org.htmlparser / src / org / htmlparser / util / ChainedException.java
ChainedException.java
  1  // HTMLParser Library $Name: v1_6_20060319 $ - A java-based parser for HTML
  2  // http://sourceforge.org/projects/htmlparser
  3  // Copyright (C) 2004 Claude Duguay
  4  //
  5  // Revision Control Information
  6  //
  7  // $Source: /cvsroot/htmlparser/htmlparser/src/org/htmlparser/util/ChainedException.java,v $
  8  // $Author: derrickoswald $
  9  // $Date: 2004/01/02 16:24:58 $
 10  // $Revision: 1.44 $
 11  //
 12  // This library is free software; you can redistribute it and/or
 13  // modify it under the terms of the GNU Lesser General Public
 14  // License as published by the Free Software Foundation; either
 15  // version 2.1 of the License, or (at your option) any later version.
 16  //
 17  // This library is distributed in the hope that it will be useful,
 18  // but WITHOUT ANY WARRANTY; without even the implied warranty of
 19  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 20  // Lesser General Public License for more details.
 21  //
 22  // You should have received a copy of the GNU Lesser General Public
 23  // License along with this library; if not, write to the Free Software
 24  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 25  //
 26  
 27  package org.htmlparser.util;
 28  
 29  /**
 30   * Support for chained exceptions in code that predates Java 1.4.
 31   * A chained exception can use a Throwable argument to reference
 32   * a lower level exception. The chained exception provides a
 33   * stack trace that includes the message and any throwable
 34   * exception included as an argument in the chain.
 35   *
 36   * For example:
 37   *
 38   *   ApplicationException: Application problem encountered;
 39   *   ProcessException: Unable to process document;
 40   *   java.io.IOException: Unable to open 'filename.ext'
 41   *     at ChainedExceptionTest.openFile(ChainedExceptionTest.java:19)
 42   *     at ChainedExceptionTest.processFile(ChainedExceptionTest.java:27)
 43   *     at ChainedExceptionTest.application(ChainedExceptionTest.java:40)
 44   *     at ChainedExceptionTest.main(ChainedExceptionTest.java:52)
 45   *
 46   * Represents the output from two nested exceptions. The outside
 47   * exception is a subclass of ChainedException called
 48   * ApplicationException, which includes a throwable reference.
 49   * The throwable reference is also a subclass of ChainedException,
 50   * called ProcessException, which in turn includes a reference to
 51   * a standard IOException. In each case, the message is increasingly
 52   * specific about the nature of the problem. The end user may only
 53   * see the application exception, but debugging is greatly
 54   * enhanced by having more details in the stack trace.
 55   *
 56   * @author Claude Duguay
 57   **/
 58  
 59  import java.io.PrintStream;
 60  import java.io.PrintWriter;
 61  import java.util.Vector;
 62  
 63  public class ChainedException
 64    extends Exception
 65  {
 66    protected Throwable throwable;
 67  
 68    public ChainedException() {}
 69  
 70    public ChainedException(String message)
 71    {
 72      super(message);
 73    }
 74  
 75    public ChainedException(Throwable throwable)
 76    {
 77      this.throwable = throwable;
 78    }
 79  
 80    public ChainedException(String message, Throwable throwable)
 81    {
 82      super(message);
 83      this.throwable = throwable;
 84    }
 85  
 86    public String[] getMessageChain()
 87    {
 88      Vector list = getMessageList();
 89      String[] chain = new String[list.size()];
 90      list.copyInto (chain);
 91      return chain;
 92    }
 93  
 94    public Vector getMessageList()
 95    {
 96      Vector list = new Vector();
 97      list.addElement(getMessage());
 98      if (throwable != null)
 99      {
100        if (throwable instanceof ChainedException)
101        {
102          ChainedException chain = (ChainedException)throwable;
103          Vector sublist = chain.getMessageList ();
104          for (int i = 0; i < sublist.size (); i++)
105              list.addElement (sublist.elementAt (i));
106        }
107        else
108        {
109          String message = throwable.getMessage();
110          if (message != null && !message.equals(""))
111          {
112            list.addElement (message);
113          }
114        }
115      }
116      return list;
117    }
118  
119    public Throwable getThrowable()
120    {
121      return throwable;
122    }
123  
124    public void printStackTrace()
125    {
126      printStackTrace(System.err);
127    }
128  
129    public void printStackTrace(PrintStream out)
130    {
131      synchronized (out)
132      {
133        if (throwable != null)
134        {
135          out.println(getClass().getName() +
136            ": " + getMessage() + ";");
137          throwable.printStackTrace(out);
138        }
139        else
140        {
141          super.printStackTrace(out);
142        }
143      }
144    }
145  
146    public void printStackTrace(PrintWriter out)
147    {
148      synchronized (out)
149      {
150        if (throwable != null)
151        {
152          out.println(getClass().getName() +
153            ": " + getMessage() + ";");
154          throwable.printStackTrace(out);
155        }
156        else
157        {
158          super.printStackTrace(out);
159        }
160      }
161    }
162  }
163