com.thaiopensource.xml.sax.ErrorHandlerImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of trang Show documentation
Show all versions of trang Show documentation
Trang, a multi-format schema converter based on RELAX NG.
package com.thaiopensource.xml.sax;
import java.util.ResourceBundle;
import java.text.MessageFormat;
import java.io.PrintWriter;
import java.io.Writer;
import java.io.OutputStream;
import java.io.FileNotFoundException;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXParseException;
import org.xml.sax.SAXException;
import com.thaiopensource.util.UriOrFile;
public class ErrorHandlerImpl implements ErrorHandler {
private final PrintWriter err;
private final String bundleName
= "com.thaiopensource.xml.sax.resources.Messages";
private ResourceBundle bundle = null;
public ErrorHandlerImpl() {
this(System.err);
}
public ErrorHandlerImpl(OutputStream os) {
this.err = new PrintWriter(os);
}
public ErrorHandlerImpl(Writer w) {
this.err = new PrintWriter(w);
}
public void close() {
err.close();
}
private String getString(String key) {
if (bundle == null)
bundle = ResourceBundle.getBundle(bundleName);
return bundle.getString(key);
}
private String format(String key, Object[] args) {
return MessageFormat.format(getString(key), args);
}
public void warning(SAXParseException e) throws SAXParseException {
print(format("warning",
new Object[] { formatMessage(e), formatLocation(e) }));
}
public void error(SAXParseException e) {
print(format("error",
new Object[] { formatMessage(e), formatLocation(e) }));
}
public void fatalError(SAXParseException e) throws SAXParseException {
throw e;
}
public void printException(Throwable e) {
String loc;
if (e instanceof SAXParseException)
loc = formatLocation((SAXParseException)e);
else
loc = "";
String message;
if (e instanceof SAXException)
message = formatMessage((SAXException)e);
else
message = formatMessage(e);
print(format("fatal", new Object[] { message, loc }));
}
public void print(String message) {
if (message.length() != 0) {
err.println(message);
err.flush();
}
}
private String formatLocation(SAXParseException e) {
String systemId = e.getSystemId();
int n = e.getLineNumber();
Integer lineNumber = n >= 0 ? new Integer(n) : null;
n = e.getColumnNumber();
Integer columnNumber = n >= 0 ? new Integer(n) : null;
if (systemId != null) {
systemId = UriOrFile.uriToUriOrFile(systemId);
if (lineNumber != null) {
if (columnNumber != null)
return format("locator_system_id_line_number_column_number",
new Object[] { systemId, lineNumber, columnNumber });
else
return format("locator_system_id_line_number",
new Object[] { systemId, lineNumber });
}
else
return format("locator_system_id",
new Object[] { systemId });
}
else if (lineNumber != null) {
if (columnNumber != null)
return format("locator_line_number_column_number",
new Object[] { lineNumber, columnNumber });
else
return format("locator_line_number",
new Object[] { lineNumber });
}
else
return "";
}
private String formatMessage(SAXException se) {
Exception e = se.getException();
String detail = se.getMessage();
if (e != null) {
String detail2 = e.getMessage();
// Crimson stupidity
if (detail2 == detail || e.getClass().getName().equals(detail))
return formatMessage(e);
else if (detail2 == null)
return format("exception",
new Object[]{ e.getClass().getName(), detail });
else
return format("tunnel_exception",
new Object[] { e.getClass().getName(),
detail,
detail2 });
}
else {
if (detail == null)
detail = getString("no_detail");
return detail;
}
}
private String formatMessage(Throwable e) {
String detail = e.getMessage();
if (detail == null)
detail = getString("no_detail");
if (e instanceof FileNotFoundException)
return format("file_not_found", new Object[] { detail });
return format("exception",
new Object[] { e.getClass().getName(), detail });
}
}