org.efs.openreports.delivery.FileSystemDeliveryMethod.java Source code

Java tutorial

Introduction

Here is the source code for org.efs.openreports.delivery.FileSystemDeliveryMethod.java

Source

/*
/*
 * Copyright (C) 2007 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 reserved 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.delivery;

import com.thoughtworks.xstream.XStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.efs.openreports.engine.output.ReportEngineOutput;
import org.efs.openreports.objects.DeliveredReport;
import org.efs.openreports.objects.MailMessage;
import org.efs.openreports.objects.Report;
import org.efs.openreports.objects.ReportSchedule;
import org.efs.openreports.objects.ReportUser;
import org.efs.openreports.providers.DirectoryProvider;
import org.efs.openreports.providers.MailProvider;
import org.efs.openreports.providers.ProviderException;

public class FileSystemDeliveryMethod implements DeliveryMethod {
    protected static Logger log = Logger.getLogger(FileSystemDeliveryMethod.class.getName());

    private MailProvider mailProvider;
    private DirectoryProvider directoryProvider;

    public void deliverReport(ReportSchedule reportSchedule, ReportEngineOutput reportOutput)
            throws DeliveryException {
        Report report = reportSchedule.getReport();
        ReportUser user = reportSchedule.getUser();

        Date runDate = new Date();

        String fileName = runDate.getTime() + "-" + StringUtils.deleteWhitespace(user.getName()) + "-"
                + StringUtils.deleteWhitespace(report.getName());

        try {
            FileOutputStream file = new FileOutputStream(directoryProvider.getReportGenerationDirectory() + fileName
                    + reportOutput.getContentExtension());

            file.write(reportOutput.getContent());
            file.flush();
            file.close();
        } catch (IOException ioe) {
            throw new DeliveryException(ioe);
        }

        DeliveredReport info = new DeliveredReport();
        info.setParameters(reportSchedule.getReportParameters());
        info.setReportDescription(reportSchedule.getScheduleDescription());
        info.setReportName(report.getName());
        info.setReportFileName(fileName + reportOutput.getContentExtension());
        info.setRunDate(runDate);
        info.setUserName(user.getName());
        info.setDeliveryMethod("fileSystemDeliveryMethod");

        try {
            FileOutputStream file = new FileOutputStream(
                    directoryProvider.getReportGenerationDirectory() + fileName + ".xml");

            XStream xStream = new XStream();
            xStream.alias("reportGenerationInfo", DeliveredReport.class);
            xStream.toXML(info, file);

            file.flush();
            file.close();
        } catch (IOException ioe) {
            throw new DeliveryException(ioe);
        }

        MailMessage mail = new MailMessage();
        mail.setSender(user.getEmail());
        mail.parseRecipients(reportSchedule.getRecipients());
        mail.setText(report.getName() + ": Generated on " + new Date());
        mail.setBounceAddress(reportSchedule.getDeliveryReturnAddress());

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

        try {
            mailProvider.sendMail(mail);
        } catch (ProviderException pe) {
            throw new DeliveryException(pe);
        }

        log.debug(report.getName() + " written to: " + fileName);
    }

    public DeliveredReport[] getDeliveredReports(ReportUser user) throws DeliveryException {
        IOFileFilter extensionFilter = FileFilterUtils.suffixFileFilter("xml");

        File directory = new File(directoryProvider.getReportGenerationDirectory());

        ArrayList<DeliveredReport> deliveredReports = new ArrayList<DeliveredReport>();

        Iterator iterator = FileUtils.iterateFiles(directory, extensionFilter, null);
        while (iterator.hasNext()) {
            File file = (File) iterator.next();

            if (FilenameUtils.wildcardMatch(file.getName(), "*" + user.getName() + "*")) {
                XStream xStream = new XStream();
                xStream.alias("reportGenerationInfo", DeliveredReport.class);

                try {
                    FileInputStream inputStream = new FileInputStream(file);

                    DeliveredReport report = (DeliveredReport) xStream.fromXML(inputStream);

                    deliveredReports.add(report);

                    inputStream.close();
                } catch (IOException io) {
                    log.warn(io.toString());
                }
            }
        }

        DeliveredReport[] reports = new DeliveredReport[deliveredReports.size()];
        deliveredReports.toArray(reports);

        return reports;
    }

    public byte[] getDeliveredReport(DeliveredReport deliveredReport) throws DeliveryException {
        try {
            File file = new File(
                    directoryProvider.getReportGenerationDirectory() + deliveredReport.getReportFileName());
            return FileUtils.readFileToByteArray(file);
        } catch (IOException ioe) {
            throw new DeliveryException(ioe);
        }
    }

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

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