19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: XPathException.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class implements an exception object that all 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * XPath classes will throw in case of an error. This class 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * extends TransformerException, and may hold other exceptions. In the 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * case of nested exceptions, printStackTrace will dump 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * all the traces of the nested exceptions, not just the trace 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of this object. 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage general 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class XPathException extends TransformerException 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = 4263549717619045963L; 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The home of the expression that caused the error. 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object m_styleNode = null; 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the stylesheet node from where this error originated. 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The stylesheet node from where this error originated, or null. 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Object getStylesheetNode() 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_styleNode; 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the stylesheet node from where this error originated. 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param styleNode The stylesheet node from where this error originated, or null. 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setStylesheetNode(Object styleNode) 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_styleNode = styleNode; 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** A nested exception. 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected Exception m_exception; 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create an XPathException object that holds 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * an error message. 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param message The error message. 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XPathException(String message, ExpressionNode ex) 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(message); 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.setLocator(ex); 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setStylesheetNode(getStylesheetNode(ex)); 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create an XPathException object that holds 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * an error message. 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param message The error message. 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XPathException(String message) 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(message); 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the XSLT ElemVariable that this sub-expression references. In order for 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this to work, the SourceLocator must be the owning ElemTemplateElement. 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The dereference to the ElemVariable, or null if not found. 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public org.w3c.dom.Node getStylesheetNode(ExpressionNode ex) 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ExpressionNode owner = getExpressionOwner(ex); 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != owner && owner instanceof org.w3c.dom.Node) 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return ((org.w3c.dom.Node)owner); 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the first non-Expression parent of this node. 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return null or first ancestor that is not an Expression. 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected ExpressionNode getExpressionOwner(ExpressionNode ex) 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ExpressionNode parent = ex.exprGetParent(); 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while((null != parent) && (parent instanceof Expression)) 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson parent = parent.exprGetParent(); 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return parent; 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create an XPathException object that holds 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * an error message and the stylesheet node that 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the error originated from. 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param message The error message. 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param styleNode The stylesheet node that the error originated from. 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XPathException(String message, Object styleNode) 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(message); 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_styleNode = styleNode; 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create an XPathException object that holds 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * an error message, the stylesheet node that 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the error originated from, and another exception 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * that caused this exception. 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param message The error message. 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param styleNode The stylesheet node that the error originated from. 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param e The exception that caused this exception. 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XPathException(String message, Node styleNode, Exception e) 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(message); 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_styleNode = styleNode; 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_exception = e; 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create an XPathException object that holds 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * an error message, and another exception 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * that caused this exception. 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param message The error message. 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param e The exception that caused this exception. 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XPathException(String message, Exception e) 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(message); 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.m_exception = e; 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Print the the trace of methods from where the error 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * originated. This will trace all nested exception 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * objects, as well as this object. 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param s The stream where the dump will be sent to. 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void printStackTrace(java.io.PrintStream s) 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (s == null) 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson s = System.err; 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.printStackTrace(s); 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e){} 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Throwable exception = m_exception; 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; (i < 10) && (null != exception); i++) 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson s.println("---------"); 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception.printStackTrace(s); 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (exception instanceof TransformerException) 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson TransformerException se = (TransformerException) exception; 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Throwable prev = exception; 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception = se.getException(); 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (prev == exception) 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception = null; 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Find the most contained message. 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The error message of the originating exception. 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getMessage() 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String lastMessage = super.getMessage(); 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Throwable exception = m_exception; 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (null != exception) 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String nextMessage = exception.getMessage(); 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != nextMessage) 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lastMessage = nextMessage; 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (exception instanceof TransformerException) 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson TransformerException se = (TransformerException) exception; 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Throwable prev = exception; 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception = se.getException(); 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (prev == exception) 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception = null; 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null != lastMessage) ? lastMessage : ""; 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Print the the trace of methods from where the error 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * originated. This will trace all nested exception 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * objects, as well as this object. 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param s The writer where the dump will be sent to. 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void printStackTrace(java.io.PrintWriter s) 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (s == null) 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson s = new java.io.PrintWriter(System.err); 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.printStackTrace(s); 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e){} 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean isJdk14OrHigher = false; 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try { 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Throwable.class.getMethod("getCause", (Class<?>) null); 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson isJdk14OrHigher = true; 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } catch (NoSuchMethodException nsme) { 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // do nothing 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The printStackTrace method of the Throwable class in jdk 1.4 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // and higher will include the cause when printing the backtrace. 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The following code is only required when using jdk 1.3 or lower 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!isJdk14OrHigher) { 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Throwable exception = m_exception; 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; (i < 10) && (null != exception); i++) 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson s.println("---------"); 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception.printStackTrace(s); 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson s.println("Could not print stack trace..."); 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (exception instanceof TransformerException) 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson TransformerException se = (TransformerException) exception; 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Throwable prev = exception; 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception = se.getException(); 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (prev == exception) 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception = null; 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exception = null; 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the embedded exception, if any. 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Overrides javax.xml.transform.TransformerException.getException(). 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The embedded exception, or null if there is none. 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Throwable getException() 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_exception; 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 329