package com.ciandt.techgallery.service.impl;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.googlecode.objectify.Key;
import com.ciandt.techgallery.Constants;
import com.ciandt.techgallery.persistence.dao.EmailNotificationDAO;
import com.ciandt.techgallery.persistence.dao.impl.EmailNotificationDAOImpl;
import com.ciandt.techgallery.persistence.model.EmailNotification;
import com.ciandt.techgallery.service.EmailService;
import com.ciandt.techgallery.service.email.EmailConfig;
import com.ciandt.techgallery.utils.TechGalleryUtil;
import com.ciant.techgallery.transaction.Transactional;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Date;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
@Transactional
public class EmailServiceImpl implements EmailService {
/*
* Attributes --------------------------------------------
*/
private static EmailServiceImpl instance;
private static final Logger log = Logger.getLogger(EmailServiceImpl.class.getName());
private static final String queueName = "email-queue";
private static final String queueUrl = "/mail";
/*
* Constructors --------------------------------------------
*/
private EmailServiceImpl() {
}
/**
* Singleton method for the service.
*
* @author <a href="mailto:joaom@ciandt.com"> João Felipe de Medeiros
* Moreira </a>
* @since 09/10/2015
*
* @return EmailServiceImpl instance.
*/
public static EmailServiceImpl getInstance() {
if (instance == null) {
instance = new EmailServiceImpl();
}
return instance;
}
private InternetAddress from = null;
private EmailNotificationDAO emailNotificationDao = EmailNotificationDAOImpl.getInstance();
/**
* Push email to queue.
*/
public void push(EmailConfig email) {
QueueFactory.getQueue(queueName).add(
TaskOptions.Builder.withUrl(queueUrl).param("subject", email.getSubject())
.param("body", email.getBody()).param("reason", email.getReason())
.param("to", email.getTo()[0]));
}
public void execute(String subject, String body, String reason, String to) {
sendEmail(new EmailConfig(subject, body, reason, to));
}
private void sendEmail(EmailConfig email) {
try {
Message msg = prepareMessage(email);
Transport.send(msg);
registerEmailNotification(email, true);
} catch (Throwable err) {
Long notificationId = registerEmailNotification(email, false);
log.log(Level.SEVERE, "Error when attempting to send email " + notificationId, err);
}
}
private Message prepareMessage(EmailConfig email) throws UnsupportedEncodingException,
MessagingException {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(getFrom());
for (String to : email.getTo()) {
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
}
msg.setContent(email.getBody(), "text/html");
msg.setSubject(email.getSubject(), "UTF-8");
return msg;
}
private long registerEmailNotification(EmailConfig email, boolean success) {
EmailNotification emailNotification = new EmailNotification();
emailNotification.setRecipients(Arrays.asList(email.getTo()));
emailNotification.setReason(email.getReason());
emailNotification.setTimestampSend(new Date());
emailNotification.setEmailStatus(success ? "SUCCESS" : "FAILURE");
Key<EmailNotification> key = emailNotificationDao.add(emailNotification);
return key.getId();
}
private InternetAddress getFrom() throws UnsupportedEncodingException {
if (from == null) {
String addr = "no-reply@" + TechGalleryUtil.getAppId() + ".com";
log.info("app email from address set to: " + Constants.APP_EMAIL);
from = new InternetAddress(Constants.APP_EMAIL, addr);
}
return from;
}
}