/* Jug Management is a web application conceived to manage user groups or
* communities focused on a certain domain of knowledge, whose members are
* constantly sharing information and participating in social and educational
* events. Copyright (C) 2011 Ceara Java User Group - CEJUG.
*
* This application is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* This application 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 Lesser General Public
* License for more details.
*
* There is a full copy of the GNU Lesser General Public License along with
* this library. Look for the file license.txt at the root level. If you do not
* find it, write to the Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA.
* */
package org.cejug.yougi.business;
import org.cejug.yougi.entity.ApplicationProperty;
import org.cejug.yougi.entity.EmailMessage;
import org.cejug.yougi.entity.AccessGroup;
import org.cejug.yougi.entity.MessageHistory;
import org.cejug.yougi.entity.MessageTemplate;
import org.cejug.yougi.entity.DeactivationType;
import org.cejug.yougi.entity.UserAccount;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.cejug.yougi.entity.Properties;
import org.cejug.yougi.event.entity.Event;
import org.cejug.yougi.util.TextUtils;
/**
* Centralizes the posting of all email messages sent by the system and manage
* the history of those messages. Each kind of message has a method, which can
* be involked from different parts of the business logic.
* @author Hildeberto Mendonca - http://www.hildeberto.com
*/
@Stateless
@LocalBean
public class MessengerBean {
@PersistenceContext
private EntityManager em;
@Resource(name = "mail/jug")
private Session mailSession;
@EJB
private MessageTemplateBsn messageTemplateBsn;
@EJB
private ApplicationPropertyBsn applicationPropertyBsn;
@EJB
private MessageHistoryBean messageHistoryBean;
static final Logger logger = Logger.getLogger(MessengerBean.class.getName());
public void sendEmailConfirmationRequest(UserAccount userAccount, String serverAddress) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("E3F122DCC87D42248872878412B34CEE");
Map<String, Object> values = new HashMap<>();
values.put("serverAddress", serverAddress);
values.put("userAccount.firstName", userAccount.getFirstName());
values.put("userAccount.confirmationCode", userAccount.getConfirmationCode());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the mail confirmation. The registration was not finalized.", me);
}
}
public void sendWelcomeMessage(UserAccount userAccount) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("47DEE5C2E0E14F8BA4605F3126FBFAF4");
Map<String, Object> values = new HashMap<>();
values.put("userAccount.firstName", userAccount.getFirstName());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the deactivation reason to user "+ userAccount.getPostingEmail(), me);
}
}
public void sendNewMemberAlertMessage(UserAccount userAccount, List<UserAccount> leaders) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("0D6F96382D91454F8155A720F3326F1B");
Map<String, Object> values = new HashMap<>();
values.put("userAccount.fullName", userAccount.getFullName());
values.put("userAccount.registrationDate", userAccount.getRegistrationDate());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending alert to administrators about the registration of "+ userAccount.getPostingEmail(), me);
}
}
public void sendDeactivationReason(UserAccount userAccount) {
MessageTemplate messageTemplate;
if(userAccount.getDeactivationType() == DeactivationType.ADMINISTRATIVE) {
messageTemplate = messageTemplateBsn.findMessageTemplate("03BD6F3ACE4C48BD8660411FC8673DB4");
}
else {
messageTemplate = messageTemplateBsn.findMessageTemplate("IKWMAJSNDOE3F122DCC87D4224887287");
}
em.detach(messageTemplate);
Map<String, Object> values = new HashMap<>();
values.put("userAccount.firstName", userAccount.getFirstName());
values.put("userAccount.deactivationReason", userAccount.getDeactivationReason());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the deactivation reason to user "+ userAccount.getPostingEmail(), me);
}
}
public void sendDeactivationAlertMessage(UserAccount userAccount, List<UserAccount> leaders) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("0D6F96382IKEJSUIWOK5A720F3326F1B");
Map<String, Object> values = new HashMap<>();
values.put("userAccount.fullName", userAccount.getFullName());
values.put("userAccount.deactivationReason", userAccount.getDeactivationReason());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the deactivation reason from "+ userAccount.getPostingEmail() +" to leaders.", me);
}
}
public void sendConfirmationCode(UserAccount userAccount, String serverAddress) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("67BE6BEBE45945D29109A8D6CD878344");
Map<String, Object> values = new HashMap<>();
values.put("serverAddress", serverAddress);
values.put("userAccount.firstName", userAccount.getFirstName());
values.put("userAccount.confirmationCode", userAccount.getConfirmationCode());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the mail confirmation. The registration was not finalized.", me);
}
}
/**
* Sends a email to the user that requested to change his/her email address,
* asking him/her to confirm the request by clicking on the informed link. If
* the user successfully click on the link it means that his/her email address
* is valid since he/she could receive the email message successfully.
* @param userAccount the user who wants to change his/her email address.
* @param serverAddress the URL of the server where the application is deployed.
* it will be used to build the URL that the user will click to validate his/her
* email address.
*/
public void sendEmailVerificationRequest(UserAccount userAccount, String serverAddress) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("KJZISKQBE45945D29109A8D6C92IZJ89");
Map<String, Object> values = new HashMap<>();
values.put("serverAddress", serverAddress);
values.put("userAccount.firstName", userAccount.getFirstName());
values.put("userAccount.email", userAccount.getEmail());
values.put("userAccount.unverifiedEmail", userAccount.getUnverifiedEmail());
values.put("userAccount.confirmationCode", userAccount.getConfirmationCode());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the mail confirmation. The registration was not finalized.", me);
}
}
public void sendGroupAssignmentAlert(UserAccount userAccount, AccessGroup accessGroup) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("09JDIIE82O39IDIDOSJCHXUDJJXHCKP0");
Map<String, Object> values = new HashMap<>();
values.put("userAccount.firstName", userAccount.getFirstName());
values.put("accessGroup.name", accessGroup.getName());
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the group assignment alert to "+ userAccount.getFullName(), me);
}
}
public void sendConfirmationEventAttendance(UserAccount userAccount, Event event, String dateFormat, String timeFormat, String timezone) {
MessageTemplate messageTemplate = messageTemplateBsn.findMessageTemplate("KJDIEJKHFHSDJDUWJHAJSNFNFJHDJSLE");
Map<String, Object> values = new HashMap<>();
values.put("userAccount.firstName", userAccount.getFirstName());
values.put("event.name", event.getName());
values.put("event.venue", event.getVenue().getName());
values.put("event.startDate", TextUtils.getFormattedDate(event.getStartDate(), dateFormat));
values.put("event.startTime", TextUtils.getFormattedTime(event.getStartTime(), timeFormat, timezone));
values.put("event.endTime", TextUtils.getFormattedTime(event.getEndTime(), timeFormat, timezone));
EmailMessage emailMessage = messageTemplate.replaceVariablesByValues(values);
emailMessage.setRecipient(userAccount);
try {
sendEmailMessage(emailMessage);
}
catch(MessagingException me) {
logger.log(Level.WARNING, "Error when sending the confirmation of event attendance to user "+ userAccount.getPostingEmail(), me);
}
}
/**
* If the application is configured to send emails, it sends the email message
* based on the message template. The message is saved in the history and an
* attempt to send the message is done. If successful the historical message
* is set as sent, otherwise the message is set as not sent and new attempts
* will be carried out later until the message is successfully sent.
* @param emailMessage The message to be sent.
*/
public void sendEmailMessage(EmailMessage emailMessage) throws MessagingException {
ApplicationProperty appProp = applicationPropertyBsn.findApplicationProperty(Properties.SEND_EMAILS);
if(!appProp.sendEmailsEnabled()) {
return;
}
MessagingException messagingException = null;
try {
Transport.send(emailMessage.createMimeMessage(mailSession));
}
catch (MessagingException me) {
messagingException = me;
}
List<MessageHistory> messagesHistory = MessageHistory.createHistoricMessages(emailMessage);
for(MessageHistory messageHistory: messagesHistory) {
if(messagingException == null) {
messageHistory.setMessageSent(Boolean.TRUE);
messageHistory.setDateSent(Calendar.getInstance().getTime());
}
else {
messageHistory.setMessageSent(Boolean.FALSE);
}
messageHistoryBean.saveHistoricalMessage(messageHistory);
}
if(messagingException != null) {
throw messagingException;
}
}
}