001: /*
002: * Copyright (C) 2006 Erik Swenson - erik@oreports.com
003: *
004: * This program is free software; you can redistribute it and/or modify it under
005: * the terms of the GNU General Public License as published by the Free Software
006: * Foundation; either version 2 of the License, or (at your option) any later
007: * version.
008: *
009: * This program is distributed in the hope that it will be useful, but WITHOUT
010: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
012: * details.
013: *
014: * You should have received a copy of the GNU General Public License along with
015: * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
016: * Place - Suite 330, Boston, MA 02111-1307, USA.
017: *
018: */
019:
020: package org.efs.openreports.engine;
021:
022: import java.io.ByteArrayOutputStream;
023: import java.sql.Connection;
024: import java.sql.PreparedStatement;
025: import java.sql.ResultSet;
026: import java.util.List;
027: import java.util.Map;
028:
029: import net.sf.jasperreports.engine.design.JRDesignQuery;
030: import net.sf.jasperreports.engine.util.JRQueryExecuter;
031:
032: import org.apache.log4j.Logger;
033: import org.efs.openreports.ReportConstants.ExportType;
034: import org.efs.openreports.engine.input.ReportEngineInput;
035: import org.efs.openreports.engine.output.ReportEngineOutput;
036: import org.efs.openreports.objects.ORProperty;
037: import org.efs.openreports.objects.Report;
038: import org.efs.openreports.objects.ReportDataSource;
039: import org.efs.openreports.providers.DataSourceProvider;
040: import org.efs.openreports.providers.DirectoryProvider;
041: import org.efs.openreports.providers.PropertiesProvider;
042: import org.efs.openreports.providers.ProviderException;
043: import org.efs.openreports.util.ORUtil;
044: import org.jfree.report.JFreeReport;
045: import org.jfree.report.JFreeReportBoot;
046: import org.jfree.report.modules.misc.tablemodel.ResultSetTableModelFactory;
047: import org.jfree.report.modules.output.pageable.pdf.PDFReportUtil;
048: import org.jfree.report.modules.output.table.html.HtmlProcessor;
049: import org.jfree.report.modules.output.table.html.StreamHtmlFilesystem;
050: import org.jfree.report.modules.output.table.rtf.RTFProcessor;
051: import org.jfree.report.modules.output.table.xls.ExcelProcessor;
052: import org.jfree.report.modules.parser.base.ReportGenerator;
053: import org.jfree.report.util.CloseableTableModel;
054:
055: /**
056: * JFreeReport ReportEngine implementation.
057: *
058: * @author Erik Swenson
059: *
060: */
061: public class JFreeReportEngine extends ReportEngine {
062: protected static Logger log = Logger
063: .getLogger(JFreeReportEngine.class);
064:
065: public JFreeReportEngine(DataSourceProvider dataSourceProvider,
066: DirectoryProvider directoryProvider,
067: PropertiesProvider propertiesProvider) {
068: super (dataSourceProvider, directoryProvider, propertiesProvider);
069:
070: JFreeReportBoot boot = JFreeReportBoot.getInstance();
071: boot.getEditableConfig().setConfigProperty(
072: "org.jfree.base.LogLevel", "Info");
073: boot.start();
074: }
075:
076: public ReportEngineOutput generateReport(ReportEngineInput input)
077: throws ProviderException {
078: Connection conn = null;
079: PreparedStatement pStmt = null;
080: ResultSet rs = null;
081:
082: ByteArrayOutputStream out = new ByteArrayOutputStream();
083: CloseableTableModel model = null;
084:
085: try {
086: Report report = input.getReport();
087: Map parameters = input.getParameters();
088:
089: ReportDataSource dataSource = report.getDataSource();
090: conn = dataSourceProvider.getConnection(dataSource.getId());
091:
092: if (parameters == null || parameters.isEmpty()) {
093: pStmt = conn.prepareStatement(report.getQuery());
094: } else {
095: // Use JasperReports Query logic to parse parameters in chart
096: // queries
097:
098: JRDesignQuery query = new JRDesignQuery();
099: query.setText(report.getQuery());
100:
101: // convert parameters to JRDesignParameters so they can be
102: // parsed
103: Map jrParameters = ORUtil
104: .buildJRDesignParameters(parameters);
105:
106: pStmt = JRQueryExecuter.getStatement(query,
107: jrParameters, parameters, conn);
108: }
109:
110: ORProperty maxRows = propertiesProvider
111: .getProperty(ORProperty.QUERYREPORT_MAXROWS);
112: if (maxRows != null && maxRows.getValue() != null) {
113: pStmt.setMaxRows(Integer.parseInt(maxRows.getValue()));
114: }
115:
116: rs = pStmt.executeQuery();
117:
118: model = ResultSetTableModelFactory.getInstance()
119: .createTableModel(rs);
120:
121: ReportGenerator generator = ReportGenerator.getInstance();
122:
123: JFreeReport jfreeReport = generator
124: .parseReport(directoryProvider.getReportDirectory()
125: + report.getFile());
126: jfreeReport.setData(model);
127:
128: ReportEngineOutput output = new ReportEngineOutput();
129:
130: if (input.getExportType() == ExportType.PDF) {
131: output
132: .setContentType(ReportEngineOutput.CONTENT_TYPE_PDF);
133:
134: PDFReportUtil.createPDF(jfreeReport, out);
135: } else if (input.getExportType() == ExportType.XLS) {
136: output
137: .setContentType(ReportEngineOutput.CONTENT_TYPE_XLS);
138:
139: ExcelProcessor pr = new ExcelProcessor(jfreeReport);
140: pr.setStrictLayout(false);
141: pr.setDefineDataFormats(true);
142: pr.setOutputStream(out);
143: pr.processReport();
144: } else if (input.getExportType() == ExportType.RTF) {
145: output
146: .setContentType(ReportEngineOutput.CONTENT_TYPE_RTF);
147:
148: RTFProcessor pr = new RTFProcessor(jfreeReport);
149: pr.setStrictLayout(false);
150: pr.setOutputStream(out);
151: pr.processReport();
152: } else //default to HTML
153: {
154: output
155: .setContentType(ReportEngineOutput.CONTENT_TYPE_HTML);
156:
157: HtmlProcessor pr = new HtmlProcessor(jfreeReport);
158: pr.setStrictLayout(false);
159: pr.setGenerateXHTML(true);
160: pr.setFilesystem(new StreamHtmlFilesystem(out));
161: pr.processReport();
162: }
163:
164: output.setContent(out.toByteArray());
165:
166: return output;
167: } catch (Exception e) {
168: throw new ProviderException(e);
169: } finally {
170: try {
171: if (model != null)
172: model.close();
173: if (out != null)
174: out.close();
175: } catch (Exception e) {
176: log.warn(e.toString());
177: }
178:
179: try {
180: if (rs != null)
181: rs.close();
182: if (pStmt != null)
183: pStmt.close();
184: if (conn != null)
185: conn.close();
186: } catch (Exception e) {
187: log.warn(e.toString());
188: }
189: }
190: }
191:
192: public List buildParameterList(Report report)
193: throws ProviderException {
194: throw new ProviderException(
195: "JFreeReportEngine: buildParameterList not implemented.");
196: }
197: }
|