package com.casamind.adware.server.servlet.rpc;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Logger;
import javax.mail.Message;
import javax.mail.internet.InternetAddress;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import com.casamind.adware.client.service.MailService;
import com.casamind.adware.server.billing.BillingFactory;
import com.casamind.adware.server.domain.Slot;
import com.casamind.adware.server.proxy.GDataDocumentsProxy;
import com.casamind.adware.shared.MailTaskCategories;
import com.casamind.adware.shared.MailTaskTypes;
import com.casamind.adware.shared.model.CompanySummaryDTO;
import com.casamind.adware.shared.model.SlotDTO;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.users.UserServiceFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@SuppressWarnings("serial")
public class MailServiceImpl extends RemoteServiceServlet implements
MailService {
private static final Logger log = Logger.getLogger(MailServiceImpl.class.getName());
private String gdataWebLogin, gdataWebPassword, gdataAdminLogin,
documentsFeedUrl, spreadsheetFeedUrl, gdataAdminPassword,
adminSpreadsheet, advertizingSlotsFrameURL,
readonlyCalendarFrameURL;
private GDataDocumentsProxy gdataProxy;
private long gdataThreadSleep;
private long gdataConnectTimeout;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext context = config.getServletContext();
gdataThreadSleep = Long.parseLong(context.getInitParameter("gdataThreadSleep"));
gdataConnectTimeout = Long.parseLong(context.getInitParameter("gdataConnectTimeout"));
gdataWebLogin = context.getInitParameter("gdataWebLogin");
gdataWebPassword = context.getInitParameter("gdataWebPassword");
gdataAdminLogin = context.getInitParameter("gdataAdminLogin");
gdataAdminPassword = context.getInitParameter("gdataAdminPassword");
adminSpreadsheet = context.getInitParameter("adminSpreadsheet");
documentsFeedUrl = context.getInitParameter("documentsFeedUrl");
spreadsheetFeedUrl = context.getInitParameter("spreadsheetFeedUrl");
advertizingSlotsFrameURL = context.getInitParameter("advertizingSlotsFrameURL");
readonlyCalendarFrameURL = context.getInitParameter("readonlyCalendarFrameURL");
gdataProxy = new GDataDocumentsProxy(documentsFeedUrl, spreadsheetFeedUrl, gdataWebLogin, gdataWebPassword, gdataThreadSleep, gdataConnectTimeout);
}
@Override
public void slotsCancelled(List<SlotDTO> objects, String reason) {
// the provided list may contain slots from different companies.
// one should sort the list into distinct lists of slots by company
// the followin map will contain this sorted list
// Key = companyId, Value = list of slots' ids (belonging to this
// company)
for (Map.Entry<CompanySummaryDTO, List<SlotDTO>> entry : Slot.sortByCompany(objects).entrySet()) {
String entityIds = "";
String out = "Queuing cancellation mail task for company " + entry.getKey().getDisplayName() + " with the following slots ";
for (SlotDTO dto : entry.getValue()) {
entityIds += dto.getId() + ",";
}
if (entityIds.endsWith(",")) {
entityIds = entityIds.substring(0, entityIds.length() - 1);
}
out += "[" + entityIds + "]";
log.info(out);
try {
QueueFactory.getQueue("mail").add(TaskOptions.Builder.withUrl("/tasks/mail")
.param("category", MailTaskCategories.SLOT)
.param("task", MailTaskTypes.SLOT_CANCELLED)
.param("companyId", entry.getKey().getId().toString())
.param("entityIds", entityIds)
.param("reason", reason)
.param("userEmail", UserServiceFactory.getUserService().getCurrentUser().getEmail())
.param("userNickname", UserServiceFactory.getUserService().getCurrentUser().getNickname()));
log.info("Taske queued successfully!");
} catch (Exception e) {
log.warning("Exception occured. See bellow for more details!");
e.printStackTrace();
}
}
}
@Override
public void slotsRejected(List<SlotDTO> objects, String reason) {
for (Map.Entry<CompanySummaryDTO, List<SlotDTO>> entry : Slot.sortByCompany(objects).entrySet()) {
String entityIds = "";
String out = "Queuing rejection mail task for company " + entry.getKey().getDisplayName() + " with the following slots ";
for (SlotDTO dto : entry.getValue()) {
entityIds += dto.getId() + ",";
}
if (entityIds.endsWith(",")) {
entityIds = entityIds.substring(0, entityIds.length() - 1);
}
out += "[" + entityIds + "]";
log.info(out);
try {
QueueFactory.getQueue("mail").add(TaskOptions.Builder.withUrl("/tasks/mail")
.param("category", MailTaskCategories.SLOT)
.param("task", MailTaskTypes.SLOT_REJECTED)
.param("companyId", entry.getKey().getId().toString())
.param("entityIds", entityIds)
.param("reason", reason)
.param("userEmail", UserServiceFactory.getUserService().getCurrentUser().getEmail())
.param("userNickname", UserServiceFactory.getUserService().getCurrentUser().getNickname()));
log.info("Taske queued successfully!");
} catch (Exception e) {
log.warning("Exception occured. See bellow for more details!");
e.printStackTrace();
}
}
}
@Override
public void slotsApproved(List<SlotDTO> objects) {
for (Map.Entry<CompanySummaryDTO, List<SlotDTO>> entry : Slot.sortByCompany(objects).entrySet()) {
String entityIds = "";
String out = "Queuing approval mail task for company " + entry.getKey().getDisplayName() + " with the following slots ";
for (SlotDTO dto : entry.getValue()) {
entityIds += dto.getId() + ",";
}
if (entityIds.endsWith(",")) {
entityIds = entityIds.substring(0, entityIds.length() - 1);
}
out += "[" + entityIds + "]";
log.info(out);
try {
QueueFactory.getQueue("mail").add(TaskOptions.Builder.withUrl("/tasks/mail")
.param("category", MailTaskCategories.SLOT)
.param("task", MailTaskTypes.SLOT_APPROVED)
.param("companyId", entry.getKey().getId().toString())
.param("entityIds", entityIds)
.param("userEmail", UserServiceFactory.getUserService().getCurrentUser().getEmail())
.param("userNickname", UserServiceFactory.getUserService().getCurrentUser().getNickname()));
log.info("Taske queued successfully!");
} catch (Exception e) {
log.warning("Exception occured. See bellow for more details!");
e.printStackTrace();
}
}
}
@Override
public void slotsInvoiced(List<SlotDTO> objects, Date dueDate) {
for (Map.Entry<CompanySummaryDTO, List<SlotDTO>> entry : Slot.sortByCompany(objects).entrySet()) {
String entityIds = "";
String out = "Queuing invoice mail task for company " + entry.getKey().getDisplayName() + " with the following slots ";
for (SlotDTO dto : entry.getValue()) {
entityIds += dto.getId() + ",";
}
if (entityIds.endsWith(",")) {
entityIds = entityIds.substring(0, entityIds.length() - 1);
}
out += "[" + entityIds + "]";
log.info(out);
try {
String billDownloadlink = BillingFactory.invoice(gdataProxy, objects, dueDate);
QueueFactory.getQueue("mail").add(TaskOptions.Builder.withUrl("/tasks/mail")
.param("category", MailTaskCategories.SLOT)
.param("task", MailTaskTypes.SLOT_INVOICED)
.param("companyId", entry.getKey().getId().toString())
.param("entityIds", entityIds)
.param("billDownloadlink", billDownloadlink)
.param("dueDate", DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE).format(dueDate))
.param("userEmail", UserServiceFactory.getUserService().getCurrentUser().getEmail())
.param("userNickname", UserServiceFactory.getUserService().getCurrentUser().getNickname()));
log.info("Taske queued successfully!");
} catch (Exception e) {
log.warning("Exception occured. See bellow for more details!");
e.printStackTrace();
}
}
}
@Override
public void slotsOrdered(List<SlotDTO> objects) {
for (Map.Entry<CompanySummaryDTO, List<SlotDTO>> entry : Slot.sortByCompany(objects).entrySet()) {
String entityIds = "";
String out = "Queuing approval mail task for company " + entry.getKey().getDisplayName() + " with the following slots ";
for (SlotDTO dto : entry.getValue()) {
entityIds += dto.getId() + ",";
}
if (entityIds.endsWith(",")) {
entityIds = entityIds.substring(0, entityIds.length() - 1);
}
out += "[" + entityIds + "]";
log.info(out);
try {
QueueFactory.getQueue("mail").add(TaskOptions.Builder.withUrl("/tasks/mail")
.param("category", MailTaskCategories.SLOT)
.param("task", MailTaskTypes.SLOT_OREDERED)
.param("companyId", entry.getKey().getId().toString())
.param("entityIds", entityIds)
.param("userEmail", UserServiceFactory.getUserService().getCurrentUser().getEmail())
.param("userNickname", UserServiceFactory.getUserService().getCurrentUser().getNickname()));
log.info("Taske queued successfully!");
} catch (Exception e) {
log.warning("Exception occured. See bellow for more details!");
e.printStackTrace();
}
}
}
@Override
public void schedulePublished(Long scheduleId) {
log.info("Queuing publication mail task for schedule: " + scheduleId);
try {
QueueFactory.getQueue("mail").add(TaskOptions.Builder.withUrl("/tasks/mail").param("category", MailTaskCategories.SCHEDULE).param("task", MailTaskTypes.SCHEDULE_PUBLISHED).param("entityId", scheduleId != null ? scheduleId.toString() : ""));
log.info("Taske queued successfully!");
} catch (Exception e) {
log.warning("Exception occured. See bellow for more details!");
e.printStackTrace();
}
}
}