1 19 20 package org.efs.openreports.util; 21 22 import java.io.File ; 23 import java.util.Date ; 24 import java.util.Iterator ; 25 import java.util.Map ; 26 import java.util.Vector ; 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 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 ()); 111 112 try 113 { 114 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 134 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 (directoryProvider.getReportImageDirectory())); 139 reportParameters.put(ORStatics.REPORT_DIR, new File (directoryProvider.getReportDirectory())); 140 142 reportLogProvider.insertReportLog(reportLog); 143 144 ReportEngineInput reportInput = new ReportEngineInput(report, reportParameters); 145 reportInput.setExportType(reportSchedule.getExportType()); 146 147 if (report.isJasperReport()) 148 { 149 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 htmlImageDataSources = new Vector (); 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 ()); 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 ()); 205 reportLog.setStatus(ReportLog.STATUS_SUCCESS); 206 reportLogProvider.updateReportLog(reportLog); 207 208 log.debug("Scheduled Report Finished..."); 209 } 210 catch (Exception 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 ()); 226 227 try 228 { 229 reportLogProvider.updateReportLog(reportLog); 230 } 231 catch (Exception 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 htmlImageDataSources) throws JRException 248 { 249 String 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 imagesMap = ((JasperReportEngineOutput) reportOutput).getImagesMap(); 258 259 for (Iterator entryIter = imagesMap.entrySet().iterator(); entryIter 260 .hasNext();) 261 { 262 Map.Entry entry = (Map.Entry ) entryIter.next(); 263 264 ByteArrayDataSource imageDataSource = new ByteArrayDataSource( 265 (byte[]) entry.getValue(), getImageContentType((byte[]) entry 266 .getValue())); 267 268 imageDataSource.setName((String ) entry.getKey()); 269 270 htmlImageDataSources.add(imageDataSource); 271 } 272 } 273 274 return byteArrayDataSource; 275 } 276 277 280 private String getImageContentType(byte[] bytes) 281 { 282 String header = new String (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 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 |