001 package com.thaiopensource.xml.sax; 002 003 import java.util.ResourceBundle; 004 import java.text.MessageFormat; 005 import java.io.PrintWriter; 006 import java.io.Writer; 007 import java.io.OutputStream; 008 import java.io.FileNotFoundException; 009 010 import org.xml.sax.ErrorHandler; 011 import org.xml.sax.SAXParseException; 012 import org.xml.sax.SAXException; 013 import com.thaiopensource.util.UriOrFile; 014 015 public class ErrorHandlerImpl implements ErrorHandler { 016 private final PrintWriter err; 017 018 private final String bundleName 019 = "com.thaiopensource.xml.sax.resources.Messages"; 020 021 private ResourceBundle bundle = null; 022 023 public ErrorHandlerImpl() { 024 this(System.err); 025 } 026 027 public ErrorHandlerImpl(OutputStream os) { 028 this.err = new PrintWriter(os); 029 } 030 031 public ErrorHandlerImpl(Writer w) { 032 this.err = new PrintWriter(w); 033 } 034 035 public void close() { 036 err.close(); 037 } 038 039 private String getString(String key) { 040 if (bundle == null) 041 bundle = ResourceBundle.getBundle(bundleName); 042 return bundle.getString(key); 043 } 044 045 private String format(String key, Object[] args) { 046 return MessageFormat.format(getString(key), args); 047 } 048 049 public void warning(SAXParseException e) throws SAXParseException { 050 print(format("warning", 051 new Object[] { formatMessage(e), formatLocation(e) })); 052 } 053 054 public void error(SAXParseException e) { 055 print(format("error", 056 new Object[] { formatMessage(e), formatLocation(e) })); 057 } 058 059 public void fatalError(SAXParseException e) throws SAXParseException { 060 throw e; 061 } 062 063 public void printException(Throwable e) { 064 String loc; 065 if (e instanceof SAXParseException) 066 loc = formatLocation((SAXParseException)e); 067 else 068 loc = ""; 069 String message; 070 if (e instanceof SAXException) 071 message = formatMessage((SAXException)e); 072 else 073 message = formatMessage(e); 074 print(format("fatal", new Object[] { message, loc })); 075 } 076 077 public void print(String message) { 078 if (message.length() != 0) { 079 err.println(message); 080 err.flush(); 081 } 082 } 083 084 private String formatLocation(SAXParseException e) { 085 String systemId = e.getSystemId(); 086 int n = e.getLineNumber(); 087 Integer lineNumber = n >= 0 ? new Integer(n) : null; 088 n = e.getColumnNumber(); 089 Integer columnNumber = n >= 0 ? new Integer(n) : null; 090 if (systemId != null) { 091 systemId = UriOrFile.uriToUriOrFile(systemId); 092 if (lineNumber != null) { 093 if (columnNumber != null) 094 return format("locator_system_id_line_number_column_number", 095 new Object[] { systemId, lineNumber, columnNumber }); 096 else 097 return format("locator_system_id_line_number", 098 new Object[] { systemId, lineNumber }); 099 } 100 else 101 return format("locator_system_id", 102 new Object[] { systemId }); 103 } 104 else if (lineNumber != null) { 105 if (columnNumber != null) 106 return format("locator_line_number_column_number", 107 new Object[] { lineNumber, columnNumber }); 108 else 109 return format("locator_line_number", 110 new Object[] { lineNumber }); 111 } 112 else 113 return ""; 114 } 115 116 private String formatMessage(SAXException se) { 117 Exception e = se.getException(); 118 String detail = se.getMessage(); 119 if (e != null) { 120 String detail2 = e.getMessage(); 121 // Crimson stupidity 122 if (detail2 == detail || e.getClass().getName().equals(detail)) 123 return formatMessage(e); 124 else if (detail2 == null) 125 return format("exception", 126 new Object[]{ e.getClass().getName(), detail }); 127 else 128 return format("tunnel_exception", 129 new Object[] { e.getClass().getName(), 130 detail, 131 detail2 }); 132 } 133 else { 134 if (detail == null) 135 detail = getString("no_detail"); 136 return detail; 137 } 138 } 139 140 private String formatMessage(Throwable e) { 141 String detail = e.getMessage(); 142 if (detail == null) 143 detail = getString("no_detail"); 144 if (e instanceof FileNotFoundException) 145 return format("file_not_found", new Object[] { detail }); 146 return format("exception", 147 new Object[] { e.getClass().getName(), detail }); 148 } 149 }