001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.tools;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import org.xml.sax.Locator;
007import org.xml.sax.SAXException;
008
009/**
010 * An exception thrown during XML parsing, with known line and column.
011 * @since 6906
012 */
013public class XmlParsingException extends SAXException {
014    private int columnNumber;
015    private int lineNumber;
016
017    /**
018     * Constructs a new {@code XmlParsingException}.
019     * @param e The cause
020     */
021    public XmlParsingException(Exception e) {
022        super(e);
023    }
024
025    /**
026     * Constructs a new {@code XmlParsingException}.
027     * @param message The error message
028     * @param e The cause
029     */
030    public XmlParsingException(String message, Exception e) {
031        super(message, e);
032    }
033
034    /**
035     * Constructs a new {@code XmlParsingException}.
036     * @param message The error message
037     */
038    public XmlParsingException(String message) {
039        super(message);
040    }
041
042    /**
043     * Sets the location (line/column) where the exception occured.
044     * @param locator object giving the location (line/column) where the exception occured
045     * @return {@code this}
046     */
047    public XmlParsingException rememberLocation(Locator locator) {
048        if (locator != null) {
049            this.columnNumber = locator.getColumnNumber();
050            this.lineNumber = locator.getLineNumber();
051        }
052        return this;
053    }
054
055    @Override
056    public String getMessage() {
057        String msg = super.getMessage();
058        if (lineNumber == 0 && columnNumber == 0)
059            return msg;
060        if (msg == null) {
061            msg = getClass().getName();
062        }
063        msg = msg + " " + tr("(at line {0}, column {1})", lineNumber, columnNumber);
064        return msg;
065    }
066
067    /**
068     * Returns the column number where the exception occured.
069     * @return the column number where the exception occured
070     */
071    public int getColumnNumber() {
072        return columnNumber;
073    }
074
075    /**
076     * Returns the line number where the exception occured.
077     * @return the line number where the exception occured
078     */
079    public int getLineNumber() {
080        return lineNumber;
081    }
082}