1 package org.faceless.report; 4 5 import java.util.*; 6 import java.io.*; 7 import java.net.*; 8 import javax.servlet.*; 9 import javax.servlet.http.*; 10 import org.faceless.pdf2.*; 11 import org.faceless.util.*; 12 import org.faceless.report.*; 13 import org.xml.sax.*; 14 15 68 public abstract class PDFProxyServlet extends HttpProxyServlet implements ErrorHandler 69 { 70 public void init() 71 throws ServletException 72 { 73 super.init(); 74 String license = (String )getServletConfig().getInitParameter("license"); 75 if (license!=null) { 76 org.faceless.report.ReportParser.setLicenseKey(license); 77 } 78 } 79 80 84 public HttpRequestWriter getRequest(HttpRequestReader request, HttpServletResponse response) 85 throws ServletException, IOException 86 { 87 HttpRequestWriter writer = null; 88 String url = getProxyURL(request.getUnderlyingRequest(), response); 89 if (url!=null) { 90 writer = new HttpRequestWriter(request); 91 writer.setURL(url); 92 writer.clearHeader("Accept-Encoding"); 93 } 94 return writer; 95 } 96 97 101 public HttpResponseWriter getResponse(HttpResponseReader in) 102 throws ServletException, IOException 103 { 104 HttpResponseWriter out = null; 105 106 if (in.getStatus()>=200 && in.getStatus()<=299 && in.getStatus()!=204) 111 { 112 out = new HttpResponseWriter(); 113 114 out.setStatus(in.getStatus(), in.getStatusMessage()); 119 out.setHeader("Content-Type", "application/pdf"); 120 121 InputSource xmlin = new InputSource(); 125 xmlin.setByteStream(in.getInputStream()); 126 xmlin.setSystemId(in.getURL()); 127 128 PDF pdf=null; 131 try { 132 ReportParser parser = ReportParser.getInstance((String )getServletConfig().getInitParameter("org.xml.sax.driver")); 137 initParser(parser); 138 139 parser.setMetaHandler(new MetaCallback(in, out, this)); 142 143 pdf = parser.parse(xmlin); 146 } catch (SAXException e) { 147 if (e.getException()!=null) { 148 throw new ServletException(e.getException()); 149 } else { 150 throw new ServletException(e); 151 } 152 } 153 154 pdf.render(out.getOutputStream()); 158 } 159 else 160 { 161 out = new HttpResponseWriter(in); 167 } 168 return out; 169 } 170 171 private class MetaCallback implements MetaHandler 175 { 176 private HttpResponseReader reader; 177 private HttpResponseWriter writer; 178 private PDFProxyServlet prox; 179 180 public MetaCallback(HttpResponseReader reader, HttpResponseWriter writer, PDFProxyServlet prox) 181 { 182 this.reader=reader; 183 this.writer=writer; 184 this.prox=prox; 185 } 186 187 public void handleMetaTag(String key, String val) 191 throws SAXException 192 { 193 try { 194 prox.metaTag(reader, writer, key, val); 195 } catch (Exception e) { 196 throw new SAXException(e); 197 } 198 } 199 } 200 201 202 208 217 public void metaTag(HttpResponseReader reader, HttpResponseWriter writer, String name, String value) 218 throws ServletException, IOException 219 { 220 if (name.toUpperCase().startsWith("HTTP-")) { 221 writer.setHeader(name.substring(5), value); 222 } else if (name.equalsIgnoreCase("Servlet-FileName")) { 223 writer.setHeader("Content-Disposition", "attachment; filename=\""+value+"\""); 224 } else if (name.equalsIgnoreCase("Servlet-Cache")) { 225 int len=0,s=0,e=0; 226 int[] mul = { 86400, 3600, 60, 1 }; 227 if (Character.isDigit(value.charAt(value.length()-1))) value=value+"s"; 228 try { 229 for (;e<value.length();e++) { 230 int p = "dhms".indexOf(value.charAt(e)); 231 if (p>=0) { 232 len += Integer.parseInt(value.substring(s,e)) * mul[p]; 233 s=e+1; 234 } 235 } 236 } catch (NumberFormatException ex) { 237 len=0; 238 } 239 writer.setHeader("X-Proxy-Cache-Control", "max-age="+len); 240 writer.setHeader("Cache-Control", "max-age="+len); 241 } 242 } 243 244 245 247 public void warning(SAXParseException exception) 248 throws SAXException 249 { 250 System.err.println("PDF WARNING"+(exception.getLineNumber()>=0 ? " AT "+exception.getSystemId()+" line "+exception.getLineNumber() : "")+": "+exception.getMessage()); 251 throw exception; 252 } 253 254 public void error(SAXParseException exception) 255 throws SAXException 256 { 257 System.err.println("PDF ERROR"+(exception.getLineNumber()>=0 ? " AT "+exception.getSystemId()+" line "+exception.getLineNumber() : "")+": "+exception.getMessage()); 258 throw exception; 259 } 260 261 public void fatalError(SAXParseException exception) 262 throws SAXException 263 { 264 System.err.println("PDF FATAL ERROR"+(exception.getLineNumber()>=0 ? " AT "+exception.getSystemId()+" line "+exception.getLineNumber() : "")+": "+exception.getMessage()); 265 throw exception; 266 } 267 268 274 public void initParser(ReportParser parser) 275 { 276 } 277 278 294 public abstract String getProxyURL(HttpServletRequest request, HttpServletResponse response) 295 throws IOException, ServletException; 296 } 297 | Popular Tags |