/**
* TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L.
* Copyright (C) 2007 Autentia Real Bussiness Solution S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.autentia.tnt.tracking.mail;
import java.util.Collection;
import java.util.ResourceBundle;
import javax.mail.MessagingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.autentia.tnt.mail.DefaultMailService;
import com.autentia.tnt.manager.security.AuthenticationManager;
import com.autentia.tnt.tracking.EntityChange;
import com.autentia.tnt.util.SpringUtils;
public class TrackChangesMailService {
private static final Log log = LogFactory.getLog(TrackChangesMailService.class);
private DefaultMailService mailService;
/**
* Get default changes mail service bean defined in Spring.
*
* @return the default configuration bean
*/
public static TrackChangesMailService getDefault() {
return (TrackChangesMailService) SpringUtils.getSpringBean("changesMailService");
}
public void setMailService(DefaultMailService mailService) {
this.mailService = mailService;
}
public void sendChangesMail(Collection<String> mailsTo, String entityTextKey, String entityUserFriendlyName, Collection<EntityChange> entityChanges){
if(mailsTo!=null && !mailsTo.isEmpty()){
String messageBody = composeMessage(entityTextKey, entityUserFriendlyName, entityChanges);
for(String to:mailsTo){
try {
mailService.send(to, getChangesMailSubject(entityTextKey), messageBody);
} catch (MessagingException e) {
// can not send message
log.error("Changes mail service failure", e);
}
}
}
}
private String composeMessage(String entityTextKey,
String entityUserFriendlyName, Collection<EntityChange> entityChanges) {
StringBuilder sb = new StringBuilder();
if(entityChanges!=null){
for(EntityChange entityChange:entityChanges){
String key = entityChange.getField();
sb.append(getProperty(key));
sb.append(" [");
sb.append(getChangesMailBefore());
sb.append(": ");
sb.append(entityChange.getOldValue());
sb.append("] [");
sb.append(getChangesMailAfter());
sb.append(": ");
sb.append(entityChange.getNewValue());
sb.append("]");
sb.append(System.getProperty("line.separator"));
}
}
return getChangesMailBody(entityTextKey, entityUserFriendlyName, sb.toString());
}
private String getChangesMailSubject(String entityTextKey){
StringBuilder sb = new StringBuilder();
sb.append(getProperty("mail.changes.mailSubject", "Cambios efectuados en"));
sb.append(" ");
sb.append(getProperty(entityTextKey, "..."));
return sb.toString();
}
private String getChangesMailBody(String entityTextKey, String entityUserFriendlyName, String changes){
StringBuilder sb = new StringBuilder();
sb.append(getProperty("mail.changes.mailBody", "Se han producido los siguientes cambios en"));
sb.append(" ");
sb.append(getProperty(entityTextKey, "..."));
sb.append(" ");
sb.append(entityUserFriendlyName);
sb.append(":");
sb.append(System.getProperty("line.separator"));
sb.append(System.getProperty("line.separator"));
sb.append(changes);
return sb.toString();
}
public String getProperty(String key){
StringBuilder sb = new StringBuilder();
sb.append("???");
sb.append(key);
sb.append("???");
return getProperty(key,sb.toString());
}
private Object getChangesMailBefore() {
return getProperty("mail.changes.before", "antes");
}
private Object getChangesMailAfter() {
return getProperty("mail.changes.after", "antes");
}
/**
* Get a configuration property by name.
*
* @param propertyName
* property name
* @return a named property
*/
private String getProperty(String propertyName, String defaultValue) {
ResourceBundle bundle=null;
String ret = null;
try{
bundle = ResourceBundle.getBundle(
"com.autentia.tnt.resources.messages", AuthenticationManager.getDefault().getCurrentPrincipal().getLocale());
ret= bundle.getString(propertyName);
}catch(Exception e){
//Si se produce un error al recuperar los textos lo registramos en el log
//y lo dejamos
log.error("Could not retrieve text message.", e);
}
if (ret == null)
ret = defaultValue;
return ret;
}
}