001: /*********************************************************************************
002: * The contents of this file are subject to the OpenI Public License Version 1.0
003: * ("License"); You may not use this file except in compliance with the
004: * License. You may obtain a copy of the License at
005: * http://www.openi.org/docs/LICENSE.txt
006: *
007: * Software distributed under the License is distributed on an "AS IS" basis,
008: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
009: * the specific language governing rights and limitations under the License.
010: *
011: * The Original Code is: OpenI Open Source
012: *
013: * The Initial Developer of the Original Code is Loyalty Matrix, Inc.
014: * Portions created by Loyalty Matrix, Inc. are
015: * Copyright (C) 2005 Loyalty Matrix, Inc.; All Rights Reserved.
016: *
017: * Contributor(s): ______________________________________.
018: *
019: ********************************************************************************/package org.openi.report;
020:
021: import com.tonbeller.jpivot.chart.ChartComponent;
022: import com.tonbeller.jpivot.print.PrintComponent;
023: import com.tonbeller.jpivot.table.TableComponent;
024: import com.tonbeller.wcf.component.RendererParameters;
025: import com.tonbeller.wcf.controller.RequestContext;
026: import com.tonbeller.wcf.controller.RequestContextFactoryFinder;
027: import com.tonbeller.wcf.utils.XmlUtils;
028: import org.apache.fop.apps.Driver;
029: import org.apache.fop.apps.FOPException;
030: import org.openi.analysis.Analysis;
031: import org.openi.project.Project;
032: import org.openi.project.ProjectContext;
033: import org.w3c.dom.Document;
034: import org.xml.sax.InputSource;
035: import java.io.ByteArrayInputStream;
036: import java.io.ByteArrayOutputStream;
037: import java.io.IOException;
038: import java.io.OutputStream;
039: import java.io.PrintWriter;
040: import java.io.StringWriter;
041: import java.util.HashMap;
042: import java.util.Iterator;
043: import java.util.Map;
044: import javax.servlet.ServletConfig;
045: import javax.servlet.ServletException;
046: import javax.servlet.http.HttpServlet;
047: import javax.servlet.http.HttpServletRequest;
048: import javax.servlet.http.HttpServletResponse;
049: import javax.servlet.http.HttpSession;
050: import javax.xml.transform.Transformer;
051: import javax.xml.transform.dom.DOMSource;
052: import javax.xml.transform.stream.StreamResult;
053:
054: public class EnhancedPrintServlet extends HttpServlet {
055: private static final int XML = 0;
056: private static final int PDF = 1;
057: String basePath;
058: String filename;
059:
060: /** Initializes the servlet.
061: */
062: public void init(ServletConfig config) throws ServletException {
063: super .init(config);
064: }
065:
066: /** Destroys the servlet.
067: */
068: public void destroy() {
069: }
070:
071: /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
072: * @param request servlet request
073: * @param response servlet response
074: */
075: protected void processRequest(RequestContext context)
076: throws ServletException, IOException {
077: HttpServletRequest request = context.getRequest();
078: HttpServletResponse response = context.getResponse();
079:
080: if ((request.getParameter("cube") != null)
081: && (request.getParameter("type") != null)) {
082: try {
083: String xslUri = null;
084: int type = Integer.parseInt(request
085: .getParameter("type"));
086:
087: switch (type) {
088: case XML:
089: xslUri = "/WEB-INF/openi/table/xls_mdxtable.xsl";
090: RendererParameters.setParameter(context
091: .getRequest(), "mode", "excel", "request");
092: response.setContentType("application/vnd.ms-excel");
093: filename = "xls_export.xls";
094:
095: break;
096:
097: case PDF:
098: xslUri = "/WEB-INF/openi/table/fo_mdxtable.xsl";
099: RendererParameters.setParameter(context
100: .getRequest(), "mode", "print", "request");
101: response.setContentType("application/pdf");
102: filename = "xls_export.pdf";
103:
104: break;
105: }
106:
107: if (xslUri != null) {
108: boolean xslCache = true;
109:
110: // get references to needed elements
111: String tableRef = "table"
112: + request.getParameter("cube");
113: String chartRef = "chart"
114: + request.getParameter("cube");
115: String printRef = "print"
116: + request.getParameter("cube");
117:
118: Map parameters = new HashMap();
119:
120: OutputStream outStream = response.getOutputStream();
121: PrintWriter out = new PrintWriter(outStream);
122: HttpSession session = request.getSession();
123: // set up filename for download.
124: response.setHeader("Content-Disposition",
125: "attachment; filename=" + filename);
126:
127: // get TableComponent
128: TableComponent table = (TableComponent) context
129: .getModelReference(tableRef);
130:
131: // only proceed if table component exists
132: if (table != null) {
133: // add parameters from printConfig
134: PrintComponent printConfig = (PrintComponent) context
135: .getModelReference(printRef);
136:
137: if (printConfig != null) {
138: if (printConfig.isSetTableWidth()) {
139: parameters.put(
140: printConfig.PRINT_TABLE_WIDTH,
141: new Double(printConfig
142: .getTableWidth()));
143: }
144:
145: // if (printConfig.getReportTitle().trim().length() != 0) {
146: // parameters.put(printConfig.PRINT_TITLE, printConfig.getReportTitle().trim());
147: // }
148: parameters.put(
149: printConfig.PRINT_PAGE_ORIENTATION,
150: printConfig.getPageOrientation());
151: parameters.put(
152: printConfig.PRINT_PAPER_TYPE,
153: printConfig.getPaperType());
154:
155: if (printConfig.getPaperType().equals(
156: "custom")) {
157: parameters.put(
158: printConfig.PRINT_PAGE_WIDTH,
159: new Double(printConfig
160: .getPageWidth()));
161: parameters.put(
162: printConfig.PRINT_PAGE_HEIGHT,
163: new Double(printConfig
164: .getPageHeight()));
165: }
166:
167: parameters.put(
168: printConfig.PRINT_CHART_PAGEBREAK,
169: new Boolean(printConfig
170: .isChartPageBreak()));
171: }
172:
173: // add parameters and image from chart if visible
174: ChartComponent chart = (ChartComponent) request
175: .getSession().getAttribute(chartRef);
176:
177: if ((chart != null) && chart.isVisible()) {
178: String host = request.getServerName();
179: int port = request.getServerPort();
180: String location = request.getContextPath();
181:
182: String chartServlet = "http://" + host
183: + ":" + port + location
184: + "/GetChart";
185: parameters.put("chartimage", chartServlet
186: + "?filename="
187: + chart.getFilename());
188: parameters.put("chartheight", new Integer(
189: chart.getChartHeight()));
190: parameters.put("chartwidth", new Integer(
191: chart.getChartWidth()));
192: }
193:
194: Project project = ((ProjectContext) session
195: .getAttribute("projectContext"))
196: .getProject();
197: String headerText;
198: headerText = project.getProjectName();
199: headerText += " - ";
200: headerText += ((Analysis) session
201: .getAttribute("analysis01"))
202: .getAnalysisTitle();
203: parameters.put("pageHeaderText", headerText);
204: parameters.put(printConfig.PRINT_TITLE,
205: headerText);
206: // parameters.put("pageFooterText",project.getReportFooter()!=null?project.getReportFooter():"");
207:
208: //parameters.put("message",table.getReportTitle());
209: // add "context" and "renderId" to parameter map
210: parameters.put("context", context.getRequest()
211: .getContextPath());
212:
213: // Some FOP-PDF versions require a complete URL, not a path
214: //parameters.put("contextUrl", createContextURLValue(context));
215: table.setDirty(true);
216:
217: Document document = table.render(context);
218: table.setDirty(true);
219:
220: DOMSource source = new DOMSource(document);
221:
222: // set up xml transformation
223: Transformer transformer = XmlUtils
224: .getTransformer(session, xslUri,
225: xslCache);
226:
227: for (Iterator it = parameters.keySet()
228: .iterator(); it.hasNext();) {
229: String name = (String) it.next();
230: Object value = parameters.get(name);
231: transformer.setParameter(name, value);
232: }
233:
234: StringWriter sw = new StringWriter();
235: StreamResult result = new StreamResult(sw);
236: //do transform
237: transformer.transform(source, result);
238: sw.flush();
239:
240: // if thisis XML, then we are done, so output xml file.
241: if (type == XML) {
242: System.out.println("Writing XLS");
243: response.setContentLength(sw.toString()
244: .length());
245: out.write(sw.toString());
246: RendererParameters.removeParameter(context
247: .getRequest(), "mode", "excel",
248: "request");
249:
250: // process FO to PDF
251: } else {
252: // if this is PDF, then need to generate PDF from the FO xml
253: System.out.println("Creating PDF!");
254:
255: try {
256: ByteArrayInputStream bain = new ByteArrayInputStream(
257: sw.toString().getBytes("UTF-8"));
258: ByteArrayOutputStream baout = new ByteArrayOutputStream(
259: 16384);
260: convertFO2PDF(bain, baout);
261:
262: final byte[] content = baout
263: .toByteArray();
264: response
265: .setContentLength(content.length);
266: outStream.write(content);
267: RendererParameters.removeParameter(
268: context.getRequest(), "mode",
269: "print", "request");
270:
271: //convertXML2PDF(document.toString(), xslUri, outStream);
272: } catch (Exception e) {
273: e.printStackTrace();
274: }
275: }
276:
277: //close output streams
278: out.flush();
279: out.close();
280: outStream.flush();
281: }
282: }
283: } catch (Exception e) {
284: e.printStackTrace();
285: }
286: }
287: }
288:
289: /**
290: * converts FO xml into PDF using the FOP processor
291: */
292: public void convertFO2PDF(ByteArrayInputStream bain,
293: ByteArrayOutputStream baout) throws IOException,
294: FOPException {
295: System.out.println("Construct driver");
296:
297: Driver driver = new Driver();
298:
299: System.out.println("Setup Renderer (output format)");
300: driver.setRenderer(Driver.RENDER_PDF);
301:
302: try {
303: driver.setOutputStream(baout);
304: System.out.println("Setup input");
305:
306: try {
307: driver.setInputSource(new InputSource(bain));
308:
309: System.out.println("Process FO");
310: driver.run();
311: System.out.println("PDF file generation completed");
312: } finally {
313: }
314: } finally {
315: }
316: }
317:
318: /** Handles the HTTP <code>GET</code> method.
319: * @param request servlet request
320: * @param response servlet response
321: */
322: protected void doGet(HttpServletRequest request,
323: HttpServletResponse response) throws ServletException,
324: IOException {
325: doPost(request, response);
326: }
327:
328: /** Handles the HTTP <code>POST</code> method.
329: * @param request servlet request
330: * @param response servlet response
331: */
332: protected void doPost(HttpServletRequest request,
333: HttpServletResponse response) throws ServletException,
334: IOException {
335: RequestContext context = RequestContextFactoryFinder
336: .createContext(request, response, true);
337:
338: try {
339: processRequest(context);
340: } finally {
341: context.invalidate();
342: }
343: }
344:
345: /** Returns a short description of the servlet.
346: */
347: public String getServletInfo() {
348: return "Export OLAP table";
349: }
350: }
|