1 19 20 package org.efs.openreports.engine; 21 22 import java.sql.Connection ; 23 import java.sql.PreparedStatement ; 24 import java.sql.ResultSet ; 25 import java.util.List ; 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.commons.beanutils.DynaProperty; 32 import org.apache.commons.beanutils.RowSetDynaClass; 33 import org.apache.log4j.Logger; 34 import org.efs.openreports.engine.input.ReportEngineInput; 35 import org.efs.openreports.engine.output.QueryEngineOutput; 36 import org.efs.openreports.engine.output.ReportEngineOutput; 37 import org.efs.openreports.objects.ORProperty; 38 import org.efs.openreports.objects.Report; 39 import org.efs.openreports.objects.ReportDataSource; 40 import org.efs.openreports.providers.DataSourceProvider; 41 import org.efs.openreports.providers.DirectoryProvider; 42 import org.efs.openreports.providers.PropertiesProvider; 43 import org.efs.openreports.providers.ProviderException; 44 import org.efs.openreports.util.DisplayProperty; 45 import org.efs.openreports.util.ORUtil; 46 47 53 public class QueryReportEngine extends ReportEngine 54 { 55 protected static Logger log = Logger.getLogger(QueryReportEngine.class); 56 57 public QueryReportEngine(DataSourceProvider dataSourceProvider, 58 DirectoryProvider directoryProvider, PropertiesProvider propertiesProvider) 59 { 60 super(dataSourceProvider, directoryProvider, propertiesProvider); 61 } 62 63 public ReportEngineOutput generateReport(ReportEngineInput input) throws ProviderException 64 { 65 Connection conn = null; 66 PreparedStatement pStmt = null; 67 ResultSet rs = null; 68 69 try 70 { 71 Report report = input.getReport(); 72 Map parameters = input.getParameters(); 73 74 ReportDataSource dataSource = report.getDataSource(); 75 conn = dataSourceProvider.getConnection(dataSource.getId()); 76 77 if (parameters == null || parameters.isEmpty()) 78 { 79 pStmt = conn.prepareStatement(report.getQuery()); 80 } 81 else 82 { 83 86 JRDesignQuery query = new JRDesignQuery(); 87 query.setText(report.getQuery()); 88 89 Map jrParameters = ORUtil.buildJRDesignParameters(parameters); 92 93 pStmt = JRQueryExecuter.getStatement(query, jrParameters, parameters, 94 conn); 95 } 96 97 ORProperty maxRows = propertiesProvider 98 .getProperty(ORProperty.QUERYREPORT_MAXROWS); 99 if (maxRows != null && maxRows.getValue() != null) 100 { 101 pStmt.setMaxRows(Integer.parseInt(maxRows.getValue())); 102 } 103 104 rs = pStmt.executeQuery(); 105 106 RowSetDynaClass rowSetDynaClass = new RowSetDynaClass(rs); 107 108 List results = rowSetDynaClass.getRows(); 109 110 DynaProperty[] dynaProperties = rowSetDynaClass.getDynaProperties(); 111 112 DisplayProperty[] properties = new DisplayProperty[dynaProperties.length]; 113 for (int i = 0; i < dynaProperties.length; i++) 114 { 115 properties[i] = new DisplayProperty(dynaProperties[i].getName(), 116 dynaProperties[i].getType().getName()); 117 } 118 119 rs.close(); 120 121 QueryEngineOutput output = new QueryEngineOutput(); 122 output.setResults(results); 123 output.setProperties(properties); 124 125 return output; 126 } 127 catch (Exception e) 128 { 129 throw new ProviderException("Error executing report query: " + e.getMessage()); 130 } 131 finally 132 { 133 try 134 { 135 if (pStmt != null) pStmt.close(); 136 if (conn != null) conn.close(); 137 } 138 catch (Exception c) 139 { 140 log.error("Error closing"); 141 } 142 } 143 } 144 } | Popular Tags |