org.efs.openreports.util.ScheduledReportJob.java Source code

Java tutorial

Introduction

Here is the source code for org.efs.openreports.util.ScheduledReportJob.java

Source

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

package org.efs.openreports.util;

import java.io.File;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRVirtualizer;
import net.sf.jasperreports.engine.fill.JRFileVirtualizer;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.efs.openreports.ORStatics;
import org.efs.openreports.engine.ChartReportEngine;
import org.efs.openreports.engine.JasperReportEngine;
import org.efs.openreports.engine.ReportEngine;
import org.efs.openreports.engine.ReportEngineHelper;
import org.efs.openreports.engine.input.ReportEngineInput;
import org.efs.openreports.engine.output.ChartEngineOutput;
import org.efs.openreports.engine.output.JasperReportEngineOutput;
import org.efs.openreports.engine.output.ReportEngineOutput;
import org.efs.openreports.objects.MailMessage;
import org.efs.openreports.objects.Report;
import org.efs.openreports.objects.ReportLog;
import org.efs.openreports.objects.ReportSchedule;
import org.efs.openreports.objects.ReportUser;
import org.efs.openreports.objects.ReportUserAlert;
import org.efs.openreports.providers.AlertProvider;
import org.efs.openreports.providers.AlertProviderAware;
import org.efs.openreports.providers.DataSourceProvider;
import org.efs.openreports.providers.DataSourceProviderAware;
import org.efs.openreports.providers.DirectoryProvider;
import org.efs.openreports.providers.DirectoryProviderAware;
import org.efs.openreports.providers.MailProvider;
import org.efs.openreports.providers.MailProviderAware;
import org.efs.openreports.providers.PropertiesProvider;
import org.efs.openreports.providers.PropertiesProviderAware;
import org.efs.openreports.providers.ReportLogProvider;
import org.efs.openreports.providers.ReportLogProviderAware;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class ScheduledReportJob implements Job, ReportLogProviderAware, DirectoryProviderAware, MailProviderAware,
        AlertProviderAware, DataSourceProviderAware, PropertiesProviderAware {
    protected static Logger log = Logger.getLogger(ScheduledReportJob.class.getName());

    private ReportLogProvider reportLogProvider;
    private DirectoryProvider directoryProvider;
    private MailProvider mailProvider;
    private AlertProvider alertProvider;
    private DataSourceProvider dataSourceProvider;
    private PropertiesProvider propertiesProvider;

    public ScheduledReportJob() {
        ORComponentManager.initializeObject(this);
    }

    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.debug("Scheduled Report Executing....");

        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();

        ReportSchedule reportSchedule = (ReportSchedule) jobDataMap.get(ORStatics.REPORT_SCHEDULE);
        reportSchedule.setScheduleDescription(context.getJobDetail().getDescription());

        Report report = reportSchedule.getReport();
        ReportUser user = reportSchedule.getUser();
        Map reportParameters = reportSchedule.getReportParameters();

        log.debug("Report: " + report.getName());
        log.debug("User: " + user.getName());

        JRVirtualizer virtualizer = null;

        ReportLog reportLog = new ReportLog(user, report, new Date());

        try {
            //
            ReportUserAlert alert = reportSchedule.getAlert();

            if (alert != null) {
                log.debug("Executing Alert Condition");

                alert.setReport(report);
                alert = alertProvider.executeAlert(alert, true);

                if (!alert.isTriggered()) {
                    log.debug("Alert Not Triggered. Report not run.");
                    return;
                }

                log.debug("Alert Triggered. Running report.");
            }
            //         

            // add standard report parameters
            reportParameters.put(ORStatics.USER_ID, user.getId());
            reportParameters.put(ORStatics.EXTERNAL_ID, user.getExternalId());
            reportParameters.put(ORStatics.USER_NAME, user.getName());
            reportParameters.put(ORStatics.IMAGE_DIR, new File(directoryProvider.getReportImageDirectory()));
            reportParameters.put(ORStatics.REPORT_DIR, new File(directoryProvider.getReportDirectory()));
            //

            reportLogProvider.insertReportLog(reportLog);

            ReportEngineInput reportInput = new ReportEngineInput(report, reportParameters);
            reportInput.setExportType(reportSchedule.getExportType());

            if (report.isJasperReport()) {
                // add any charts
                if (report.getReportChart() != null) {
                    log.debug("Adding chart: " + report.getReportChart().getName());

                    ChartReportEngine chartEngine = new ChartReportEngine(dataSourceProvider, directoryProvider,
                            propertiesProvider);

                    ChartEngineOutput chartOutput = (ChartEngineOutput) chartEngine.generateReport(reportInput);

                    reportParameters.put("ChartImage", chartOutput.getContent());
                }

                if (report.isVirtualizationEnabled()) {
                    log.debug("Virtualization Enabled");
                    virtualizer = new JRFileVirtualizer(2, directoryProvider.getTempDirectory());
                    reportParameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
                }

                reportInput.setParameters(reportParameters);
                reportInput.setInlineImages(true);
            }

            ReportEngine reportEngine = ReportEngineHelper.getReportEngine(report, dataSourceProvider,
                    directoryProvider, propertiesProvider);

            //Use the JasperReportEngine to generate scheduled QueryReports
            if (report.isQueryReport()) {
                reportEngine = new JasperReportEngine(dataSourceProvider, directoryProvider, propertiesProvider);
            }

            ReportEngineOutput reportOutput = reportEngine.generateReport(reportInput);

            Vector htmlImageDataSources = new Vector();
            ByteArrayDataSource byteArrayDataSource = exportReport(reportOutput, reportSchedule,
                    htmlImageDataSources);

            MailMessage mail = new MailMessage();
            mail.setByteArrayDataSource(byteArrayDataSource);
            mail.addHtmlImageDataSources(htmlImageDataSources);
            mail.setSender(user.getEmail());
            mail.parseRecipients(reportSchedule.getRecipients());

            if (reportSchedule.getScheduleDescription() != null
                    && reportSchedule.getScheduleDescription().trim().length() > 0) {
                mail.setSubject(reportSchedule.getScheduleDescription());
            } else {
                mail.setSubject(report.getName());
            }

            if (reportSchedule.getExportType() != ReportEngine.EXPORT_HTML) {
                mail.setText(report.getName() + ": Generated on " + new Date());
            }

            mailProvider.sendMail(mail);

            log.debug(byteArrayDataSource.getName() + " sent to: " + mail.formatRecipients(";"));

            reportLog.setEndTime(new Date());
            reportLog.setStatus(ReportLog.STATUS_SUCCESS);
            reportLogProvider.updateReportLog(reportLog);

            log.debug("Scheduled Report Finished...");
        } catch (Exception e) {
            if (e.getMessage() != null && e.getMessage().indexOf("Empty") > 0) {
                reportLog.setStatus(ReportLog.STATUS_EMPTY);
            } else {
                e.printStackTrace();
                log.error(e.toString());

                reportLog.setMessage(e.getMessage());
                reportLog.setStatus(ReportLog.STATUS_FAILURE);
            }

            reportLog.setEndTime(new Date());

            try {
                reportLogProvider.updateReportLog(reportLog);
            } catch (Exception ex) {
                log.error("Unable to create ReportLog: " + ex.getMessage());
            }
        } finally {
            if (virtualizer != null) {
                reportParameters.remove(JRParameter.REPORT_VIRTUALIZER);
                virtualizer.cleanup();
            }
        }
    }

    protected ByteArrayDataSource exportReport(ReportEngineOutput reportOutput, ReportSchedule reportSchedule,
            Vector htmlImageDataSources) throws JRException {
        String reportName = StringUtils.deleteWhitespace(reportSchedule.getReport().getName());

        ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource(reportOutput.getContent(),
                reportOutput.getContentType());
        byteArrayDataSource.setName(reportName + reportOutput.getContentExtension());

        if (reportSchedule.getExportType() == ReportEngine.EXPORT_HTML
                && reportSchedule.getReport().isJasperReport()) {
            Map imagesMap = ((JasperReportEngineOutput) reportOutput).getImagesMap();

            for (Iterator entryIter = imagesMap.entrySet().iterator(); entryIter.hasNext();) {
                Map.Entry entry = (Map.Entry) entryIter.next();

                ByteArrayDataSource imageDataSource = new ByteArrayDataSource((byte[]) entry.getValue(),
                        getImageContentType((byte[]) entry.getValue()));

                imageDataSource.setName((String) entry.getKey());

                htmlImageDataSources.add(imageDataSource);
            }
        }

        return byteArrayDataSource;
    }

    /**
     * Try to figure out the image type from its bytes.
     */
    private String getImageContentType(byte[] bytes) {
        String header = new String(bytes, 0, (bytes.length > 100) ? 100 : bytes.length);
        if (header.startsWith("GIF")) {
            return "image/gif";
        }

        if (header.startsWith("BM")) {
            return "image/bmp";
        }

        if (header.indexOf("JFIF") >= 0) {
            return "image/jpeg";
        }

        if (header.indexOf("PNG") >= 0) {
            return "image/png";
        }

        // We are out of guesses, so just guess tiff
        return "image/tiff";
    }

    public void setReportLogProvider(ReportLogProvider reportLogProvider) {
        this.reportLogProvider = reportLogProvider;
    }

    public void setDirectoryProvider(DirectoryProvider directoryProvider) {
        this.directoryProvider = directoryProvider;
    }

    public void setMailProvider(MailProvider mailProvider) {
        this.mailProvider = mailProvider;
    }

    public void setAlertProvider(AlertProvider alertProvider) {
        this.alertProvider = alertProvider;
    }

    public void setDataSourceProvider(DataSourceProvider dataSourceProvider) {
        this.dataSourceProvider = dataSourceProvider;
    }

    public void setPropertiesProvider(PropertiesProvider propertiesProvider) {
        this.propertiesProvider = propertiesProvider;
    }
}