14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file 44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information 54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file 64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License. 84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at 94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software 134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and 164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License. 174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: DTMException.java 468653 2006-10-28 07:07:05Z minchau $ 204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xml.dtm; 224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.lang.reflect.InvocationTargetException; 254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.lang.reflect.Method; 264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport javax.xml.transform.SourceLocator; 284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.res.XMLErrorResources; 304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.res.XMLMessages; 314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/** 344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class specifies an exceptional condition that occured 354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * in the DTM module. 364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class DTMException extends RuntimeException { 384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson static final long serialVersionUID = -775576419181334734L; 394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Field locator specifies where the error occured. 414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @serial */ 424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson SourceLocator locator; 434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Method getLocator retrieves an instance of a SourceLocator 464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * object that specifies where an error occured. 474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return A SourceLocator object, or null if none was specified. 494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public SourceLocator getLocator() { 514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return locator; 524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Method setLocator sets an instance of a SourceLocator 564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * object that specifies where an error occured. 574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param location A SourceLocator object, or null to clear the location. 594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void setLocator(SourceLocator location) { 614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson locator = location; 624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Field containedException specifies a wrapped exception. May be null. 654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @serial */ 664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Throwable containedException; 674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This method retrieves an exception that this exception wraps. 704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return An Throwable object, or null. 724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see #getCause 734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public Throwable getException() { 754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return containedException; 764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Returns the cause of this throwable or <code>null</code> if the 804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * cause is nonexistent or unknown. (The cause is the throwable that 814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * caused this throwable to get thrown.) 824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public Throwable getCause() { 844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return ((containedException == this) 864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ? null 874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson : containedException); 884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Initializes the <i>cause</i> of this throwable to the specified value. 924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * (The cause is the throwable that caused this throwable to get thrown.) 934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <p>This method can be called at most once. It is generally called from 954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * within the constructor, or immediately after creating the 964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * throwable. If this throwable was created 974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * with {@link #DTMException(Throwable)} or 984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * {@link #DTMException(String,Throwable)}, this method cannot be called 994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * even once. 1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param cause the cause (which is saved for later retrieval by the 1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * {@link #getCause()} method). (A <tt>null</tt> value is 1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * permitted, and indicates that the cause is nonexistent or 1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * unknown.) 1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return a reference to this <code>Throwable</code> instance. 1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @throws IllegalArgumentException if <code>cause</code> is this 1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * throwable. (A throwable cannot 1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * be its own cause.) 1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @throws IllegalStateException if this throwable was 1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * created with {@link #DTMException(Throwable)} or 1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * {@link #DTMException(String,Throwable)}, or this method has already 1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * been called on this throwable. 1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public synchronized Throwable initCause(Throwable cause) { 1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if ((this.containedException == null) && (cause != null)) { 1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throw new IllegalStateException(XMLMessages.createXMLMessage(XMLErrorResources.ER_CANNOT_OVERWRITE_CAUSE, null)); //"Can't overwrite cause"); 1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (cause == this) { 1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throw new IllegalArgumentException( 1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson XMLMessages.createXMLMessage(XMLErrorResources.ER_SELF_CAUSATION_NOT_PERMITTED, null)); //"Self-causation not permitted"); 1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.containedException = cause; 1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return this; 1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Create a new DTMException. 1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param message The error or warning message. 1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMException(String message) { 1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super(message); 1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.containedException = null; 1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.locator = null; 1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Create a new DTMException wrapping an existing exception. 1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param e The exception to be wrapped. 1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMException(Throwable e) { 1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super(e.getMessage()); 1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.containedException = e; 1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.locator = null; 1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Wrap an existing exception in a DTMException. 1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <p>This is used for throwing processor exceptions before 1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * the processing has started.</p> 1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param message The error or warning message, or null to 1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * use the message from the embedded exception. 1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param e Any exception 1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMException(String message, Throwable e) { 1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super(((message == null) || (message.length() == 0)) 1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ? e.getMessage() 1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson : message); 1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.containedException = e; 1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.locator = null; 1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Create a new DTMException from a message and a Locator. 1784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <p>This constructor is especially useful when an application is 1804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * creating its own exception from within a DocumentHandler 1814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * callback.</p> 1824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param message The error or warning message. 1844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param locator The locator object for the error or warning. 1854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMException(String message, SourceLocator locator) { 1874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super(message); 1894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.containedException = null; 1914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.locator = locator; 1924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Wrap an existing exception in a DTMException. 1964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param message The error or warning message, or null to 1984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * use the message from the embedded exception. 1994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param locator The locator object for the error or warning. 2004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param e Any exception 2014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public DTMException(String message, SourceLocator locator, 2034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Throwable e) { 2044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super(message); 2064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.containedException = e; 2084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson this.locator = locator; 2094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Get the error message with location information 2134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * appended. 2144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public String getMessageAndLocation() { 2164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson StringBuffer sbuffer = new StringBuffer(); 2184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String message = super.getMessage(); 2194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != message) { 2214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append(message); 2224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != locator) { 2254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String systemID = locator.getSystemId(); 2264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int line = locator.getLineNumber(); 2274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int column = locator.getColumnNumber(); 2284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != systemID) { 2304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append("; SystemID: "); 2314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append(systemID); 2324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (0 != line) { 2354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append("; Line#: "); 2364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append(line); 2374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (0 != column) { 2404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append("; Column#: "); 2414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append(column); 2424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return sbuffer.toString(); 2464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Get the location information as a string. 2504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 2514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return A string with location info, or null 2524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * if there is no location information. 2534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public String getLocationAsString() { 2554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != locator) { 2574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson StringBuffer sbuffer = new StringBuffer(); 2584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String systemID = locator.getSystemId(); 2594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int line = locator.getLineNumber(); 2604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int column = locator.getColumnNumber(); 2614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != systemID) { 2634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append("; SystemID: "); 2644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append(systemID); 2654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (0 != line) { 2684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append("; Line#: "); 2694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append(line); 2704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (0 != column) { 2734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append("; Column#: "); 2744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson sbuffer.append(column); 2754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return sbuffer.toString(); 2784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } else { 2794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return null; 2804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Print the the trace of methods from where the error 2854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * originated. This will trace all nested exception 2864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * objects, as well as this object. 2874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void printStackTrace() { 2894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson printStackTrace(new java.io.PrintWriter(System.err, true)); 2904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 2934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Print the the trace of methods from where the error 2944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * originated. This will trace all nested exception 2954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * objects, as well as this object. 2964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param s The stream where the dump will be sent to. 2974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 2984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void printStackTrace(java.io.PrintStream s) { 2994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson printStackTrace(new java.io.PrintWriter(s)); 3004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 3034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Print the the trace of methods from where the error 3044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * originated. This will trace all nested exception 3054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * objects, as well as this object. 3064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param s The writer where the dump will be sent to. 3074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 3084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void printStackTrace(java.io.PrintWriter s) { 3094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (s == null) { 3114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson s = new java.io.PrintWriter(System.err, true); 3124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try { 3154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String locInfo = getLocationAsString(); 3164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != locInfo) { 3184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson s.println(locInfo); 3194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super.printStackTrace(s); 3224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } catch (Throwable e) {} 3234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson boolean isJdk14OrHigher = false; 3254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try { 3266ceaff1464739720cb37a9b1ddac5e203245fe05Elliott Hughes Throwable.class.getMethod("getCause", (Class<?>) null); 3274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson isJdk14OrHigher = true; 3284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } catch (NoSuchMethodException nsme) { 3294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // do nothing 3304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // The printStackTrace method of the Throwable class in jdk 1.4 3334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // and higher will include the cause when printing the backtrace. 3344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson // The following code is only required when using jdk 1.3 or lower 3354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (!isJdk14OrHigher) { 3364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Throwable exception = getException(); 3374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; (i < 10) && (null != exception); i++) { 3394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson s.println("---------"); 3404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try { 3424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (exception instanceof DTMException) { 3434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String locInfo = 3444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((DTMException) exception) 3454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson .getLocationAsString(); 3464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != locInfo) { 3484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson s.println(locInfo); 3494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson exception.printStackTrace(s); 3534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } catch (Throwable e) { 3544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson s.println("Could not print stack trace..."); 3554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson try { 3584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Method meth = 3594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ((Object) exception).getClass().getMethod("getException", 3606ceaff1464739720cb37a9b1ddac5e203245fe05Elliott Hughes (Class<?>) null); 3614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null != meth) { 3634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson Throwable prev = exception; 3644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3656ceaff1464739720cb37a9b1ddac5e203245fe05Elliott Hughes exception = (Throwable) meth.invoke(exception, (Class<?>) null); 3664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 3674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (prev == exception) { 3684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson break; 3694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } else { 3714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson exception = null; 3724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } catch (InvocationTargetException ite) { 3744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson exception = null; 3754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } catch (IllegalAccessException iae) { 3764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson exception = null; 3774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } catch (NoSuchMethodException nsme) { 3784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson exception = null; 3794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 3834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson} 384