/**
*
* Processes the individual stats sheets reported by desktop clients
*
*/
package com.casamind.adware.server.servlet.mail;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.casamind.adware.server.domain.Company;
import com.casamind.adware.server.domain.Publisher;
import com.casamind.adware.server.domain.Slot;
import com.casamind.adware.server.domain.UserAccount;
import com.casamind.adware.server.proxy.DatastoreProxy;
import com.casamind.adware.server.proxy.MailProxy;
import com.casamind.adware.shared.MailTaskCategories;
import com.casamind.adware.shared.MailTaskTypes;
import com.casamind.adware.shared.Strings;
@SuppressWarnings("serial")
public class OutboundMailHandler extends HttpServlet {
private static final Logger log = Logger.getLogger(OutboundMailHandler.class.getName());
private String defaultSenderMail, defaultSenderName;
private Slot slot = null;
private Map<String, String> to, cc, bcc;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext context = config.getServletContext();
defaultSenderMail = context.getInitParameter("defaultSenderMail");
defaultSenderName = context.getInitParameter("defaultSenderName");
if (defaultSenderMail == null || "".equals(defaultSenderMail)) {
defaultSenderMail = "mouncif.faqir@casamind.com";
}
if (defaultSenderName == null || "".equals(defaultSenderName)) {
defaultSenderName = "Casamind MAROC";
}
to = new HashMap<String, String>();
cc = new HashMap<String, String>();
bcc = new HashMap<String, String>();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("Entering outbound mail servlet...");
DateFormat parseFormatter = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
SimpleDateFormat formatter = new SimpleDateFormat("EEE dd MMM yyyy HH:mm", Locale.FRANCE);
String category = req.getParameter("category");
String task = req.getParameter("task");
resp.setHeader("Content-Type", "text/html");
if (category.equals(MailTaskCategories.SLOT)) {
log.info("Peforming slot email task...");
Long entityId = Long.parseLong(req.getParameter("entityId"));
if (entityId != null && !"".equals(entityId)) {
slot = DatastoreProxy.getSlotById(entityId);
if (slot != null) {
UserAccount owner = DatastoreProxy.getOwnerById(slot.getOwnerId());
if (owner != null) {
setRecipientsBySlotId(owner);
if (task.equals(MailTaskTypes.SLOT_OREDERED)) {
log.info("Peforming slot order task...");
String body = getBodyContentTemplate("WEB-INF/files/templates/email_slot_ordered.html");
if (body != null) {
log.info("Peforming variables replacement on template file...");
body = body
.replace("$startDate", formatter.format(slot.getStartDate()))
.replace("$endDate", formatter.format(slot.getEndDate()))
.replace("$price", slot.getPrice().toString())
.replace("$slots", slot.getNbSlots().toString());
log.info("Email body ready for sending!");
String subject = "Votre demande de cr�neau";
MailProxy.sendMail(defaultSenderMail, defaultSenderName, to, cc, bcc, subject, body, "text/html", null, null, null);
} else {
log.warning("Message body is null due to invalid template!");
}
} else if (task.equals(MailTaskTypes.SLOT_INVOICED)) {
log.info("Peforming slot invoice task...");
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, 1);
// a month from now
Date dueDate = calendar.getTime();
String dueDateAsString = req.getParameter("dueDate");
String billingAddress = getBillingAddress(owner);
if (dueDateAsString != null && !"".equals(dueDateAsString)) {
try {
dueDate = parseFormatter.parse(dueDateAsString);
} catch (ParseException e) {
log.warning("Could not parse dueDate string! dueDate=" + dueDateAsString + "\nWill consider default dueDate (a month from now). dueDate: " + formatter.format(dueDate));
}
} else {
log.warning("dueDate paramter is null or empty! dueDate=" + dueDateAsString + "\nWill consider default dueDate (a month from now). dueDate: " + formatter.format(dueDate));
}
String billDownloadlink = req.getParameter("billDownloadlink");
if (billDownloadlink == null || "".equals(billDownloadlink)) {
log.warning("Invoice download link is null or empty.");
billDownloadlink = "http://publish.www.casamind.com";
}
String body = getBodyContentTemplate("WEB-INF/files/templates/email_slot_invoiced.html");
if (body != null) {
log.info("Peforming variables replacement on template file...");
body = body
.replace("$startDate", formatter.format(slot.getStartDate()))
.replace("$endDate", formatter.format(slot.getEndDate()))
.replace("$dueDate", new SimpleDateFormat("EEEE dd MMMM yyyy", Locale.FRANCE).format(dueDate))
.replace("$price", slot.getPrice().toString())
.replace("$slots", slot.getNbSlots().toString())
.replace("$address", billingAddress)
.replace("$billDownloadlink", billDownloadlink);
log.info("Email body ready for sending!");
String subject = "Votre facture est pr�te";
MailProxy.sendMail(defaultSenderMail, defaultSenderName, to, cc, bcc, subject, body, "text/html", null, null, null);
} else {
log.warning("Message body is null due to invalid template!");
}
} else if (task.equals(MailTaskTypes.SLOT_APPROVED)) {
log.info("Peforming slot approval task...");
String body = getBodyContentTemplate("WEB-INF/files/templates/email_slot_approved.html");
if (body != null) {
log.info("Peforming variables replacement on template file...");
body = body
.replace("$startDate", formatter.format(slot.getStartDate()))
.replace("$endDate", formatter.format(slot.getEndDate()))
.replace("$price", slot.getPrice().toString())
.replace("$slots", slot.getNbSlots().toString());
log.info("Email body ready for sending!");
String subject = "Votre cr�neau a �t� accord�";
MailProxy.sendMail(defaultSenderMail, defaultSenderName, to, cc, bcc, subject, body, "text/html", null, null, null);
} else {
log.warning("Message body is null due to invalid template!");
}
} else if (task.equals(MailTaskTypes.SLOT_CANCELLED)) {
log.info("Peforming slot cancellation task...");
String reason = req.getParameter("reason");
String userEmail = req.getParameter("userEmail");
String userNickname = req.getParameter("userNickname");
if (reason == null || !"".equals(reason)) {
log.warning("reason parameter string is null or empty. reason=" + reason);
reason = "NOT SPECIFIED BY USER";
}
String body = getBodyContentTemplate("WEB-INF/files/templates/email_slot_cancelled.html");
if (body != null) {
log.info("Peforming variables replacement on template file...");
body = body
.replace("$startDate", formatter.format(slot.getStartDate()))
.replace("$endDate", formatter.format(slot.getEndDate()))
.replace("$price", slot.getPrice().toString())
.replace("$slots", slot.getNbSlots().toString())
.replace("$reason", reason)
.replace("$userEmail", userEmail)
.replace("$userNickname", userNickname);
log.info("Email body ready for sending!");
String subject = "Votre cr�neau a �t� r�sili�";
MailProxy.sendMail(defaultSenderMail, defaultSenderName, to, cc, bcc, subject, body, "text/html", null, null, null);
} else {
log.warning("Message body is null due to invalid template!");
}
} else if (task.equals(MailTaskTypes.SLOT_REJECTED)) {
log.info("Peforming slot rejection task...");
String reason = req.getParameter("reason");
if (reason == null || !"".equals(reason)) {
log.warning("reason parameter string is null or empty. reason=" + reason);
reason = "NOT SPECIFIED BY ADMINISTRATOR. PLEASE CALL US!";
}
String body = getBodyContentTemplate("WEB-INF/files/templates/email_slot_rejected.html");
if (body != null) {
log.info("Peforming variables replacement on template file...");
body = body
.replace("$startDate", formatter.format(slot.getStartDate()))
.replace("$endDate", formatter.format(slot.getEndDate()))
.replace("$price", slot.getPrice().toString())
.replace("$slots", slot.getNbSlots().toString())
.replace("$reason", reason);
log.info("Email body ready for sending!");
String subject = "Votre demande de cr�neau n'a pas �t� retenue";
MailProxy.sendMail(defaultSenderMail, defaultSenderName, to, cc, bcc, subject, body, "text/html", null, null, null);
} else {
log.warning("Message body is null due to invalid template!");
}
}
} else {
log.warning("owner is null. Will exit servlet.");
}
} else {
log.warning("slot is null. Will exit servlet.");
}
} else {
log.warning("entityId is null or empty. Will exit servlet.");
}
}
}
private String getBodyContentTemplate(String templateFilePath) {
try {
log.info("Reading from template file: " + templateFilePath);
return Strings.convertStreamToString(new FileInputStream(templateFilePath));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void setRecipientsBySlotId(UserAccount owner) throws IllegalArgumentException {
String name = owner.getDisplayName();
String login = owner.getLogin();
if (Strings.isValidEmailAddress(login)) {
to.put(login, name);
String email = owner.getEmail();
if (Strings.isValidEmailAddress(email) && !email.equals(login)) {
cc.put(email, name);
}
try {
Publisher publisher = (Publisher) owner;
log.info("Owner is a publisher. Adding company to CC recipients...");
Company company = DatastoreProxy.getCompanyById(publisher.getCompanyId());
String companyName = company.getDisplayName();
String companyLogin = company.getLogin();
if (Strings.isValidEmailAddress(companyLogin)) {
cc.put(companyLogin, companyName);
String companyEmail = company.getEmail();
if (Strings.isValidEmailAddress(companyEmail) && !email.equals(companyLogin)) {
cc.put(companyEmail, companyName);
}
} else {
log.warning("Invalid company login!\n\tcompanyId: " + company.getId() + "\n\tlogin: " + company.getLogin());
}
} catch (ClassCastException e) {
log.info("Owner is a company.");
}
bcc.put("mouncif.faqir@casamind.com", "Mouncif FAQIR");
} else {
throw new IllegalArgumentException();
}
}
private String getBillingAddress (UserAccount owner){
String billingAddress = "";
try {
Company company = (Company) owner;
billingAddress = company.getBillingAddress();
} catch (ClassCastException e) {
Publisher publisher = (Publisher) owner;
Company company = DatastoreProxy.getCompanyById(publisher.getCompanyId());
if (company != null) {
billingAddress = company.getBillingAddress();
} else {
log.warning("Could not find company with id: " + publisher.getCompanyId() + "\nBilling address is void.");
}
}
return billingAddress;
}
}