/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.sys.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.velocity.app.VelocityEngine;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.ObjectUtil;
import org.kuali.kfs.sys.service.KfsNotificationService;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.core.api.mail.MailMessage;
import org.kuali.rice.krad.service.MailService;
import org.springframework.ui.velocity.VelocityEngineUtils;
/**
* implement the service methods defined in KFS notification service
*/
public class KfsNotificationServiceImpl implements KfsNotificationService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(KfsNotificationServiceImpl.class);
public final String TO_ADDRESSES = "toAddresses";
public final String FROM_ADDRESS = "fromAddress";
public final String SUBJECT = "subject";
public final String MESSAGE = "message";
private VelocityEngine velocityEngine;
private ConfigurationService configurationService;
private MailService mailService;
/**
* @see org.kuali.kfs.sys.service.KfsNotificationService#generateNotificationContent(java.lang.String, java.util.Map)
*/
@Override
public String generateNotificationContent(String template, Map<String, Object> model) {
return VelocityEngineUtils.mergeTemplateIntoString(this.getVelocityEngine(), template, model);
}
/**
* @see org.kuali.kfs.sys.service.KfsNotificationService#sendNotificationByMail(org.kuali.rice.kns.mail.MailMessage)
*/
@Override
public void sendNotificationByMail(MailMessage mailMessage) {
try {
this.setupForNonProductionEnviroment(mailMessage);
mailService.sendMessage(mailMessage);
}
catch (Exception iae) {
String invalidMailAddressMessage = "[Invalid email address: " + mailMessage.getToAddresses() + "]";
LOG.error(invalidMailAddressMessage, iae);
mailMessage.addToAddress(this.getMailService().getBatchMailingList());
mailMessage.addToAddress(mailMessage.getFromAddress());
String returnMailSubject = mailMessage.getSubject() + invalidMailAddressMessage;
mailMessage.setSubject(returnMailSubject);
try {
mailService.sendMessage(mailMessage);
}
catch (Exception e1) {
LOG.error("Failed to send the email: \n" + this.mailMessageToString(mailMessage));
}
}
}
/**
* setup some mail message properties for non-production environment
*/
protected void setupForNonProductionEnviroment(MailMessage mailMessage) {
String productionEnvironmentCode = this.getConfigurationService().getPropertyValueAsString(KFSConstants.PROD_ENVIRONMENT_CODE_KEY);
String environmentCode = this.getConfigurationService().getPropertyValueAsString(KFSConstants.ENVIRONMENT_KEY);
if (!StringUtils.equals(productionEnvironmentCode, environmentCode)) {
LOG.info("This is the email to be sent in PRODUCTION: \n" + this.mailMessageToString(mailMessage));
String nonProductionSubject = environmentCode + ": " + mailMessage.getSubject();
mailMessage.setSubject(nonProductionSubject);
// not sending any email to the real receivers, instead of testers
Set<String> toAddresses = mailMessage.getToAddresses();
toAddresses.clear();
mailMessage.addToAddress(this.getMailService().getBatchMailingList());
LOG.info("This is the email to be sent in TESTING: \n" + this.mailMessageToString(mailMessage));
}
}
protected String mailMessageToString(MailMessage mailMessage){
List<String> keyFields = new ArrayList<String>();
keyFields.add(TO_ADDRESSES);
keyFields.add(FROM_ADDRESS);
keyFields.add(SUBJECT);
keyFields.add(MESSAGE);
return String.valueOf(ObjectUtil.buildPropertyMap(mailMessage, keyFields));
}
/**
* Gets the velocityEngine attribute.
* @return Returns the velocityEngine.
*/
public VelocityEngine getVelocityEngine() {
return velocityEngine;
}
/**
* Sets the velocityEngine attribute value.
* @param velocityEngine The velocityEngine to set.
*/
public void setVelocityEngine(VelocityEngine velocityEngine) {
this.velocityEngine = velocityEngine;
}
/**
* Gets the kualiConfigurationService attribute.
* @return Returns the kualiConfigurationService.
*/
public ConfigurationService getConfigurationService() {
return configurationService;
}
/**
* Sets the kualiConfigurationService attribute value.
* @param kualiConfigurationService The kualiConfigurationService to set.
*/
public void setConfigurationService(ConfigurationService configurationService) {
this.configurationService = configurationService;
}
/**
* Gets the mailService attribute.
* @return Returns the mailService.
*/
public MailService getMailService() {
return mailService;
}
/**
* Sets the mailService attribute value.
* @param mailService The mailService to set.
*/
public void setMailService(MailService mailService) {
this.mailService = mailService;
}
}