1 20 package org.openi.report; 21 22 import com.tonbeller.jpivot.chart.ChartComponent; 23 import com.tonbeller.jpivot.print.PrintComponent; 24 import com.tonbeller.jpivot.table.TableComponent; 25 import com.tonbeller.wcf.component.RendererParameters; 26 import com.tonbeller.wcf.controller.RequestContext; 27 import com.tonbeller.wcf.controller.RequestContextFactoryFinder; 28 import com.tonbeller.wcf.utils.XmlUtils; 29 import org.apache.fop.apps.Driver; 30 import org.apache.fop.apps.FOPException; 31 import org.openi.analysis.Analysis; 32 import org.openi.project.Project; 33 import org.openi.project.ProjectContext; 34 import org.w3c.dom.Document ; 35 import org.xml.sax.InputSource ; 36 import java.io.ByteArrayInputStream ; 37 import java.io.ByteArrayOutputStream ; 38 import java.io.IOException ; 39 import java.io.OutputStream ; 40 import java.io.PrintWriter ; 41 import java.io.StringWriter ; 42 import java.util.HashMap ; 43 import java.util.Iterator ; 44 import java.util.Map ; 45 import javax.servlet.ServletConfig ; 46 import javax.servlet.ServletException ; 47 import javax.servlet.http.HttpServlet ; 48 import javax.servlet.http.HttpServletRequest ; 49 import javax.servlet.http.HttpServletResponse ; 50 import javax.servlet.http.HttpSession ; 51 import javax.xml.transform.Transformer ; 52 import javax.xml.transform.dom.DOMSource ; 53 import javax.xml.transform.stream.StreamResult ; 54 55 56 public class EnhancedPrintServlet extends HttpServlet { 57 private static final int XML = 0; 58 private static final int PDF = 1; 59 String basePath; 60 String filename; 61 62 64 public void init(ServletConfig config) throws ServletException { 65 super.init(config); 66 } 67 68 70 public void destroy() { 71 } 72 73 77 protected void processRequest(RequestContext context) 78 throws ServletException , IOException { 79 HttpServletRequest request = context.getRequest(); 80 HttpServletResponse response = context.getResponse(); 81 82 if ((request.getParameter("cube") != null) 83 && (request.getParameter("type") != null)) { 84 try { 85 String xslUri = null; 86 int type = Integer.parseInt(request.getParameter("type")); 87 88 switch (type) { 89 case XML: 90 xslUri = "/WEB-INF/openi/table/xls_mdxtable.xsl"; 91 RendererParameters.setParameter(context.getRequest(), 92 "mode", "excel", "request"); 93 response.setContentType("application/vnd.ms-excel"); 94 filename = "xls_export.xls"; 95 96 break; 97 98 case PDF: 99 xslUri = "/WEB-INF/openi/table/fo_mdxtable.xsl"; 100 RendererParameters.setParameter(context.getRequest(), 101 "mode", "print", "request"); 102 response.setContentType("application/pdf"); 103 filename = "xls_export.pdf"; 104 105 break; 106 } 107 108 if (xslUri != null) { 109 boolean xslCache = true; 110 111 String tableRef = "table" + request.getParameter("cube"); 113 String chartRef = "chart" + request.getParameter("cube"); 114 String printRef = "print" + request.getParameter("cube"); 115 116 Map parameters = new HashMap (); 117 118 OutputStream outStream = response.getOutputStream(); 119 PrintWriter out = new PrintWriter (outStream); 120 HttpSession session = request.getSession(); 121 response.setHeader("Content-Disposition", 123 "attachment; filename=" + filename); 124 125 TableComponent table = (TableComponent) context 127 .getModelReference(tableRef); 128 129 if (table != null) { 131 PrintComponent printConfig = (PrintComponent) context 133 .getModelReference(printRef); 134 135 if (printConfig != null) { 136 if (printConfig.isSetTableWidth()) { 137 parameters.put(printConfig.PRINT_TABLE_WIDTH, 138 new Double (printConfig.getTableWidth())); 139 } 140 141 parameters.put(printConfig.PRINT_PAGE_ORIENTATION, 145 printConfig.getPageOrientation()); 146 parameters.put(printConfig.PRINT_PAPER_TYPE, 147 printConfig.getPaperType()); 148 149 if (printConfig.getPaperType().equals("custom")) { 150 parameters.put(printConfig.PRINT_PAGE_WIDTH, 151 new Double (printConfig.getPageWidth())); 152 parameters.put(printConfig.PRINT_PAGE_HEIGHT, 153 new Double (printConfig.getPageHeight())); 154 } 155 156 parameters.put(printConfig.PRINT_CHART_PAGEBREAK, 157 new Boolean (printConfig.isChartPageBreak())); 158 } 159 160 ChartComponent chart = (ChartComponent) request.getSession() 162 .getAttribute(chartRef); 163 164 if ((chart != null) && chart.isVisible()) { 165 String host = request.getServerName(); 166 int port = request.getServerPort(); 167 String location = request.getContextPath(); 168 169 String chartServlet = "http://" + host + ":" 170 + port + location + "/GetChart"; 171 parameters.put("chartimage", 172 chartServlet + "?filename=" 173 + chart.getFilename()); 174 parameters.put("chartheight", 175 new Integer (chart.getChartHeight())); 176 parameters.put("chartwidth", 177 new Integer (chart.getChartWidth())); 178 } 179 180 Project project = ((ProjectContext) session 181 .getAttribute("projectContext")).getProject(); 182 String headerText; 183 headerText = project.getProjectName(); 184 headerText += " - "; 185 headerText += ((Analysis) session.getAttribute( 186 "analysis01")).getAnalysisTitle(); 187 parameters.put("pageHeaderText", headerText); 188 parameters.put(printConfig.PRINT_TITLE, 189 headerText); 190 192 parameters.put("context", 195 context.getRequest().getContextPath()); 196 197 table.setDirty(true); 200 201 Document document = table.render(context); 202 table.setDirty(true); 203 204 DOMSource source = new DOMSource (document); 205 206 Transformer transformer = XmlUtils 208 .getTransformer(session, xslUri, 209 xslCache); 210 211 for (Iterator it = parameters.keySet() 212 .iterator(); 213 it.hasNext();) { 214 String name = (String ) it.next(); 215 Object value = parameters.get(name); 216 transformer.setParameter(name, value); 217 } 218 219 StringWriter sw = new StringWriter (); 220 StreamResult result = new StreamResult (sw); 221 transformer.transform(source, result); 223 sw.flush(); 224 225 if (type == XML) { 227 System.out.println("Writing XLS"); 228 response.setContentLength(sw.toString() 229 .length()); 230 out.write(sw.toString()); 231 RendererParameters.removeParameter(context 232 .getRequest(), "mode", "excel", 233 "request"); 234 235 } else { 237 System.out.println("Creating PDF!"); 239 240 try { 241 ByteArrayInputStream bain = new ByteArrayInputStream (sw.toString() 242 .getBytes("UTF-8")); 243 ByteArrayOutputStream baout = new ByteArrayOutputStream (16384); 244 convertFO2PDF(bain, baout); 245 246 final byte[] content = baout 247 .toByteArray(); 248 response.setContentLength(content.length); 249 outStream.write(content); 250 RendererParameters 251 .removeParameter(context 252 .getRequest(), 253 "mode", "print", 254 "request"); 255 256 } catch (Exception e) { 258 e.printStackTrace(); 259 } 260 } 261 262 out.flush(); 264 out.close(); 265 outStream.flush(); 266 } 267 } 268 } catch (Exception e) { 269 e.printStackTrace(); 270 } 271 } 272 } 273 274 277 public void convertFO2PDF( 278 ByteArrayInputStream bain, 279 ByteArrayOutputStream baout) 280 throws IOException , FOPException { 281 System.out.println("Construct driver"); 282 283 Driver driver = new Driver(); 284 285 System.out.println( 286 "Setup Renderer (output format)"); 287 driver.setRenderer(Driver.RENDER_PDF); 288 289 try { 290 driver.setOutputStream(baout); 291 System.out.println("Setup input"); 292 293 try { 294 driver.setInputSource(new InputSource ( 295 bain)); 296 297 System.out.println("Process FO"); 298 driver.run(); 299 System.out.println( 300 "PDF file generation completed"); 301 } finally { 302 } 303 } finally { 304 } 305 } 306 307 311 protected void doGet(HttpServletRequest request, 312 HttpServletResponse response) 313 throws ServletException , IOException { 314 doPost(request, response); 315 } 316 317 321 protected void doPost(HttpServletRequest request, 322 HttpServletResponse response) 323 throws ServletException , IOException { 324 RequestContext context = RequestContextFactoryFinder 325 .createContext(request, response, true); 326 327 try { 328 processRequest(context); 329 } finally { 330 context.invalidate(); 331 } 332 } 333 334 336 public String getServletInfo() { 337 return "Export OLAP table"; 338 } 339 } 340 | Popular Tags |