1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 // $Id: TransformerException.java 569994 2007-08-27 04:28:57Z mrglavas $ 19 20 package javax.xml.transform; 21 22 /** 23 * This class specifies an exceptional condition that occurred 24 * during the transformation process. 25 */ 26 public class TransformerException extends Exception { 27 28 // Added serialVersionUID to preserve binary compatibility 29 private static final long serialVersionUID = 975798773772956428L; 30 31 /** Field locator specifies where the error occurred */ 32 SourceLocator locator; 33 34 /** 35 * Method getLocator retrieves an instance of a SourceLocator 36 * object that specifies where an error occurred. 37 * 38 * @return A SourceLocator object, or null if none was specified. 39 */ getLocator()40 public SourceLocator getLocator() { 41 return locator; 42 } 43 44 /** 45 * Method setLocator sets an instance of a SourceLocator 46 * object that specifies where an error occurred. 47 * 48 * @param location A SourceLocator object, or null to clear the location. 49 */ setLocator(SourceLocator location)50 public void setLocator(SourceLocator location) { 51 locator = location; 52 } 53 54 /** Field containedException specifies a wrapped exception. May be null. */ 55 Throwable containedException; 56 57 /** 58 * This method retrieves an exception that this exception wraps. 59 * 60 * @return An Throwable object, or null. 61 * @see #getCause 62 */ getException()63 public Throwable getException() { 64 return containedException; 65 } 66 67 /** 68 * Returns the cause of this throwable or <code>null</code> if the 69 * cause is nonexistent or unknown. (The cause is the throwable that 70 * caused this throwable to get thrown.) 71 */ getCause()72 public Throwable getCause() { 73 74 return ((containedException == this) 75 ? null 76 : containedException); 77 } 78 79 /** 80 * Initializes the <i>cause</i> of this throwable to the specified value. 81 * (The cause is the throwable that caused this throwable to get thrown.) 82 * 83 * <p>This method can be called at most once. It is generally called from 84 * within the constructor, or immediately after creating the 85 * throwable. If this throwable was created 86 * with {@link #TransformerException(Throwable)} or 87 * {@link #TransformerException(String,Throwable)}, this method cannot be called 88 * even once. 89 * 90 * @param cause the cause (which is saved for later retrieval by the 91 * {@link #getCause()} method). (A <tt>null</tt> value is 92 * permitted, and indicates that the cause is nonexistent or 93 * unknown.) 94 * @return a reference to this <code>Throwable</code> instance. 95 * @throws IllegalArgumentException if <code>cause</code> is this 96 * throwable. (A throwable cannot 97 * be its own cause.) 98 * @throws IllegalStateException if this throwable was 99 * created with {@link #TransformerException(Throwable)} or 100 * {@link #TransformerException(String,Throwable)}, or this method has already 101 * been called on this throwable. 102 */ initCause(Throwable cause)103 public synchronized Throwable initCause(Throwable cause) { 104 105 if (this.containedException != null) { 106 throw new IllegalStateException("Can't overwrite cause"); 107 } 108 109 if (cause == this) { 110 throw new IllegalArgumentException( 111 "Self-causation not permitted"); 112 } 113 114 this.containedException = cause; 115 116 return this; 117 } 118 119 /** 120 * Create a new TransformerException. 121 * 122 * @param message The error or warning message. 123 */ TransformerException(String message)124 public TransformerException(String message) { 125 126 super(message); 127 128 this.containedException = null; 129 this.locator = null; 130 } 131 132 /** 133 * Create a new TransformerException wrapping an existing exception. 134 * 135 * @param e The exception to be wrapped. 136 */ TransformerException(Throwable e)137 public TransformerException(Throwable e) { 138 139 super(e.toString()); 140 141 this.containedException = e; 142 this.locator = null; 143 } 144 145 /** 146 * Wrap an existing exception in a TransformerException. 147 * 148 * <p>This is used for throwing processor exceptions before 149 * the processing has started.</p> 150 * 151 * @param message The error or warning message, or null to 152 * use the message from the embedded exception. 153 * @param e Any exception 154 */ TransformerException(String message, Throwable e)155 public TransformerException(String message, Throwable e) { 156 157 super(((message == null) || (message.length() == 0)) 158 ? e.toString() 159 : message); 160 161 this.containedException = e; 162 this.locator = null; 163 } 164 165 /** 166 * Create a new TransformerException from a message and a Locator. 167 * 168 * <p>This constructor is especially useful when an application is 169 * creating its own exception from within a DocumentHandler 170 * callback.</p> 171 * 172 * @param message The error or warning message. 173 * @param locator The locator object for the error or warning. 174 */ TransformerException(String message, SourceLocator locator)175 public TransformerException(String message, SourceLocator locator) { 176 177 super(message); 178 179 this.containedException = null; 180 this.locator = locator; 181 } 182 183 /** 184 * Wrap an existing exception in a TransformerException. 185 * 186 * @param message The error or warning message, or null to 187 * use the message from the embedded exception. 188 * @param locator The locator object for the error or warning. 189 * @param e Any exception 190 */ TransformerException(String message, SourceLocator locator, Throwable e)191 public TransformerException(String message, SourceLocator locator, 192 Throwable e) { 193 194 super(message); 195 196 this.containedException = e; 197 this.locator = locator; 198 } 199 200 /** 201 * Get the error message with location information 202 * appended. 203 * 204 * @return A <code>String</code> representing the error message with 205 * location information appended. 206 */ getMessageAndLocation()207 public String getMessageAndLocation() { 208 209 StringBuilder sbuffer = new StringBuilder(); 210 String message = super.getMessage(); 211 212 if (null != message) { 213 sbuffer.append(message); 214 } 215 216 if (null != locator) { 217 String systemID = locator.getSystemId(); 218 int line = locator.getLineNumber(); 219 int column = locator.getColumnNumber(); 220 221 if (null != systemID) { 222 sbuffer.append("; SystemID: "); 223 sbuffer.append(systemID); 224 } 225 226 if (0 != line) { 227 sbuffer.append("; Line#: "); 228 sbuffer.append(line); 229 } 230 231 if (0 != column) { 232 sbuffer.append("; Column#: "); 233 sbuffer.append(column); 234 } 235 } 236 237 return sbuffer.toString(); 238 } 239 240 /** 241 * Get the location information as a string. 242 * 243 * @return A string with location info, or null 244 * if there is no location information. 245 */ getLocationAsString()246 public String getLocationAsString() { 247 248 if (null != locator) { 249 StringBuilder sbuffer = new StringBuilder(); 250 String systemID = locator.getSystemId(); 251 int line = locator.getLineNumber(); 252 int column = locator.getColumnNumber(); 253 254 if (null != systemID) { 255 sbuffer.append("; SystemID: "); 256 sbuffer.append(systemID); 257 } 258 259 if (0 != line) { 260 sbuffer.append("; Line#: "); 261 sbuffer.append(line); 262 } 263 264 if (0 != column) { 265 sbuffer.append("; Column#: "); 266 sbuffer.append(column); 267 } 268 269 return sbuffer.toString(); 270 } else { 271 return null; 272 } 273 } 274 275 /** 276 * Print the the trace of methods from where the error 277 * originated. This will trace all nested exception 278 * objects, as well as this object. 279 */ printStackTrace()280 public void printStackTrace() { 281 printStackTrace(new java.io.PrintWriter(System.err, true)); 282 } 283 284 /** 285 * Print the the trace of methods from where the error 286 * originated. This will trace all nested exception 287 * objects, as well as this object. 288 * @param s The stream where the dump will be sent to. 289 */ printStackTrace(java.io.PrintStream s)290 public void printStackTrace(java.io.PrintStream s) { 291 printStackTrace(new java.io.PrintWriter(s)); 292 } 293 294 /** 295 * Print the the trace of methods from where the error 296 * originated. This will trace all nested exception 297 * objects, as well as this object. 298 * @param s The writer where the dump will be sent to. 299 */ printStackTrace(java.io.PrintWriter s)300 public void printStackTrace(java.io.PrintWriter s) { 301 302 if (s == null) { 303 s = new java.io.PrintWriter(System.err, true); 304 } 305 306 try { 307 String locInfo = getLocationAsString(); 308 309 if (null != locInfo) { 310 s.println(locInfo); 311 } 312 313 super.printStackTrace(s); 314 } catch (Throwable e) {} 315 } 316 } 317