1 58 package org.krysalis.barcode.webapp; 59 60 import java.io.ByteArrayOutputStream ; 61 import java.io.IOException ; 62 63 import javax.servlet.ServletException ; 64 import javax.servlet.http.HttpServlet ; 65 import javax.servlet.http.HttpServletRequest ; 66 import javax.servlet.http.HttpServletResponse ; 67 import javax.xml.transform.Result ; 68 import javax.xml.transform.Source ; 69 import javax.xml.transform.TransformerFactory ; 70 import javax.xml.transform.sax.SAXTransformerFactory ; 71 import javax.xml.transform.sax.TransformerHandler ; 72 import javax.xml.transform.stream.StreamSource ; 73 74 import org.xml.sax.ContentHandler ; 75 import org.xml.sax.SAXException ; 76 import org.xml.sax.helpers.AttributesImpl ; 77 78 import org.apache.avalon.framework.CascadingException; 79 import org.apache.avalon.framework.logger.ConsoleLogger; 80 import org.apache.avalon.framework.logger.Logger; 81 82 87 public class BarcodeErrorServlet extends HttpServlet { 88 89 private Logger log = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); 90 91 94 protected void doGet(HttpServletRequest request, HttpServletResponse response) 95 throws ServletException , IOException { 96 97 Throwable t = (Throwable )request.getAttribute("javax.servlet.error.exception"); 98 try { 99 SAXTransformerFactory factory = (SAXTransformerFactory )TransformerFactory.newInstance(); 100 java.net.URL xslt = getServletContext().getResource("/WEB-INF/exception2svg.xslt"); 101 TransformerHandler thandler; 102 if (xslt != null) { 103 log.debug(xslt.toExternalForm()); 104 Source xsltSource = new StreamSource (xslt.toExternalForm()); 105 thandler = factory.newTransformerHandler(xsltSource); 106 response.setContentType("image/svg+xml"); 107 } else { 108 log.error("Exception stylesheet not found, sending back raw XML"); 109 thandler = factory.newTransformerHandler(); 110 response.setContentType("application/xml"); 111 } 112 113 ByteArrayOutputStream bout = new ByteArrayOutputStream (4096); 114 try { 115 Result res = new javax.xml.transform.stream.StreamResult (bout); 116 thandler.setResult(res); 117 generateSAX(t, thandler); 118 } finally { 119 bout.close(); 120 } 121 122 response.setContentLength(bout.size()); 123 response.getOutputStream().write(bout.toByteArray()); 124 response.getOutputStream().flush(); 125 } catch (Exception e) { 126 log.error("Error in error servlet", e); 127 throw new ServletException (e); 128 } 129 } 130 131 private void generateSAX(Throwable t, ContentHandler handler) throws SAXException { 132 if (t == null) { 133 throw new NullPointerException ("Throwable must not be null"); 134 } 135 if (handler == null) { 136 throw new NullPointerException ("ContentHandler not set"); 137 } 138 139 handler.startDocument(); 140 generateSAXForException(t, handler, "exception"); 141 handler.endDocument(); 142 } 143 144 private void generateSAXForException(Throwable t, 145 ContentHandler handler, String elName) throws SAXException { 146 AttributesImpl attr = new AttributesImpl (); 147 attr.addAttribute(null, "classname", "classname", "CDATA", t.getClass().getName()); 148 handler.startElement(null, elName, elName, attr); 149 attr.clear(); 150 handler.startElement(null, "msg", "msg", attr); 151 char[] chars = t.getMessage().toCharArray(); 152 handler.characters(chars, 0, chars.length); 153 handler.endElement(null, "msg", "msg"); 154 155 if (t instanceof CascadingException) { 156 Throwable nested = ((CascadingException)t).getCause(); 157 generateSAXForException(nested, handler, "nested"); 158 } 159 160 handler.endElement(null, elName, elName); 161 } 162 } 163 | Popular Tags |