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

Java tutorial

Introduction

Here is the source code for org.efs.openreports.delivery.EMailDeliveryMethod.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 java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.efs.openreports.ReportConstants.ExportType;
import org.efs.openreports.engine.output.JasperReportEngineOutput;
import org.efs.openreports.engine.output.ReportEngineOutput;
import org.efs.openreports.objects.DeliveredReport;
import org.efs.openreports.objects.MailMessage;
import org.efs.openreports.objects.ReportSchedule;
import org.efs.openreports.objects.ReportUser;
import org.efs.openreports.providers.MailProvider;
import org.efs.openreports.providers.ProviderException;
import org.efs.openreports.util.ByteArrayDataSource;

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

    private MailProvider mailProvider;

    public void deliverReport(ReportSchedule reportSchedule, ReportEngineOutput reportOutput)
            throws DeliveryException {
        ArrayList<ByteArrayDataSource> htmlImageDataSources = new ArrayList<ByteArrayDataSource>();

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

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

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

        if (reportSchedule.getExportType() != ExportType.HTML.getCode()) {
            mail.setText(reportSchedule.getReport().getName() + ": Generated on " + new Date());
        }

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

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

    public byte[] getDeliveredReport(DeliveredReport deliveredReport) throws DeliveryException {
        throw new DeliveryException("Method getDeliveredReport not implemented by EMailDeliveryMethod");
    }

    public DeliveredReport[] getDeliveredReports(ReportUser user) throws DeliveryException {
        throw new DeliveryException("Method getDeliveredReports not implemented by EMailDeliveryMethod");
    }

    protected ByteArrayDataSource exportReport(ReportEngineOutput reportOutput, ReportSchedule reportSchedule,
            ArrayList<ByteArrayDataSource> htmlImageDataSources) {
        String reportName = StringUtils.deleteWhitespace(reportSchedule.getReport().getName());

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

        if (reportSchedule.getExportType() == ExportType.HTML.getCode()) {
            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 setMailProvider(MailProvider mailProvider) {
        this.mailProvider = mailProvider;
    }
}