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
005: * under the terms of the GNU General Public License as published by the Free
006: * Software Foundation; either version 2 of the License, or (at your option)
007: * any later 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
011: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
012: * more 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.sql.Connection;
023: import java.sql.PreparedStatement;
024: import java.sql.ResultSet;
025: import java.util.List;
026: import java.util.Map;
027:
028: import net.sf.jasperreports.engine.design.JRDesignQuery;
029: import net.sf.jasperreports.engine.util.JRQueryExecuter;
030:
031: import org.apache.commons.beanutils.DynaProperty;
032: import org.apache.commons.beanutils.RowSetDynaClass;
033: import org.apache.log4j.Logger;
034: import org.efs.openreports.engine.input.ReportEngineInput;
035: import org.efs.openreports.engine.output.QueryEngineOutput;
036: import org.efs.openreports.engine.output.ReportEngineOutput;
037: import org.efs.openreports.objects.ORProperty;
038: import org.efs.openreports.objects.Report;
039: import org.efs.openreports.objects.ReportDataSource;
040: import org.efs.openreports.providers.DataSourceProvider;
041: import org.efs.openreports.providers.DirectoryProvider;
042: import org.efs.openreports.providers.PropertiesProvider;
043: import org.efs.openreports.providers.ProviderException;
044: import org.efs.openreports.util.DisplayProperty;
045: import org.efs.openreports.util.ORUtil;
046:
047: /**
048: * QueryReport ReportEngine implementation.
049: *
050: * @author Erik Swenson
051: *
052: */
053: public class QueryReportEngine extends ReportEngine {
054: protected static Logger log = Logger
055: .getLogger(QueryReportEngine.class);
056:
057: public QueryReportEngine(DataSourceProvider dataSourceProvider,
058: DirectoryProvider directoryProvider,
059: PropertiesProvider propertiesProvider) {
060: super (dataSourceProvider, directoryProvider, propertiesProvider);
061: }
062:
063: public ReportEngineOutput generateReport(ReportEngineInput input)
064: throws ProviderException {
065: Connection conn = null;
066: PreparedStatement pStmt = null;
067: ResultSet rs = null;
068:
069: try {
070: Report report = input.getReport();
071: Map parameters = input.getParameters();
072:
073: ReportDataSource dataSource = report.getDataSource();
074: conn = dataSourceProvider.getConnection(dataSource.getId());
075:
076: if (parameters == null || parameters.isEmpty()) {
077: pStmt = conn.prepareStatement(report.getQuery());
078: } else {
079: // Use JasperReports Query logic to parse parameters in chart
080: // queries
081:
082: JRDesignQuery query = new JRDesignQuery();
083: query.setText(report.getQuery());
084:
085: // convert parameters to JRDesignParameters so they can be
086: // parsed
087: Map jrParameters = ORUtil
088: .buildJRDesignParameters(parameters);
089:
090: pStmt = JRQueryExecuter.getStatement(query,
091: jrParameters, parameters, conn);
092: }
093:
094: ORProperty maxRows = propertiesProvider
095: .getProperty(ORProperty.QUERYREPORT_MAXROWS);
096: if (maxRows != null && maxRows.getValue() != null) {
097: pStmt.setMaxRows(Integer.parseInt(maxRows.getValue()));
098: }
099:
100: rs = pStmt.executeQuery();
101:
102: RowSetDynaClass rowSetDynaClass = new RowSetDynaClass(rs);
103:
104: List results = rowSetDynaClass.getRows();
105:
106: DynaProperty[] dynaProperties = rowSetDynaClass
107: .getDynaProperties();
108:
109: DisplayProperty[] properties = new DisplayProperty[dynaProperties.length];
110: for (int i = 0; i < dynaProperties.length; i++) {
111: properties[i] = new DisplayProperty(dynaProperties[i]
112: .getName(), dynaProperties[i].getType()
113: .getName());
114: }
115:
116: rs.close();
117:
118: QueryEngineOutput output = new QueryEngineOutput();
119: output.setResults(results);
120: output.setProperties(properties);
121:
122: return output;
123: } catch (Exception e) {
124: throw new ProviderException(
125: "Error executing report query: " + e.getMessage());
126: } finally {
127: try {
128: if (pStmt != null)
129: pStmt.close();
130: if (conn != null)
131: conn.close();
132: } catch (Exception c) {
133: log.error("Error closing");
134: }
135: }
136: }
137:
138: public List buildParameterList(Report report)
139: throws ProviderException {
140: throw new ProviderException(
141: "QueryReportEngine: buildParameterList not implemented.");
142: }
143: }
|