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