1 21 22 package com.jaspersoft.jasperserver.war; 23 24 import java.io.ByteArrayInputStream ; 25 import java.io.ByteArrayOutputStream ; 26 import java.io.IOException ; 27 import java.io.OutputStream ; 28 import java.io.PrintWriter ; 29 import java.io.StringWriter ; 30 import java.util.HashMap ; 31 import java.util.Iterator ; 32 import java.util.Map ; 33 34 import javax.servlet.ServletConfig ; 35 import javax.servlet.ServletException ; 36 import javax.servlet.http.HttpServlet ; 37 import javax.servlet.http.HttpServletRequest ; 38 import javax.servlet.http.HttpServletResponse ; 39 import javax.servlet.http.HttpSession ; 40 import javax.xml.transform.Transformer ; 41 import javax.xml.transform.dom.DOMSource ; 42 import javax.xml.transform.stream.StreamResult ; 43 44 import org.apache.avalon.framework.logger.NullLogger; 45 import org.apache.commons.logging.Log; 46 import org.apache.commons.logging.LogFactory; 47 import org.apache.fop.apps.Driver; 48 import org.apache.fop.apps.FOPException; 49 import org.w3c.dom.Document ; 50 import org.xml.sax.InputSource ; 51 52 import com.tonbeller.jpivot.chart.ChartComponent; 53 import com.tonbeller.jpivot.print.PrintComponent; 54 import com.tonbeller.jpivot.table.TableComponent; 55 import com.tonbeller.wcf.component.RendererParameters; 56 import com.tonbeller.wcf.controller.RequestContext; 57 import com.tonbeller.wcf.controller.RequestContextFactoryFinder; 58 import com.tonbeller.wcf.utils.XmlUtils; 59 60 68 public class OlapPrint extends HttpServlet { 69 70 private static final Log logger = LogFactory.getLog(OlapPrint.class); 71 72 private static int XLS = 0; 73 private static int PDF = 1; 74 String filename; 75 76 79 public OlapPrint() { 80 super(); 81 } 82 83 85 public void init(ServletConfig config) throws ServletException { 86 super.init(config); 87 93 } 94 95 97 public void destroy() { 98 99 } 100 101 106 107 protected void processRequest(RequestContext context) throws ServletException , IOException { 108 HttpServletRequest request = context.getRequest(); 109 HttpServletResponse response = context.getResponse(); 110 HttpSession session = request.getSession(); 111 112 String type = request.getParameter("type"); 113 int identifiedType = -1; 114 boolean xslCache = true; 115 116 String view = request.getParameter("view"); 117 118 if (view == null || type == null) { 119 throw new ServletException ("view and type parameters not supplied"); 120 } 121 122 try { 123 String xslUri = null; 124 if (type.equalsIgnoreCase("XLS")) { 125 xslUri = "/WEB-INF/jpivot/table/xls_mdxtable.xsl"; 126 RendererParameters.setParameter(context.getRequest(), "mode", "excel", "request"); 127 response.setContentType("application/vnd.ms-excel"); 128 filename = "xls_export.xls"; 129 identifiedType = XLS; 130 } else if (type.equalsIgnoreCase("PDF")) { 131 xslUri = "/WEB-INF/jpivot/table/fo_mdxtable.xsl"; 132 RendererParameters.setParameter(context.getRequest(), "mode", "print", "request"); 133 response.setContentType("application/pdf"); 134 filename = "xls_export.pdf"; 135 identifiedType = PDF; 136 } else { 137 throw new ServletException ("Unknown file type: " + type); 138 } 139 140 141 144 String tableRef = view + "/table"; 145 String chartRef = view + "/chart"; 146 String printRef = view + "/print"; 147 148 TableComponent table = (TableComponent) context.getModelReference(tableRef); 150 if (table == null) { 152 return; 153 } 154 155 Map parameters = getPrintParameters(printRef, context); 156 parameters.putAll(getChartParameters(chartRef, request)); 157 158 161 parameters.put("context", context.getRequest().getContextPath()); 163 164 167 169 StringWriter sw = getRenderedTableDOM(table, parameters, session, context, xslUri, xslCache); 170 171 OutputStream outStream = response.getOutputStream(); 172 PrintWriter out = new PrintWriter (outStream); 173 174 response.setHeader("Content-Disposition", "attachment; filename=" + filename); 176 177 if (identifiedType == XLS) { 179 logger.debug("Creating XLS"); 180 response.setContentLength(sw.toString().length()); 181 out.write(sw.toString()); 182 RendererParameters.removeParameter(context.getRequest(), "mode", "excel", "request"); 183 } else { 184 logger.debug("Creating PDF"); 186 try { 187 ByteArrayInputStream bain = new ByteArrayInputStream (sw.toString() 188 .getBytes("UTF-8")); 189 ByteArrayOutputStream baout = new ByteArrayOutputStream (16384); 190 convertFO2PDF(bain, baout); 192 final byte[] content = baout.toByteArray(); 193 response.setContentLength(content.length); 194 outStream.write(content); 195 RendererParameters 196 .removeParameter(context.getRequest(), "mode", "print", "request"); 197 } catch (Exception e) { 198 logger.error(e); 199 } 200 } 201 202 out.flush(); 204 out.close(); 205 outStream.flush(); 206 207 } catch (Exception e) { 208 logger.error(e); 209 throw new ServletException (e); 210 } 211 } 212 213 221 private Map getPrintParameters(String printRef, RequestContext context) { 222 Map parameters = new HashMap (); 223 224 PrintComponent printConfig = (PrintComponent) context.getModelReference(printRef); 226 if (printConfig == null) { 227 return parameters; 228 } 229 if (printConfig.isSetTableWidth()) { 230 parameters.put(printConfig.PRINT_TABLE_WIDTH, new Double (printConfig 231 .getTableWidth())); 232 } 233 if (printConfig.getReportTitle().trim().length() != 0) { 234 parameters.put(printConfig.PRINT_TITLE, printConfig.getReportTitle().trim()); 235 } 236 parameters.put(printConfig.PRINT_PAGE_ORIENTATION, printConfig.getPageOrientation()); 237 parameters.put(printConfig.PRINT_PAPER_TYPE, printConfig.getPaperType()); 238 if (printConfig.getPaperType().equals("custom")) { 239 parameters 240 .put(printConfig.PRINT_PAGE_WIDTH, new Double (printConfig.getPageWidth())); 241 parameters.put(printConfig.PRINT_PAGE_HEIGHT, new Double (printConfig 242 .getPageHeight())); 243 } 244 parameters.put(printConfig.PRINT_CHART_PAGEBREAK, new Boolean (printConfig 245 .isChartPageBreak())); 246 247 return parameters; 248 } 249 250 257 private Map getChartParameters(String chartRef, HttpServletRequest request) { 258 Map parameters = new HashMap (); 259 260 ChartComponent chart = (ChartComponent) request.getSession().getAttribute(chartRef); 262 if (chart == null || !chart.isVisible()) { 263 return parameters; 264 } 265 266 String host = request.getServerName(); 267 int port = request.getServerPort(); 268 String location = request.getContextPath(); 269 String scheme = request.getScheme(); 270 271 String chartServlet = scheme + "://" + host + ":" + port + location + "/GetChart"; 272 parameters.put("chartimage", chartServlet + "?filename=" + chart.getFilename()); 273 parameters.put("chartheight", new Integer (chart.getChartHeight())); 274 parameters.put("chartwidth", new Integer (chart.getChartWidth())); 275 return parameters; 276 } 277 278 290 private StringWriter getRenderedTableDOM(TableComponent table, 291 Map parameters, 292 HttpSession session, 293 RequestContext context, 294 String xslUri, 295 boolean xslCache) throws Exception { 296 297 table.setDirty(true); 298 Document document = table.render(context); 299 table.setDirty(true); 300 301 DOMSource source = new DOMSource (document); 302 Transformer transformer = XmlUtils.getTransformer(session, xslUri, xslCache); 304 for (Iterator it = parameters.keySet().iterator(); it.hasNext();) { 305 String name = (String ) it.next(); 306 Object value = parameters.get(name); 307 transformer.setParameter(name, value); 308 } 309 StringWriter sw = new StringWriter (); 310 StreamResult result = new StreamResult (sw); 311 transformer.transform(source, result); 313 sw.flush(); 314 315 return sw; 316 317 } 318 319 322 public void convertFO2PDF(ByteArrayInputStream bain, ByteArrayOutputStream baout) 323 throws IOException , FOPException { 324 325 logger.debug("Construct driver"); 326 Driver driver = new Driver(); 327 driver.setLogger(new NullLogger()); 328 329 logger.debug("Setup Renderer (output format)"); 330 driver.setRenderer(Driver.RENDER_PDF); 331 332 driver.setOutputStream(baout); 333 logger.debug("Setup input"); 334 driver.setInputSource(new InputSource (bain)); 335 336 logger.debug("Process FO"); 337 driver.run(); 338 logger.debug("PDF file generation completed"); 339 } 340 341 345 protected void doGet(HttpServletRequest request, HttpServletResponse response) 346 throws ServletException , IOException { 347 doPost(request, response); 348 } 349 350 354 protected void doPost(HttpServletRequest request, HttpServletResponse response) 355 throws ServletException , IOException { 356 RequestContext context = RequestContextFactoryFinder.createContext(request, response, true); 357 try { 358 processRequest(context); 359 } finally { 360 context.invalidate(); 361 } 362 } 363 364 366 public String getServletInfo() { 367 return "Export OLAP table to Excel or PDF"; 368 } 369 370 } 371 | Popular Tags |