1 /** 2 * Redistribution and use of this software and associated documentation 3 * ("Software"), with or without modification, are permitted provided 4 * that the following conditions are met: 5 * 6 * 1. Redistributions of source code must retain copyright 7 * statements and notices. Redistributions must also contain a 8 * copy of this document. 9 * 10 * 2. Redistributions in binary form must reproduce the 11 * above copyright notice, this list of conditions and the 12 * following disclaimer in the documentation and/or other 13 * materials provided with the distribution. 14 * 15 * 3. The name "Exolab" must not be used to endorse or promote 16 * products derived from this Software without prior written 17 * permission of Intalio, Inc. For written permission, 18 * please contact info@exolab.org. 19 * 20 * 4. Products derived from this Software may not be called "Exolab" 21 * nor may "Exolab" appear in their names without prior written 22 * permission of Intalio, Inc. Exolab is a registered 23 * trademark of Intalio, Inc. 24 * 25 * 5. Due credit should be given to the Exolab Project 26 * (http://www.exolab.org/). 27 * 28 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT 30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 32 * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 39 * OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 * Copyright 1999-2001 (C) Intalio, Inc. All Rights Reserved. 42 * 43 * $Id$ 44 */ 45 46 package org.exolab.castor.util; 47 48 import java.io.PrintStream; 49 import java.io.PrintWriter; 50 51 /** 52 * An exception that is used to signal I/O errors which are 53 * caused by other exceptions. This class allows the user 54 * get to the original exception. 55 * 56 * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a> 57 * @version $Revision$ $Date: 2005-12-13 14:58:48 -0700 (Tue, 13 Dec 2005) $ 58 **/ 59 public class NestedIOException extends java.io.IOException { 60 /** SerialVersionUID */ 61 private static final long serialVersionUID = -4698274786487914369L; 62 63 /** 64 * A nested exception 65 */ 66 private Exception _exception = null; 67 68 /** 69 * A flag to indicate a local stack trace only 70 **/ 71 private boolean _localTrace = false; 72 73 /** 74 * Creates a new NestedIOException with no message, 75 * or nested Exception 76 **/ 77 public NestedIOException() { 78 super(); 79 } //-- NestedIOException 80 81 /** 82 * Creates a new NestedIOException with the given message. 83 * @param message the message for this Exception 84 **/ 85 public NestedIOException(String message) { 86 super(message); 87 } //-- NestedIOException(String) 88 89 90 /** 91 * Creates a new NestedIOException with the given nested 92 * exception. 93 * 94 * @param exception the nested exception. (Must not be null). 95 **/ 96 public NestedIOException(Exception exception) { 97 super(exception.getMessage()); 98 _exception = exception; 99 } //-- NestedIOException(Exception) 100 101 /** 102 * Creates a new NestedIOException with the given message 103 * and nested exception. 104 * 105 * @param message the detail message for this exception 106 * @param exception the nested exception 107 **/ 108 public NestedIOException(String message, Exception exception) 109 { 110 super(message); 111 _exception = exception; 112 } //-- NestedIOException(String, Exception) 113 114 /** 115 * Returns the exception, which in turn caused this Exception to 116 * be thrown, or null if nested exception exists. 117 * 118 * @return the exception, which in turn caused this Exception to 119 * be thrown, or null if nested exception exists. 120 **/ 121 public Exception getException() { 122 return _exception; 123 } //-- getException 124 125 /** 126 * Sets whether or not to print the local stack trace or 127 * the nested stack trace when calls to #printStackTrace are made. By 128 * default the nested exception is used for printing stack trace. 129 * 130 * @param localTrace a boolean when true enables local stack trace only. 131 **/ 132 public void setLocalStackTraceOnly(boolean localTrace) { 133 _localTrace = localTrace; 134 } //-- setLocalStackTraceOnly 135 136 /** 137 * Returns the String representation of this Exception. 138 * 139 * @return the String representation of this Exception. 140 **/ 141 public String toString() { 142 StringBuffer sb = new StringBuffer("NestedIOException: "); 143 if (getMessage() != null) { 144 sb.append(getMessage()); 145 } 146 if ((_exception != null) && (_exception.getMessage() != null)) { 147 sb.append(" { nested error: "); 148 sb.append(_exception.getMessage()); 149 sb.append('}'); 150 } 151 return sb.toString(); 152 } //-- toString 153 154 //----------------------------------------------------------------/ 155 //- Overwrite printStackTrace methods to handle nested exception -/ 156 //----------------------------------------------------------------/ 157 158 public void printStackTrace() 159 { 160 if (( _exception == null ) || _localTrace) 161 super.printStackTrace(); 162 else 163 _exception.printStackTrace(); 164 } 165 166 public void printStackTrace( PrintWriter printer ) 167 { 168 if (_localTrace || ( _exception == null )) 169 super.printStackTrace( printer ); 170 else 171 _exception.printStackTrace( printer); 172 } 173 174 public void printStackTrace( PrintStream printer ) 175 { 176 if (_localTrace || ( _exception == null )) 177 super.printStackTrace( printer ); 178 else 179 _exception.printStackTrace( printer ); 180 } 181 182 } //-- NestedIOException