1 19 20 package org.efs.openreports.engine; 21 22 import java.io.ByteArrayOutputStream ; 23 import java.sql.Connection ; 24 import java.sql.PreparedStatement ; 25 import java.sql.ResultSet ; 26 import java.util.Map ; 27 28 import net.sf.jasperreports.engine.design.JRDesignQuery; 29 import net.sf.jasperreports.engine.util.JRQueryExecuter; 30 31 import org.apache.log4j.Logger; 32 import org.efs.openreports.engine.input.ReportEngineInput; 33 import org.efs.openreports.engine.output.ReportEngineOutput; 34 import org.efs.openreports.objects.ORProperty; 35 import org.efs.openreports.objects.Report; 36 import org.efs.openreports.objects.ReportDataSource; 37 import org.efs.openreports.providers.DataSourceProvider; 38 import org.efs.openreports.providers.DirectoryProvider; 39 import org.efs.openreports.providers.PropertiesProvider; 40 import org.efs.openreports.providers.ProviderException; 41 import org.efs.openreports.util.ORUtil; 42 import org.jfree.report.JFreeReport; 43 import org.jfree.report.JFreeReportBoot; 44 import org.jfree.report.modules.misc.tablemodel.ResultSetTableModelFactory; 45 import org.jfree.report.modules.output.pageable.pdf.PDFReportUtil; 46 import org.jfree.report.modules.output.table.html.HtmlProcessor; 47 import org.jfree.report.modules.output.table.html.StreamHtmlFilesystem; 48 import org.jfree.report.modules.output.table.rtf.RTFProcessor; 49 import org.jfree.report.modules.output.table.xls.ExcelProcessor; 50 import org.jfree.report.modules.parser.base.ReportGenerator; 51 import org.jfree.report.util.CloseableTableModel; 52 53 59 public class JFreeReportEngine extends ReportEngine 60 { 61 protected static Logger log = Logger.getLogger(JFreeReportEngine.class); 62 63 public JFreeReportEngine(DataSourceProvider dataSourceProvider, 64 DirectoryProvider directoryProvider, PropertiesProvider propertiesProvider) 65 { 66 super(dataSourceProvider, directoryProvider, propertiesProvider); 67 68 JFreeReportBoot boot = JFreeReportBoot.getInstance(); 69 boot.getEditableConfig().setConfigProperty("org.jfree.base.LogLevel", "Info"); 70 boot.start(); 71 } 72 73 public ReportEngineOutput generateReport(ReportEngineInput input) throws ProviderException 74 { 75 Connection conn = null; 76 PreparedStatement pStmt = null; 77 ResultSet rs = null; 78 79 ByteArrayOutputStream out = new ByteArrayOutputStream (); 80 CloseableTableModel model = null; 81 82 try 83 { 84 Report report = input.getReport(); 85 Map parameters = input.getParameters(); 86 87 ReportDataSource dataSource = report.getDataSource(); 88 conn = dataSourceProvider.getConnection(dataSource.getId()); 89 90 if (parameters == null || parameters.isEmpty()) 91 { 92 pStmt = conn.prepareStatement(report.getQuery()); 93 } 94 else 95 { 96 99 JRDesignQuery query = new JRDesignQuery(); 100 query.setText(report.getQuery()); 101 102 Map jrParameters = ORUtil.buildJRDesignParameters(parameters); 105 106 pStmt = JRQueryExecuter.getStatement(query, jrParameters, parameters, conn); 107 } 108 109 ORProperty maxRows = propertiesProvider.getProperty(ORProperty.QUERYREPORT_MAXROWS); 110 if (maxRows != null && maxRows.getValue() != null) 111 { 112 pStmt.setMaxRows(Integer.parseInt(maxRows.getValue())); 113 } 114 115 rs = pStmt.executeQuery(); 116 117 model = ResultSetTableModelFactory.getInstance().createTableModel(rs); 118 119 ReportGenerator generator = ReportGenerator.getInstance(); 120 121 JFreeReport jfreeReport = generator.parseReport(directoryProvider 122 .getReportDirectory() 123 + report.getFile()); 124 jfreeReport.setData(model); 125 126 ReportEngineOutput output = new ReportEngineOutput(); 127 128 if (input.getExportType() == ReportEngine.EXPORT_PDF) 129 { 130 output.setContentType(ReportEngineOutput.CONTENT_TYPE_PDF); 131 132 PDFReportUtil.createPDF(jfreeReport, out); 133 } 134 else if (input.getExportType() == ReportEngine.EXPORT_XLS) 135 { 136 output.setContentType(ReportEngineOutput.CONTENT_TYPE_XLS); 137 138 ExcelProcessor pr = new ExcelProcessor(jfreeReport); 139 pr.setStrictLayout(false); 140 pr.setDefineDataFormats(true); 141 pr.setOutputStream(out); 142 pr.processReport(); 143 } 144 else if (input.getExportType() == ReportEngine.EXPORT_RTF) 145 { 146 output.setContentType(ReportEngineOutput.CONTENT_TYPE_RTF); 147 148 RTFProcessor pr = new RTFProcessor(jfreeReport); 149 pr.setStrictLayout(false); 150 pr.setOutputStream(out); 151 pr.processReport(); 152 } 153 else { 155 output.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 } 168 catch (Exception e) 169 { 170 throw new ProviderException(e); 171 } 172 finally 173 { 174 try 175 { 176 if (model != null) model.close(); 177 if (out != null) out.close(); 178 } 179 catch (Exception e) 180 { 181 log.warn(e.toString()); 182 } 183 184 try 185 { 186 if (rs != null) rs.close(); 187 if (pStmt != null) pStmt.close(); 188 if (conn != null) conn.close(); 189 } 190 catch (Exception e) 191 { 192 log.warn(e.toString()); 193 } 194 } 195 } 196 } 197 | Popular Tags |