/*
* Copyright (C) 2010-2014 Stichting Akvo (Akvo Foundation)
*
* This file is part of Akvo FLOW.
*
* Akvo FLOW is free software: you can redistribute it and modify it under the terms of
* the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
* either version 3 of the License or any later version.
*
* Akvo FLOW 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 Affero General Public License included below for more details.
*
* The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
*/
package org.waterforpeople.mapping.notification;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.gallatinsystems.common.util.MD5Util;
import com.gallatinsystems.common.util.MailUtil;
import com.gallatinsystems.common.util.PropertyUtil;
import com.gallatinsystems.common.util.S3Util;
import com.gallatinsystems.notification.NotificationRequest;
import com.gallatinsystems.notification.dao.NotificationSubscriptionDao;
import com.gallatinsystems.notification.domain.NotificationHistory;
import com.gallatinsystems.survey.dao.SurveyDAO;
import com.gallatinsystems.survey.domain.Survey;
/**
* base class that supports the generation of a report file. The report file will either be uploaded
* to S3 or emailed as an attachment. If it's uploaded to S3, the notification subscribers will be
* notified of the url to download the file via email. Subclasses need to simply provide the
* implementation of writing the report bytes to the print writer instantiated in this class.
*
* @author Christopher Fagiani
*/
public abstract class AbstractReportNotificationHandler extends
BaseNotificationHandler {
private static final Logger log = Logger.getLogger(AbstractReportNotificationHandler.class
.getName());
private static final String LINK_OPT = "LINK";
protected static final String AWS_IDENTIFIER = "aws_identifier";
protected static final String SURVEY_UPLOAD_URL = "surveyuploadurl";
protected static final String REPORT_S3_PATH = "reportS3Path";
protected static final String DATE_DISPLAY_FORMAT = "MMddyyyy";
protected static final String ATTACH_REPORT_FLAG = "attachreport";
/**
* generates the report and sends it as an email attachment
*/
@Override
public void generateNotification(String type, Long entityId,
String destinations, String destOptions, String serverBase) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintWriter pw = new PrintWriter(bos);
writeReport(entityId, serverBase, pw);
NotificationHistory hist = getHistory(type, entityId);
String newChecksum = MD5Util.generateChecksum(bos.toByteArray());
SurveyDAO surveyDao = new SurveyDAO();
Survey survey = surveyDao.getById(entityId);
String emailTitle = getEmailSubject() + survey.getPath() + "/"
+ survey.getName();
String emailBody = getEmailBody() + survey.getPath() + "/"
+ survey.getName() + " ";
String bucketName = PropertyUtil.getProperty("s3bucket");
String keyPrefix = PropertyUtil.getProperty(REPORT_S3_PATH);
if (bos.size() > 0) {
if (hist.getChecksum() == null
|| !hist.getChecksum().equals(newChecksum)) {
hist.setChecksum(newChecksum);
TreeMap<String, String> linkAddrList = new TreeMap<String, String>();
List<String> attachAddrList = new ArrayList<String>();
StringTokenizer strTok = new StringTokenizer(destinations,
NotificationRequest.DELIMITER);
StringTokenizer optTok = new StringTokenizer(destOptions,
NotificationRequest.DELIMITER);
while (strTok.hasMoreTokens()) {
String item = strTok.nextToken();
String opt = optTok.nextToken();
if ("false".equalsIgnoreCase(PropertyUtil
.getProperty(ATTACH_REPORT_FLAG))
|| LINK_OPT.equalsIgnoreCase(opt)) {
linkAddrList.put(item, item);
} else {
attachAddrList.add(item);
}
}
if (linkAddrList.size() > 0) {
String fileName = getFileName(entityId.toString());
boolean success = false;
try {
success = S3Util.put(bucketName, keyPrefix + "/" + fileName,
bos.toByteArray(), "text/plain", false);
} catch (IOException e) {
log.log(Level.SEVERE, "Error uploading file: " + e.getMessage(), e);
}
if (!success) {
return; // skip email
}
sendMail(
linkAddrList,
emailTitle,
emailBody
+ PropertyUtil
.getProperty(SURVEY_UPLOAD_URL)
+ PropertyUtil.getProperty(REPORT_S3_PATH)
+ "/" + fileName);
}
if (attachAddrList.size() > 0) {
String surveyCodeFormatted = getFileName(entityId
.toString());
MailUtil.sendMail(FROM_ADDRESS, attachAddrList, emailTitle,
emailBody, bos.toByteArray(), surveyCodeFormatted,
"text/plain");
}
NotificationSubscriptionDao.saveNotificationHistory(hist);
}
}
pw.close();
}
/**
* method responsible for actually writing the bytes of the report
*
* @param entityId
* @param serverBase
* @param pw
*/
protected abstract void writeReport(Long entityId, String serverBase,
PrintWriter pw);
protected abstract String getEmailBody();
protected abstract String getEmailSubject();
protected abstract String getFileName(String entityId);
}