001: /*
002: /*
003: * Copyright (C) 2007 Erik Swenson - erik@oreports.com
004: *
005: * This program is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License as published by the Free
007: * Software Foundation; either version 2 of the License, or (at your option)
008: * any later version.
009: *
010: * This program is distributed in the hope that it will be useful, but WITHOUT
011: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
012: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
013: * more details.
014: *
015: * You should have received a copy of the GNU General Public License along with
016: * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
017: * Place - Suite 330, Boston, MA 02111-1307, USA.
018: *
019: */
020: package org.efs.openreports.delivery;
021:
022: import com.thoughtworks.xstream.XStream;
023: import java.io.File;
024: import java.io.FileInputStream;
025: import java.io.FileOutputStream;
026: import java.io.IOException;
027: import java.util.ArrayList;
028: import java.util.Date;
029: import java.util.Iterator;
030: import org.apache.commons.io.FileUtils;
031: import org.apache.commons.io.FilenameUtils;
032: import org.apache.commons.io.filefilter.FileFilterUtils;
033: import org.apache.commons.io.filefilter.IOFileFilter;
034: import org.apache.commons.lang.StringUtils;
035: import org.apache.log4j.Logger;
036: import org.efs.openreports.engine.output.ReportEngineOutput;
037: import org.efs.openreports.objects.DeliveredReport;
038: import org.efs.openreports.objects.MailMessage;
039: import org.efs.openreports.objects.Report;
040: import org.efs.openreports.objects.ReportSchedule;
041: import org.efs.openreports.objects.ReportUser;
042: import org.efs.openreports.providers.DirectoryProvider;
043: import org.efs.openreports.providers.MailProvider;
044: import org.efs.openreports.providers.ProviderException;
045:
046: public class FileSystemDeliveryMethod implements DeliveryMethod {
047: protected static Logger log = Logger
048: .getLogger(FileSystemDeliveryMethod.class.getName());
049:
050: private MailProvider mailProvider;
051: private DirectoryProvider directoryProvider;
052:
053: public void deliverReport(ReportSchedule reportSchedule,
054: ReportEngineOutput reportOutput) throws DeliveryException {
055: Report report = reportSchedule.getReport();
056: ReportUser user = reportSchedule.getUser();
057:
058: Date runDate = new Date();
059:
060: String fileName = runDate.getTime() + "-"
061: + StringUtils.deleteWhitespace(user.getName()) + "-"
062: + StringUtils.deleteWhitespace(report.getName());
063:
064: try {
065: FileOutputStream file = new FileOutputStream(
066: directoryProvider.getReportGenerationDirectory()
067: + fileName
068: + reportOutput.getContentExtension());
069:
070: file.write(reportOutput.getContent());
071: file.flush();
072: file.close();
073: } catch (IOException ioe) {
074: throw new DeliveryException(ioe);
075: }
076:
077: DeliveredReport info = new DeliveredReport();
078: info.setParameters(reportSchedule.getReportParameters());
079: info.setReportDescription(reportSchedule
080: .getScheduleDescription());
081: info.setReportName(report.getName());
082: info.setReportFileName(fileName
083: + reportOutput.getContentExtension());
084: info.setRunDate(runDate);
085: info.setUserName(user.getName());
086: info.setDeliveryMethod("fileSystemDeliveryMethod");
087:
088: try {
089: FileOutputStream file = new FileOutputStream(
090: directoryProvider.getReportGenerationDirectory()
091: + fileName + ".xml");
092:
093: XStream xStream = new XStream();
094: xStream
095: .alias("reportGenerationInfo",
096: DeliveredReport.class);
097: xStream.toXML(info, file);
098:
099: file.flush();
100: file.close();
101: } catch (IOException ioe) {
102: throw new DeliveryException(ioe);
103: }
104:
105: MailMessage mail = new MailMessage();
106: mail.setSender(user.getEmail());
107: mail.parseRecipients(reportSchedule.getRecipients());
108: mail.setText(report.getName() + ": Generated on " + new Date());
109: mail
110: .setBounceAddress(reportSchedule
111: .getDeliveryReturnAddress());
112:
113: if (reportSchedule.getScheduleDescription() != null
114: && reportSchedule.getScheduleDescription().trim()
115: .length() > 0) {
116: mail.setSubject(reportSchedule.getScheduleDescription());
117: } else {
118: mail.setSubject(reportSchedule.getReport().getName());
119: }
120:
121: try {
122: mailProvider.sendMail(mail);
123: } catch (ProviderException pe) {
124: throw new DeliveryException(pe);
125: }
126:
127: log.debug(report.getName() + " written to: " + fileName);
128: }
129:
130: public DeliveredReport[] getDeliveredReports(ReportUser user)
131: throws DeliveryException {
132: IOFileFilter extensionFilter = FileFilterUtils
133: .suffixFileFilter("xml");
134:
135: File directory = new File(directoryProvider
136: .getReportGenerationDirectory());
137:
138: ArrayList<DeliveredReport> deliveredReports = new ArrayList<DeliveredReport>();
139:
140: Iterator iterator = FileUtils.iterateFiles(directory,
141: extensionFilter, null);
142: while (iterator.hasNext()) {
143: File file = (File) iterator.next();
144:
145: if (FilenameUtils.wildcardMatch(file.getName(), "*"
146: + user.getName() + "*")) {
147: XStream xStream = new XStream();
148: xStream.alias("reportGenerationInfo",
149: DeliveredReport.class);
150:
151: try {
152: FileInputStream inputStream = new FileInputStream(
153: file);
154:
155: DeliveredReport report = (DeliveredReport) xStream
156: .fromXML(inputStream);
157:
158: deliveredReports.add(report);
159:
160: inputStream.close();
161: } catch (IOException io) {
162: log.warn(io.toString());
163: }
164: }
165: }
166:
167: DeliveredReport[] reports = new DeliveredReport[deliveredReports
168: .size()];
169: deliveredReports.toArray(reports);
170:
171: return reports;
172: }
173:
174: public byte[] getDeliveredReport(DeliveredReport deliveredReport)
175: throws DeliveryException {
176: try {
177: File file = new File(directoryProvider
178: .getReportGenerationDirectory()
179: + deliveredReport.getReportFileName());
180: return FileUtils.readFileToByteArray(file);
181: } catch (IOException ioe) {
182: throw new DeliveryException(ioe);
183: }
184: }
185:
186: public void setDirectoryProvider(DirectoryProvider directoryProvider) {
187: this .directoryProvider = directoryProvider;
188: }
189:
190: public void setMailProvider(MailProvider mailProvider) {
191: this.mailProvider = mailProvider;
192: }
193: }
|