// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.io; import static org.openstreetmap.josm.tools.I18n.tr; import java.util.Optional; import javax.xml.stream.Location; import javax.xml.stream.XMLStreamException; /** * Exception for unexpected processing errors during XML stream parsing. * It uses proper JOSM i18n system to translate error message, including file location. * @since 10235 */ public class XmlStreamParsingException extends XMLStreamException { /** * Constructs a new {@code XmlStreamParsingException}. * @param msg error message * @param location file location */ public XmlStreamParsingException(String msg, Location location) { super(msg); /* cannot use super(msg, location) because it messes with the message preventing localization */ this.location = location; } /** * Constructs a new {@code XmlStreamParsingException}. * @param msg error message * @param location file location * @param th Throwable cause */ public XmlStreamParsingException(String msg, Location location, Throwable th) { super(msg, th); this.location = location; } @Override public String getMessage() { String msg = Optional.ofNullable(super.getMessage()).orElseGet(() -> getClass().getName()); if (getLocation() == null) return msg; StringBuilder sb = new StringBuilder(msg).append(' ') .append(tr("(at line {0}, column {1})", getLocation().getLineNumber(), getLocation().getColumnNumber())); int offset = getLocation().getCharacterOffset(); if (offset > -1) { sb.append(". ").append(tr("{0} bytes have been read", offset)); } return sb.toString(); } }