001/* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jcommon/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * ------------------- 028 * ParseException.java 029 * ------------------- 030 * (C)opyright 2003-2005, by Thomas Morgner and Contributors. 031 * 032 * Original Author: Thomas Morgner; 033 * Contributor(s): David Gilbert (for Object Refinery Limited); 034 * 035 * $Id: ParseException.java,v 1.4 2005/10/18 13:25:44 mungady Exp $ 036 * 037 * Changes 038 * ------------------------- 039 * 10.06.2003 : Initial version 040 * 041 */ 042 043package org.jfree.xml; 044 045import java.io.PrintStream; 046import java.io.PrintWriter; 047 048import org.xml.sax.Locator; 049import org.xml.sax.SAXException; 050 051/** 052 * A parse exception. 053 * 054 * @author Thomas Morgner 055 */ 056public class ParseException extends SAXException { 057 058 /** The line, where the error occured. */ 059 private int line; 060 061 /** The column, where the error occured. */ 062 private int column; 063 064 /** 065 * Creates a new ParseException with the given message. 066 * 067 * @param message the message 068 */ 069 public ParseException(final String message) { 070 super(message); 071 fillLocation(null); 072 } 073 074 /** 075 * Creates a new ParseException with the given root exception. 076 * 077 * @param e the exception 078 */ 079 public ParseException(final Exception e) { 080 super(e); 081 fillLocation(null); 082 } 083 084 /** 085 * Creates a new ParseException with the given message and root exception. 086 * 087 * @param s the message 088 * @param e the exception 089 */ 090 public ParseException(final String s, final Exception e) { 091 super(s, e); 092 fillLocation(null); 093 } 094 095 /** 096 * Creates a new ParseException with the given message and the locator. 097 * 098 * @param message the message 099 * @param locator the locator of the parser 100 */ 101 public ParseException(final String message, final Locator locator) { 102 super(message); 103 fillLocation(locator); 104 } 105 106 /** 107 * Creates a new ParseException with the given root exception 108 * and the locator. 109 * 110 * @param e the exception 111 * @param locator the locator of the parser 112 */ 113 public ParseException(final Exception e, final Locator locator) { 114 super(e); 115 fillLocation(locator); 116 } 117 118 /** 119 * Creates a new ParseException with the given message, root exception 120 * and the locator. 121 * 122 * @param s the message 123 * @param e the exception 124 * @param locator the locator of the parser 125 */ 126 public ParseException(final String s, final Exception e, final Locator locator) { 127 super(s, e); 128 fillLocation(locator); 129 } 130 131 /** 132 * Modifies the message to give more detailed location information. 133 * 134 * @return the modified exception message. 135 */ 136 public String getMessage() { 137 final StringBuffer message = new StringBuffer(String.valueOf(super.getMessage())); 138 message.append(" [Location: Line="); 139 message.append(this.line); 140 message.append(" Column="); 141 message.append(this.column); 142 message.append("] "); 143 return message.toString(); 144 } 145 146 /** 147 * Fills the location with the given locator. 148 * 149 * @param locator the locator or null. 150 */ 151 protected void fillLocation (final Locator locator) { 152 if (locator == null) { 153 this.line = -1; 154 this.column = -1; 155 } 156 else { 157 this.line = locator.getLineNumber(); 158 this.column = locator.getColumnNumber(); 159 } 160 } 161 162 /** 163 * Returns the line of the parse position where the error occured. 164 * 165 * @return the line number or -1 if not known. 166 */ 167 public int getLine() { 168 return this.line; 169 } 170 171 /** 172 * Returns the column of the parse position where the error occured. 173 * 174 * @return the column number or -1 if not known. 175 */ 176 public int getColumn() { 177 return this.column; 178 } 179 180 181 /** 182 * Prints the stack trace to the specified stream. 183 * 184 * @param stream the output stream. 185 */ 186 public void printStackTrace(final PrintStream stream) { 187 super.printStackTrace(stream); 188 if (getException() != null) { 189 stream.println("ParentException: "); 190 getException().printStackTrace(stream); 191 } 192 } 193 194 /** 195 * Override toString to pick up any embedded exception. 196 * 197 * @return A string representation of this exception. 198 */ 199 public String toString() { 200 return getClass().getName() + ": " + getMessage(); 201 } 202 203 /** 204 * Prints the stack trace to the specified writer. 205 * 206 * @param writer the writer. 207 */ 208 public void printStackTrace(final PrintWriter writer) { 209 super.printStackTrace(writer); 210 if (getException() != null) { 211 writer.println("ParentException: "); 212 getException().printStackTrace(writer); 213 } 214 } 215 216} 217