Mercurial > hg > LGDataverses
diff src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @ 10:a50cf11e5178
Rewrite LGDataverse completely upgrading to dataverse4.0
| author | Zoe Hong <zhong@mpiwg-berlin.mpg.de> |
|---|---|
| date | Tue, 08 Sep 2015 17:00:21 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java Tue Sep 08 17:00:21 2015 +0200 @@ -0,0 +1,366 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package edu.harvard.iq.dataverse; + +import com.sun.mail.smtp.SMTPSendFailedException; +import com.sun.mail.smtp.SMTPSenderFailedException; +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import edu.harvard.iq.dataverse.settings.SettingsServiceBean.Key; +import edu.harvard.iq.dataverse.util.BundleUtil; +import edu.harvard.iq.dataverse.util.SystemConfig; +import java.sql.Timestamp; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.Properties; +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.util.ResourceBundle; +import java.util.logging.Logger; +import javax.annotation.Resource; +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +/** + * + * original author: roberttreacy + */ +@Stateless +public class MailServiceBean implements java.io.Serializable { + + @EJB + UserNotificationServiceBean userNotificationService; + @EJB + DataverseServiceBean dataverseService; + @EJB + DatasetServiceBean datasetService; + @EJB + DatasetVersionServiceBean versionService; + @EJB + SystemConfig systemConfig; + @EJB + SettingsServiceBean settingsService; + + private static final Logger logger = Logger.getLogger(MailServiceBean.class.getCanonicalName()); + + private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; + + /** + * Creates a new instance of MailServiceBean + */ + public MailServiceBean() { + } + + public void sendMail(String host, String from, String to, String subject, String messageText) { + Properties props = System.getProperties(); + props.put("mail.smtp.host", host); + Session session = Session.getDefaultInstance(props, null); + + try { + Message msg = new MimeMessage(session); + msg.setFrom(new InternetAddress(from)); + msg.setRecipients(Message.RecipientType.TO, + InternetAddress.parse(to, false)); + msg.setSubject(subject); + msg.setText(messageText); + Transport.send(msg); + } catch (AddressException ae) { + ae.printStackTrace(System.out); + } catch (MessagingException me) { + me.printStackTrace(System.out); + } + } + + @Resource(name = "mail/notifyMailSession") + private Session session; + + public boolean sendSystemEmail(String to, String subject, String messageText) { + boolean sent = false; + try { + Message msg = new MimeMessage(session); + + InternetAddress systemAddress = getSystemAddress(); + if (systemAddress != null) { + msg.setFrom(systemAddress); + msg.setSentDate(new Date()); + msg.setRecipients(Message.RecipientType.TO, + InternetAddress.parse(to, false)); + msg.setSubject(subject); + msg.setText(messageText + ResourceBundle.getBundle("Bundle").getString("notification.email.closing")); + try { + Transport.send(msg); + sent = true; + } catch (SMTPSendFailedException ssfe) { + logger.warning("Failed to send mail to " + to + " (SMTPSendFailedException)"); + } + } else { + // commenting out the warning so as not to clutter the log of installations that haven't set up mail + // logger.warning("Skipping sending mail to " + to + ", because the \"no-reply\" address not set."); + } + } catch (AddressException ae) { + logger.warning("Failed to send mail to " + to); + ae.printStackTrace(System.out); + } catch (MessagingException me) { + logger.warning("Failed to send mail to " + to); + me.printStackTrace(System.out); + } + return sent; + } + + private InternetAddress getSystemAddress() { + String systemEmail = settingsService.getValueForKey(Key.SystemEmail); + + if (systemEmail!=null) { + try { + return new InternetAddress(systemEmail); + } catch(AddressException e) { + return null; + } + } + return null; + + } + + //@Resource(name="mail/notifyMailSession") + public void sendMail(String from, String to, String subject, String messageText) { + sendMail(from, to, subject, messageText, new HashMap()); + } + + public void sendMail(String from, String to, String subject, String messageText, Map extraHeaders) { + try { + Message msg = new MimeMessage(session); + if (from.matches(EMAIL_PATTERN)) { + msg.setFrom(new InternetAddress(from)); + } else { + // set fake from address; instead, add it as part of the message + //msg.setFrom(new InternetAddress("invalid.email.address@mailinator.com")); + msg.setFrom(getSystemAddress()); + messageText = "From: " + from + "\n\n" + messageText; + } + msg.setSentDate(new Date()); + msg.setRecipients(Message.RecipientType.TO, + InternetAddress.parse(to, false)); + msg.setSubject(subject); + msg.setText(messageText); + + if (extraHeaders != null) { + for (Object key : extraHeaders.keySet()) { + String headerName = key.toString(); + String headerValue = extraHeaders.get(key).toString(); + + msg.addHeader(headerName, headerValue); + } + } + + Transport.send(msg); + } catch (AddressException ae) { + ae.printStackTrace(System.out); + } catch (MessagingException me) { + me.printStackTrace(System.out); + } + } + + public Boolean sendNotificationEmail(UserNotification notification){ + boolean retval = false; + String emailAddress = getUserEmailAddress(notification); + if (emailAddress != null){ + Object objectOfNotification = getObjectOfNotification(notification); + if (objectOfNotification != null){ + String messageText = getMessageTextBasedOnNotification(notification, objectOfNotification); + String subjectText = getSubjectTextBasedOnNotification(notification); + if (!(messageText.isEmpty() || subjectText.isEmpty())){ + retval = sendSystemEmail(emailAddress, subjectText, messageText); + } else { + logger.warning("Skipping " + notification.getType() + " notification, because couldn't get valid message"); + } + } else { + logger.warning("Skipping " + notification.getType() + " notification, because no valid Object was found"); + } + } else { + logger.warning("Skipping " + notification.getType() + " notification, because email address is null"); + } + return retval; + } + + private String getSubjectTextBasedOnNotification(UserNotification userNotification) { + switch (userNotification.getType()) { + case CREATEDV: + return ResourceBundle.getBundle("Bundle").getString("notification.email.create.dataverse.subject"); + case REQUESTFILEACCESS: + return ResourceBundle.getBundle("Bundle").getString("notification.email.request.file.access.subject"); + case GRANTFILEACCESS: + return ResourceBundle.getBundle("Bundle").getString("notification.email.grant.file.access.subject"); + case REJECTFILEACCESS: + return ResourceBundle.getBundle("Bundle").getString("notification.email.rejected.file.access.subject"); + case MAPLAYERUPDATED: + return ResourceBundle.getBundle("Bundle").getString("notification.email.update.maplayer"); + case CREATEDS: + return ResourceBundle.getBundle("Bundle").getString("notification.email.create.dataset.subject"); + case SUBMITTEDDS: + return ResourceBundle.getBundle("Bundle").getString("notification.email.submit.dataset.subject"); + case PUBLISHEDDS: + return ResourceBundle.getBundle("Bundle").getString("notification.email.publish.dataset.subject"); + case RETURNEDDS: + return ResourceBundle.getBundle("Bundle").getString("notification.email.returned.dataset.subject"); + case CREATEACC: + return ResourceBundle.getBundle("Bundle").getString("notification.email.create.account.subject"); + } + return ""; + } + + private String getDatasetManagePermissionsLink(Dataset dataset){ + return systemConfig.getDataverseSiteUrl() + "/permissions-manage.xhtml?id=" + dataset.getId(); + } + + private String getDatasetLink(Dataset dataset){ + return systemConfig.getDataverseSiteUrl() + "/dataset.xhtml?persistentId=" + dataset.getGlobalId(); + } + + private String getDataverseLink(Dataverse dataverse){ + return systemConfig.getDataverseSiteUrl() + "/dataverse/" + dataverse.getAlias(); + } + + private String getMessageTextBasedOnNotification(UserNotification userNotification, Object targetObject){ + + String messageText = ResourceBundle.getBundle("Bundle").getString("notification.email.greeting"); + DatasetVersion version = null; + Dataset dataset = null; + String pattern =""; + + switch (userNotification.getType()) { + case CREATEDV: + Dataverse dataverse = (Dataverse) targetObject; + Dataverse parentDataverse = dataverse.getOwner(); + // initialize to empty string in the rare case that there is no parent dataverse (i.e. root dataverse just created) + String parentDataverseDisplayName = ""; + String parentDataverseUrl = ""; + if (parentDataverse != null) { + parentDataverseDisplayName = parentDataverse.getDisplayName(); + parentDataverseUrl = getDataverseLink(parentDataverse); + } + String dataverseCreatedMessage = BundleUtil.getStringFromBundle("notification.email.createDataverse", Arrays.asList( + dataverse.getDisplayName(), + getDataverseLink(dataverse), + parentDataverseDisplayName, + parentDataverseUrl, + systemConfig.getGuidesBaseUrl(), + systemConfig.getVersion())); + logger.fine(dataverseCreatedMessage); + return messageText += dataverseCreatedMessage; + case REQUESTFILEACCESS: + dataset = (Dataset) targetObject; + pattern = ResourceBundle.getBundle("Bundle").getString("notification.email.requestFileAccess"); + String[] paramArrayRequestFileAccess = {dataset.getDisplayName(), getDatasetManagePermissionsLink(dataset)}; + messageText += MessageFormat.format(pattern, paramArrayRequestFileAccess); + return messageText; + case GRANTFILEACCESS: + dataset = (Dataset) targetObject; + pattern = ResourceBundle.getBundle("Bundle").getString("notification.email.grantFileAccess"); + String[] paramArrayGrantFileAccess = {dataset.getDisplayName(), getDatasetLink(dataset)}; + messageText += MessageFormat.format(pattern, paramArrayGrantFileAccess); + return messageText; + case REJECTFILEACCESS: + dataset = (Dataset) targetObject; + pattern = ResourceBundle.getBundle("Bundle").getString("notification.email.rejectFileAccess"); + String[] paramArrayRejectFileAccess = {dataset.getDisplayName(), getDatasetLink(dataset)}; + messageText += MessageFormat.format(pattern, paramArrayRejectFileAccess); + return messageText; + case CREATEDS: + version = (DatasetVersion) targetObject; + String datasetCreatedMessage = BundleUtil.getStringFromBundle("notification.email.createDataset", Arrays.asList( + version.getDataset().getDisplayName(), + getDatasetLink(version.getDataset()), + version.getDataset().getOwner().getDisplayName(), + getDataverseLink(version.getDataset().getOwner()), + systemConfig.getGuidesBaseUrl(), + systemConfig.getVersion() + )); + logger.fine(datasetCreatedMessage); + return messageText += datasetCreatedMessage; + case MAPLAYERUPDATED: + version = (DatasetVersion) targetObject; + pattern = ResourceBundle.getBundle("Bundle").getString("notification.email.worldMap.added"); + String[] paramArrayMapLayer = {version.getDataset().getDisplayName(), getDatasetLink(version.getDataset())}; + messageText += MessageFormat.format(pattern, paramArrayMapLayer); + return messageText; + case SUBMITTEDDS: + version = (DatasetVersion) targetObject; + pattern = ResourceBundle.getBundle("Bundle").getString("notification.email.wasSubmittedForReview"); + String[] paramArraySubmittedDataset = {version.getDataset().getDisplayName(), getDatasetLink(version.getDataset()), + version.getDataset().getOwner().getDisplayName(), getDataverseLink(version.getDataset().getOwner())}; + messageText += MessageFormat.format(pattern, paramArraySubmittedDataset); + return messageText; + case PUBLISHEDDS: + version = (DatasetVersion) targetObject; + pattern = ResourceBundle.getBundle("Bundle").getString("notification.email.wasPublished"); + String[] paramArrayPublishedDataset = {version.getDataset().getDisplayName(), getDatasetLink(version.getDataset()), + version.getDataset().getOwner().getDisplayName(), getDataverseLink(version.getDataset().getOwner())}; + messageText += MessageFormat.format(pattern, paramArrayPublishedDataset); + return messageText; + case RETURNEDDS: + version = (DatasetVersion) targetObject; + pattern = ResourceBundle.getBundle("Bundle").getString("notification.email.wasReturnedByReviewer"); + String[] paramArrayReturnedDataset = {version.getDataset().getDisplayName(), getDatasetLink(version.getDataset()), + version.getDataset().getOwner().getDisplayName(), getDataverseLink(version.getDataset().getOwner())}; + messageText += MessageFormat.format(pattern, paramArrayReturnedDataset); + return messageText; + case CREATEACC: + messageText += ResourceBundle.getBundle("Bundle").getString("notification.email.welcome"); + return messageText; + } + + return ""; + } + + private Object getObjectOfNotification (UserNotification userNotification){ + switch (userNotification.getType()) { + case CREATEDV: + return dataverseService.find(userNotification.getObjectId()); + case REQUESTFILEACCESS: + case GRANTFILEACCESS: + case REJECTFILEACCESS: + return datasetService.find(userNotification.getObjectId()); + case MAPLAYERUPDATED: + case CREATEDS: + case SUBMITTEDDS: + case PUBLISHEDDS: + case RETURNEDDS: + return versionService.find(userNotification.getObjectId()); + case CREATEACC: + return userNotification.getUser(); + } + return null; + } + + + + + private String getUserEmailAddress(UserNotification notification) { + if (notification != null) { + if (notification.getUser() != null) { + if (notification.getUser().getDisplayInfo() != null) { + if (notification.getUser().getDisplayInfo().getEmailAddress() != null) { + logger.fine("Email address: "+notification.getUser().getDisplayInfo().getEmailAddress()); + return notification.getUser().getDisplayInfo().getEmailAddress(); + } + } + } + } + + logger.fine("no email address"); + return null; + } + +} \ No newline at end of file
