KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > efs > openreports > actions > ReportRunAction


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

17
18 package org.efs.openreports.actions;
19
20 import java.io.File JavaDoc;
21 import java.util.*;
22
23 import javax.servlet.ServletOutputStream JavaDoc;
24 import javax.servlet.http.HttpServletRequest JavaDoc;
25 import javax.servlet.http.HttpServletResponse JavaDoc;
26
27 import com.opensymphony.webwork.ServletActionContext;
28 import com.opensymphony.xwork.ActionContext;
29 import com.opensymphony.xwork.ActionSupport;
30
31 import org.apache.commons.lang.StringUtils;
32 import org.apache.log4j.Logger;
33 import org.efs.openreports.ORStatics;
34 import org.efs.openreports.engine.ChartReportEngine;
35 import org.efs.openreports.engine.JasperReportEngine;
36 import org.efs.openreports.engine.ReportEngine;
37 import org.efs.openreports.engine.input.ReportEngineInput;
38 import org.efs.openreports.engine.output.ChartEngineOutput;
39 import org.efs.openreports.engine.output.ReportEngineOutput;
40 import org.efs.openreports.objects.*;
41 import org.efs.openreports.providers.*;
42 import org.efs.openreports.util.LocalStrings;
43
44 import net.sf.jasperreports.engine.JRParameter;
45 import net.sf.jasperreports.engine.JRVirtualizer;
46 import net.sf.jasperreports.engine.JasperPrint;
47 import net.sf.jasperreports.engine.fill.JRFileVirtualizer;
48
49 public class ReportRunAction
50     extends ActionSupport implements ReportLogProviderAware,
51         DirectoryProviderAware, DataSourceProviderAware,
52         PropertiesProviderAware
53 {
54     protected static Logger log = Logger.getLogger(ReportRunAction.class);
55     
56     private ReportLogProvider reportLogProvider;
57     private DirectoryProvider directoryProvider;
58     private DataSourceProvider dataSourceProvider;
59     private PropertiesProvider propertiesProvider;
60
61     public String JavaDoc execute()
62     {
63         ReportUser user =
64             (ReportUser) ActionContext.getContext().getSession().get(ORStatics.REPORT_USER);
65
66         Report report = (Report) ActionContext.getContext().getSession().get(ORStatics.REPORT);
67
68         int exportType =
69             Integer.parseInt(
70                 (String JavaDoc) ActionContext.getContext().getSession().get(ORStatics.EXPORT_TYPE));
71
72         Map reportParameters = getReportParameterMap(user, report, exportType);
73         Map imagesMap = getImagesMap();
74
75         HttpServletRequest JavaDoc request = ServletActionContext.getRequest();
76         HttpServletResponse JavaDoc response = ServletActionContext.getResponse();
77
78         // set headers to disable caching
79
response.setHeader("Pragma", "public");
80         response.setHeader("Cache-Control", "max-age=0");
81
82         ReportLog reportLog = new ReportLog(user, report, new Date());
83         
84         JRVirtualizer virtualizer = null;
85
86         try
87         {
88             if (exportType == ReportEngine.EXPORT_PDF)
89             {
90                 // Handle "contype" request from Internet Explorer
91
if ("contype".equals(request.getHeader("User-Agent")))
92                 {
93                     response.setContentType("application/pdf");
94                     response.setContentLength(0);
95                     
96                     ServletOutputStream JavaDoc outputStream = response.getOutputStream();
97                     outputStream.close();
98                     
99                     return NONE;
100                 }
101             }
102                             
103             log.debug("Filling report: " + report.getName());
104             
105             reportLogProvider.insertReportLog(reportLog);
106
107             if (report.isVirtualizationEnabled() && exportType != ReportEngine.EXPORT_IMAGE)
108             {
109                 log.debug("Virtualization Enabled");
110                 virtualizer = new JRFileVirtualizer(2, directoryProvider.getTempDirectory());
111                 reportParameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
112             }
113
114             ReportEngineInput reportInput = new ReportEngineInput(report, reportParameters);
115             reportInput.setExportType(exportType);
116             reportInput.setImagesMap(imagesMap);
117
118             // add any charts
119
if (report.getReportChart() != null)
120             {
121                 log.debug("Adding chart: " + report.getReportChart().getName());
122
123                 ChartReportEngine chartEngine = new ChartReportEngine(dataSourceProvider,
124                         directoryProvider, propertiesProvider);
125                 
126                 ChartEngineOutput chartOutput = (ChartEngineOutput) chartEngine
127                         .generateReport(reportInput);
128
129                 reportParameters.put("ChartImage", chartOutput.getContent());
130             }
131             
132             ReportEngineOutput reportOutput = null;
133             JasperPrint jasperPrint = null;
134             
135             if (report.isJasperReport())
136             {
137                 JasperReportEngine jasperEngine = new JasperReportEngine(
138                         dataSourceProvider, directoryProvider, propertiesProvider);
139                 
140                 jasperPrint = jasperEngine.fillReport(reportInput);
141
142                 log.debug("Report filled - " + report.getName() + " : size = "
143                         + jasperPrint.getPages().size());
144
145                 log.debug("Exporting report: " + report.getName());
146
147                 reportOutput = jasperEngine.exportReport(jasperPrint, exportType, report
148                         .getReportExportOption(), imagesMap, false);
149             }
150             else
151             {
152                 ReportEngine reportEngine = new ReportEngine(dataSourceProvider, directoryProvider, propertiesProvider);
153                 reportOutput = reportEngine.generateReport(reportInput);
154             }
155             
156             response.setContentType(reportOutput.getContentType());
157             
158             if (exportType != ReportEngine.EXPORT_HTML && exportType != ReportEngine.EXPORT_IMAGE)
159             {
160                 response.setHeader("Content-disposition", "inline; filename="
161                         + StringUtils.deleteWhitespace(report.getName()) + reportOutput.getContentExtension());
162             }
163             
164             if (exportType == ReportEngine.EXPORT_IMAGE)
165             {
166                 if (jasperPrint != null)
167                 {
168                     ActionContext.getContext().getSession().put(ORStatics.JASPERPRINT, jasperPrint);
169                 }
170             }
171             else
172             {
173                 byte[] content = reportOutput.getContent();
174                 
175                 response.setContentLength(content.length);
176                 
177                 ServletOutputStream JavaDoc out = response.getOutputStream();
178                 out.write(content, 0, content.length);
179                 out.flush();
180                 out.close();
181             }
182
183             reportLog.setEndTime(new Date());
184             reportLog.setStatus(ReportLog.STATUS_SUCCESS);
185             reportLogProvider.updateReportLog(reportLog);
186
187             log.debug("Finished report: " + report.getName());
188         }
189         catch (Exception JavaDoc e)
190         {
191             if (e.getMessage() != null && e.getMessage().indexOf("Empty") > 0)
192             {
193                 addActionError(LocalStrings.getString(LocalStrings.ERROR_REPORT_EMPTY));
194                 reportLog.setStatus(ReportLog.STATUS_EMPTY);
195             }
196             else
197             {
198                 addActionError(e.getMessage());
199
200                 log.error(e.getMessage());
201
202                 reportLog.setMessage(e.getMessage());
203                 reportLog.setStatus(ReportLog.STATUS_FAILURE);
204             }
205
206             reportLog.setEndTime(new Date());
207
208             try
209             {
210                 reportLogProvider.updateReportLog(reportLog);
211             }
212             catch (Exception JavaDoc ex)
213             {
214                 log.error("Unable to create ReportLog: " + ex.getMessage());
215             }
216             
217             return ERROR;
218         }
219         finally
220         {
221             if (virtualizer != null)
222             {
223                 reportParameters.remove(JRParameter.REPORT_VIRTUALIZER);
224                 virtualizer.cleanup();
225             }
226         }
227         
228         if (exportType == ReportEngine.EXPORT_IMAGE) return SUCCESS;
229         
230         return NONE;
231     }
232
233     protected Map getReportParameterMap(ReportUser user, Report report, int exportType)
234     {
235         Map reportParameters = new HashMap();
236         if (ActionContext.getContext().getSession().get(ORStatics.REPORT_PARAMETERS) != null)
237         {
238             reportParameters =
239                 (Map) ActionContext.getContext().getSession().get(ORStatics.REPORT_PARAMETERS);
240         }
241         
242         reportParameters.put(ORStatics.IMAGE_DIR, new File JavaDoc(directoryProvider.getReportImageDirectory()));
243         reportParameters.put(ORStatics.REPORT_DIR, new File JavaDoc(directoryProvider.getReportDirectory()));
244         reportParameters.put(ORStatics.EXPORT_TYPE_PARAM, new Integer JavaDoc(exportType));
245
246         return reportParameters;
247     }
248
249     protected Map getImagesMap()
250     {
251         // used by JasperReports HTML export
252
// see ImageLoaderAction for more information
253
Map imagesMap = null;
254         if (ActionContext.getContext().getSession().get(ORStatics.IMAGES_MAP) != null)
255         {
256             imagesMap = (Map) ActionContext.getContext().getSession().get(ORStatics.IMAGES_MAP);
257         }
258         else
259         {
260             imagesMap = new HashMap();
261             ActionContext.getContext().getSession().put(ORStatics.IMAGES_MAP, imagesMap);
262         }
263
264         return imagesMap;
265     }
266
267     public void setReportLogProvider(ReportLogProvider reportLogProvider)
268     {
269         this.reportLogProvider = reportLogProvider;
270     }
271
272     public void setDirectoryProvider(DirectoryProvider directoryProvider)
273     {
274         this.directoryProvider = directoryProvider;
275     }
276
277     public void setDataSourceProvider(DataSourceProvider dataSourceProvider)
278     {
279         this.dataSourceProvider = dataSourceProvider;
280     }
281
282     public void setPropertiesProvider(PropertiesProvider propertiesProvider)
283     {
284         this.propertiesProvider = propertiesProvider;
285     }
286 }
Popular Tags