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