KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > efs > openreports > engine > QueryReportEngine


1 /*
2  * Copyright (C) 2006 Erik Swenson - erik@oreports.com
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the Free
6  * Software Foundation; either version 2 of the License, or (at your option)
7  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16  * Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  */

19
20 package org.efs.openreports.engine;
21
22 import java.sql.Connection JavaDoc;
23 import java.sql.PreparedStatement JavaDoc;
24 import java.sql.ResultSet JavaDoc;
25 import java.util.List JavaDoc;
26 import java.util.Map JavaDoc;
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 /**
48 * QueryReport ReportEngine implementation.
49 *
50 * @author Erik Swenson
51 *
52 */

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 JavaDoc conn = null;
66         PreparedStatement JavaDoc pStmt = null;
67         ResultSet JavaDoc rs = null;
68
69         try
70         {
71             Report report = input.getReport();
72             Map JavaDoc 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                 // Use JasperReports Query logic to parse parameters in chart
84
// queries
85

86                 JRDesignQuery query = new JRDesignQuery();
87                 query.setText(report.getQuery());
88
89                 // convert parameters to JRDesignParameters so they can be
90
// parsed
91
Map JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc c)
139             {
140                 log.error("Error closing");
141             }
142         }
143     }
144 }
Popular Tags