KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > efs > openreports > util > ScheduledReportJob


1 /*
2  * Copyright (C) 2003 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.util;
21
22 import java.io.File JavaDoc;
23 import java.util.Date JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.Map JavaDoc;
26 import java.util.Vector JavaDoc;
27
28 import net.sf.jasperreports.engine.JRException;
29 import net.sf.jasperreports.engine.JRParameter;
30 import net.sf.jasperreports.engine.JRVirtualizer;
31 import net.sf.jasperreports.engine.fill.JRFileVirtualizer;
32
33 import org.apache.commons.lang.StringUtils;
34 import org.apache.log4j.Logger;
35 import org.efs.openreports.ORStatics;
36 import org.efs.openreports.engine.ChartReportEngine;
37 import org.efs.openreports.engine.ReportEngine;
38 import org.efs.openreports.engine.input.ReportEngineInput;
39 import org.efs.openreports.engine.output.ChartEngineOutput;
40 import org.efs.openreports.engine.output.JasperReportEngineOutput;
41 import org.efs.openreports.engine.output.ReportEngineOutput;
42 import org.efs.openreports.objects.MailMessage;
43 import org.efs.openreports.objects.Report;
44 import org.efs.openreports.objects.ReportLog;
45 import org.efs.openreports.objects.ReportSchedule;
46 import org.efs.openreports.objects.ReportUser;
47 import org.efs.openreports.objects.ReportUserAlert;
48 import org.efs.openreports.providers.AlertProvider;
49 import org.efs.openreports.providers.AlertProviderAware;
50 import org.efs.openreports.providers.DataSourceProvider;
51 import org.efs.openreports.providers.DataSourceProviderAware;
52 import org.efs.openreports.providers.DirectoryProvider;
53 import org.efs.openreports.providers.DirectoryProviderAware;
54 import org.efs.openreports.providers.MailProvider;
55 import org.efs.openreports.providers.MailProviderAware;
56 import org.efs.openreports.providers.PropertiesProvider;
57 import org.efs.openreports.providers.PropertiesProviderAware;
58 import org.efs.openreports.providers.ReportLogProvider;
59 import org.efs.openreports.providers.ReportLogProviderAware;
60 import org.quartz.Job;
61 import org.quartz.JobDataMap;
62 import org.quartz.JobExecutionContext;
63 import org.quartz.JobExecutionException;
64
65 public class ScheduledReportJob
66     implements
67         Job,
68         ReportLogProviderAware,
69         DirectoryProviderAware,
70         MailProviderAware,
71         AlertProviderAware,
72         DataSourceProviderAware,
73         PropertiesProviderAware
74 {
75     protected static Logger log =
76         Logger.getLogger(ScheduledReportJob.class.getName());
77     
78     private ReportLogProvider reportLogProvider;
79     private DirectoryProvider directoryProvider;
80     private MailProvider mailProvider;
81     private AlertProvider alertProvider;
82     private DataSourceProvider dataSourceProvider;
83     private PropertiesProvider propertiesProvider;
84
85     public ScheduledReportJob()
86     {
87         ORComponentManager.initializeObject(this);
88     }
89
90     public void execute(JobExecutionContext context)
91         throws JobExecutionException
92     {
93         log.debug("Scheduled Report Executing....");
94
95         JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
96
97         ReportSchedule reportSchedule =
98             (ReportSchedule) jobDataMap.get(ORStatics.REPORT_SCHEDULE);
99         reportSchedule.setScheduleDescription(context.getJobDetail().getDescription());
100
101         Report report = reportSchedule.getReport();
102         ReportUser user = reportSchedule.getUser();
103         Map JavaDoc reportParameters = reportSchedule.getReportParameters();
104
105         log.debug("Report: " + report.getName());
106         log.debug("User: " + user.getName());
107
108         JRVirtualizer virtualizer = null;
109         
110         ReportLog reportLog = new ReportLog(user, report, new Date JavaDoc());
111
112         try
113         {
114             //
115
ReportUserAlert alert = reportSchedule.getAlert();
116             
117             if (alert != null)
118             {
119                 log.debug("Executing Alert Condition");
120                 
121                 alert.setReport(report);
122                 alert = alertProvider.executeAlert(alert, true);
123                 
124                 if (!alert.isTriggered())
125                 {
126                     log.debug("Alert Not Triggered. Report not run.");
127                     return;
128                 }
129                 
130                 log.debug("Alert Triggered. Running report.");
131             }
132             //
133

134             // add standard report parameters
135
reportParameters.put(ORStatics.USER_ID, user.getId());
136             reportParameters.put(ORStatics.EXTERNAL_ID, user.getExternalId());
137             reportParameters.put(ORStatics.USER_NAME, user.getName());
138             reportParameters.put(ORStatics.IMAGE_DIR, new File JavaDoc(directoryProvider.getReportImageDirectory()));
139             reportParameters.put(ORStatics.REPORT_DIR, new File JavaDoc(directoryProvider.getReportDirectory()));
140             //
141

142             reportLogProvider.insertReportLog(reportLog);
143             
144             ReportEngineInput reportInput = new ReportEngineInput(report, reportParameters);
145             reportInput.setExportType(reportSchedule.getExportType());
146             
147             if (report.isJasperReport())
148             {
149                 // add any charts
150
if (report.getReportChart() != null)
151                 {
152                     log.debug("Adding chart: " + report.getReportChart().getName());
153                 
154                     ChartReportEngine chartEngine = new ChartReportEngine(dataSourceProvider, directoryProvider, propertiesProvider);
155                     ChartEngineOutput chartOutput = (ChartEngineOutput) chartEngine.generateReport(reportInput);
156                 
157                     reportParameters.put("ChartImage", chartOutput.getContent());
158                 }
159
160                 if (report.isVirtualizationEnabled())
161                 {
162                     log.debug("Virtualization Enabled");
163                     virtualizer = new JRFileVirtualizer(2, directoryProvider.getTempDirectory());
164                     reportParameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
165                 }
166                 
167                 reportInput.setParameters(reportParameters);
168                 reportInput.setInlineImages(true);
169             }
170             
171             ReportEngine reportEngine = new ReportEngine(dataSourceProvider, directoryProvider, propertiesProvider);
172             ReportEngineOutput reportOutput = reportEngine.generateReport(reportInput);
173             
174             Vector JavaDoc htmlImageDataSources = new Vector JavaDoc();
175             ByteArrayDataSource byteArrayDataSource = exportReport(reportOutput, reportSchedule, htmlImageDataSources);
176
177             MailMessage mail = new MailMessage();
178             mail.setByteArrayDataSource(byteArrayDataSource);
179             mail.addHtmlImageDataSources(htmlImageDataSources);
180             mail.setSender(user.getEmail());
181             mail.parseRecipients(reportSchedule.getRecipients());
182             
183             if (reportSchedule.getScheduleDescription() != null && reportSchedule.getScheduleDescription().trim().length() > 0)
184             {
185                 mail.setSubject(reportSchedule.getScheduleDescription());
186             }
187             else
188             {
189                 mail.setSubject(report.getName());
190             }
191             
192             if (reportSchedule.getExportType() != ReportEngine.EXPORT_HTML)
193             {
194                 mail.setText(report.getName() + ": Generated on " + new Date JavaDoc());
195             }
196
197             mailProvider.sendMail(mail);
198
199             log.debug(
200                 byteArrayDataSource.getName()
201                     + " sent to: "
202                     + mail.formatRecipients(";"));
203
204             reportLog.setEndTime(new Date JavaDoc());
205             reportLog.setStatus(ReportLog.STATUS_SUCCESS);
206             reportLogProvider.updateReportLog(reportLog);
207
208             log.debug("Scheduled Report Finished...");
209         }
210         catch (Exception JavaDoc e)
211         {
212             if (e.getMessage() != null && e.getMessage().indexOf("Empty") > 0)
213             {
214                 reportLog.setStatus(ReportLog.STATUS_EMPTY);
215             }
216             else
217             {
218                 e.printStackTrace();
219                 log.error(e.toString());
220
221                 reportLog.setMessage(e.getMessage());
222                 reportLog.setStatus(ReportLog.STATUS_FAILURE);
223             }
224
225             reportLog.setEndTime(new Date JavaDoc());
226
227             try
228             {
229                 reportLogProvider.updateReportLog(reportLog);
230             }
231             catch (Exception JavaDoc ex)
232             {
233                 log.error("Unable to create ReportLog: " + ex.getMessage());
234             }
235         }
236         finally
237         {
238             if (virtualizer != null)
239             {
240                 reportParameters.remove(JRParameter.REPORT_VIRTUALIZER);
241                 virtualizer.cleanup();
242             }
243         }
244     }
245
246     protected ByteArrayDataSource exportReport(ReportEngineOutput reportOutput, ReportSchedule reportSchedule,
247             Vector JavaDoc htmlImageDataSources) throws JRException
248     {
249         String JavaDoc reportName = StringUtils.deleteWhitespace(reportSchedule.getReport().getName());
250
251         ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource(reportOutput.getContent(), reportOutput.getContentType());
252         byteArrayDataSource.setName(reportName + reportOutput.getContentExtension());
253         
254         if (reportSchedule.getExportType() == ReportEngine.EXPORT_HTML
255                 && reportSchedule.getReport().isJasperReport())
256         {
257             Map JavaDoc imagesMap = ((JasperReportEngineOutput) reportOutput).getImagesMap();
258
259             for (Iterator JavaDoc entryIter = imagesMap.entrySet().iterator(); entryIter
260                     .hasNext();)
261             {
262                 Map.Entry JavaDoc entry = (Map.Entry JavaDoc) entryIter.next();
263
264                 ByteArrayDataSource imageDataSource = new ByteArrayDataSource(
265                         (byte[]) entry.getValue(), getImageContentType((byte[]) entry
266                                 .getValue()));
267
268                 imageDataSource.setName((String JavaDoc) entry.getKey());
269
270                 htmlImageDataSources.add(imageDataSource);
271             }
272         }
273
274         return byteArrayDataSource;
275     }
276
277     /**
278      * Try to figure out the image type from its bytes.
279      */

280     private String JavaDoc getImageContentType(byte[] bytes)
281     {
282         String JavaDoc header = new String JavaDoc(bytes, 0, (bytes.length > 100) ? 100 : bytes.length);
283         if (header.startsWith("GIF"))
284         {
285             return "image/gif";
286         }
287
288         if (header.startsWith("BM"))
289         {
290             return "image/bmp";
291         }
292
293         if (header.indexOf("JFIF") >= 0)
294         {
295             return "image/jpeg";
296         }
297
298         if (header.indexOf("PNG") >= 0)
299         {
300             return "image/png";
301         }
302
303         // We are out of guesses, so just guess tiff
304
return "image/tiff";
305     }
306     
307     public void setReportLogProvider(ReportLogProvider reportLogProvider)
308     {
309         this.reportLogProvider = reportLogProvider;
310     }
311
312     public void setDirectoryProvider(DirectoryProvider directoryProvider)
313     {
314         this.directoryProvider = directoryProvider;
315     }
316
317     public void setMailProvider(MailProvider mailProvider)
318     {
319         this.mailProvider = mailProvider;
320     }
321     
322     public void setAlertProvider(AlertProvider alertProvider)
323     {
324         this.alertProvider = alertProvider;
325     }
326
327     public void setDataSourceProvider(DataSourceProvider dataSourceProvider)
328     {
329         this.dataSourceProvider = dataSourceProvider;
330     }
331
332     public void setPropertiesProvider(PropertiesProvider propertiesProvider)
333     {
334         this.propertiesProvider = propertiesProvider;
335     }
336 }
Popular Tags