/* /* * 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; } }