/*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
* This file is part of Entando Enterprise Edition software.
* You can redistribute it and/or modify it
* under the terms of the Entando's EULA
*
* See the file License for the specific language governing permissions
* and limitations under the License
*
*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
*/
package com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.mail;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.agiletec.aps.system.ApsSystemUtils;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.baseconfig.BaseConfigManager;
import com.agiletec.aps.system.services.baseconfig.ConfigInterface;
import com.agiletec.aps.system.services.role.IRoleManager;
import com.agiletec.aps.util.DateConverter;
import com.agiletec.plugins.jpmail.aps.services.mail.IMailManager;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.ITicketManager;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.AlerterThread;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.AlerterThreadListener;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.ITicketAlerter;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.mail.model.MailTemplate;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.mail.model.WttMailConfig;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.mail.parse.WttMailConfigDOM;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.model.InterventionType;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.model.Ticket;
import com.agiletec.plugins.jpwtt.aps.system.services.ticket.model.TicketOperation;
/**
*
* @version 1.0
* @author E.Mezzano
*/
public class MailTicketAlerter implements AlerterThreadListener, ITicketAlerter {
public void init() throws ApsSystemException {
this.loadConfigs();
}
private void loadConfigs() throws ApsSystemException {
try {
ConfigInterface configManager = (ConfigInterface) this.getConfigManager();
String xml = configManager.getConfigItem("jpwttMailConfig");
if (xml == null) {
throw new ApsSystemException("Missing config item: jpwttMailConfig");
}
WttMailConfigDOM configDOM = new WttMailConfigDOM();
this.setConfig(configDOM.extractConfig(xml));
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "loadConfigs");
throw new ApsSystemException("Error loading config", t);
}
}
@Override
public void notifyAddedTicket(Ticket ticket, InterventionType interventionType) {
AlerterThread thread = new AlerterThread();
String threadName = WTT_MAIL_ALERTER_THREAD_NAME + ticket.getCode();
thread.startAddedTicketThread(this, ticket, interventionType, threadName);
}
@Override
public void notifyTicketOperation(Ticket ticket, TicketOperation operation, InterventionType interventionType) {
AlerterThread thread = new AlerterThread();
String threadName = WTT_MAIL_ALERTER_THREAD_NAME + ticket.getCode();
thread.startTicketOperationThread(this, ticket, operation, interventionType, threadName);
}
@Override
public void sendAlertOnAddedTicket(Ticket ticket, InterventionType interventionType) {
MailTemplate template = this.getConfig().getTemplates().get(new Integer(0));
try {
this.sendAlert(ticket, null, interventionType, template);
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "sendAlertOnAddedTicket");
}
}
@Override
public void sendAlertOnTicketOperation(Ticket ticket, TicketOperation operation, InterventionType interventionType) {
Integer operationCode = new Integer(operation.getOperationCode());
MailTemplate template = this.getConfig().getTemplates().get(operationCode);
try {
this.sendAlert(ticket, operation, interventionType, template);
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "sendAlertOnTicketOperation");
}
}
private void sendAlert(Ticket ticket, TicketOperation operation, InterventionType interventionType, MailTemplate template) throws ApsSystemException {
Map<String, String> params = this.prepareParams(ticket, interventionType, operation);
Map<String, String> bodies = template.getTemplateBodies();
String userTemplate = bodies.get(MailTemplate.TEMPLATE_TYPE_USER);
if (userTemplate!=null && userTemplate.length()>0) {
this.sendMailToUser(ticket.getEmail(), userTemplate, params);
}
/*
String operatorTemplate = bodies.get(MailTemplate.TEMPLATE_TYPE_OPERATOR);
if (operatorTemplate!=null && operatorTemplate.length()>0) {
this.sendMailToUser(operation.getOperator(), userTemplate, params);
}
//*/
String allOperatorsTemplate = bodies.get(MailTemplate.TEMPLATE_TYPE_ALLOPERATORS);
if (allOperatorsTemplate!=null && allOperatorsTemplate.length()>0) {
String[] addresses = this.extractAllOperatorsMailAddresses(ticket);
this.sendMailToAddresses(addresses, allOperatorsTemplate, params);
}
String adminTemplate = bodies.get(MailTemplate.TEMPLATE_TYPE_ADMIN);
if (adminTemplate!=null && adminTemplate.length()>0) {
String[] addresses = this.extractAdminMailAddresses(ticket);
this.sendMailToAddresses(addresses, adminTemplate, params);
}
}
private void sendMailToUser(String eMail, String template, Map<String, String> params) throws ApsSystemException {
WttMailConfig mailConfig = this.getConfig();
if (eMail!=null) {
String text = this.prepareBody(template, params);
String[] addresses = { eMail };
this.getMailManager().sendMail(text, mailConfig.getSubject(), addresses, null, null, mailConfig.getSenderCode());
}
}
private void sendMailToAddresses(String[] addresses, String template, Map<String, String> params) throws ApsSystemException {
if (addresses!=null && addresses.length>0) {
WttMailConfig config = this.getConfig();
String text = this.prepareBody(template, params);
String subject = config.getSubject();
String senderCode = config.getSenderCode();
if (config.isUniqueMail()) {
this.getMailManager().sendMail(text, subject, addresses, null, null, senderCode);
} else {
for (String eMail : addresses) {
this.getMailManager().sendMail(text, subject, new String[] { eMail }, null, null, senderCode);
}
}
}
}
private String[] extractAdminMailAddresses(Ticket ticket) throws ApsSystemException {
WttMailConfig config = this.getConfig();
List<String> commonAddresses = config.getCommonAdminAddresses();
List<String> intervTypeAddresses = config.getIntervTypesAdminAddresses().get(ticket.getUserInterventionType());
/*
String mailAttrName = config.getMailAttrName();
Collection<String> usernames = this.extractUsersForPermission(JpWttSystemConstants.WTT_ADMIN_PERMISSION);
int size = usernames.size() + commonAddresses.size();
//*/
int size = commonAddresses.size();
if (intervTypeAddresses!=null) size += intervTypeAddresses.size();
List<String> mailAddresses = new ArrayList<String>(size);
mailAddresses.addAll(commonAddresses);
if (intervTypeAddresses!=null) mailAddresses.addAll(intervTypeAddresses);
/*
for (String username : usernames) {
String eMail = this.extractMailAddress(username, mailAttrName);
if (eMail != null) mailAddresses.add(eMail);
}
//*/
return (String[]) mailAddresses.toArray(new String[mailAddresses.size()]);
}
private String[] extractAllOperatorsMailAddresses(Ticket ticket) throws ApsSystemException {
WttMailConfig config = this.getConfig();
List<String> commonAddresses = config.getCommonOperatorAddresses();
List<String> intervTypeAddresses = config.getIntervTypesOperatorAddresses().get(ticket.getUserInterventionType());
/*
String mailAttrName = config.getMailAttrName();
// Collection<String> usernames = this.extractUsersForPermission(JpWttSystemConstants.WTT_OPERATOR_PERMISSION);
int size = usernames.size() + commonAddresses.size();
//*/
int size = commonAddresses.size();
if (intervTypeAddresses!=null) size += intervTypeAddresses.size();
List<String> mailAddresses = new ArrayList<String>(size);
mailAddresses.addAll(commonAddresses);
if (intervTypeAddresses!=null) mailAddresses.addAll(intervTypeAddresses);
/*
for (String username : usernames) {
String eMail = this.extractMailAddress(username, mailAttrName);
if (eMail != null) mailAddresses.add(eMail);
}
//*/
return (String[]) mailAddresses.toArray(new String[mailAddresses.size()]);
}
/*
private String extractMailAddress(String username, String mailAttrName) throws ApsSystemException {
String eMail = null;
UserProfile profile = this.getProfileManager().getProfile(username);
if (profile!=null) {
ITextAttribute mailAttribute = (ITextAttribute) profile.getAttribute(mailAttrName);
if (mailAttribute!=null) {
eMail = mailAttribute.getText();
}
}
return eMail;
}
private Collection<String> extractUsersForPermission(String permissionName) throws ApsSystemException {
Set<String> usernames = new TreeSet<String>();
IApsAuthorityManager authorityManager = (IApsAuthorityManager) this.getRoleManager();
List<Role> roles = this.getRoleManager().getRolesWithPermission(permissionName);
for (Role role : roles) {
List<UserDetails> roleUsers = authorityManager.getUsersByAuthority(role);
for (UserDetails user : roleUsers) {
if(!user.isDisabled()) {
usernames.add(user.getUsername());
}
}
}
return usernames;
}
//*/
private Map<String, String> prepareParams(Ticket ticket, InterventionType interventionType, TicketOperation operation) {
Map<String, String> params = new HashMap<String, String>();
params.put("code", ticket.getCode());
params.put("creationDate", DateConverter.getFormattedDate(ticket.getCreationDate(), "dd/MM/yyyy"));
params.put("author", ticket.getAuthor());
params.put("nome", ticket.getNome());
params.put("cognome", ticket.getCognome());
params.put("codFisc", ticket.getCodFisc());
params.put("comune", ticket.getComune());
params.put("localita", ticket.getLocalita());
params.put("tipoIndirizzo", ticket.getTipoIndirizzo());
params.put("indirizzo", ticket.getIndirizzo());
params.put("numeroIndirizzo", ticket.getNumeroIndirizzo());
params.put("telefono", ticket.getTelefono());
params.put("email", ticket.getEmail());
params.put("message", ticket.getMessage());
ITicketManager ticketManager = this.getTicketManager();
String userInterventionTypeDescr = null;
if (ticket.getUserInterventionType()>0) {
InterventionType userInterventionType = ticketManager.getInterventionType(ticket.getUserInterventionType());
if (null!=userInterventionType) {
userInterventionTypeDescr = userInterventionType.getDescr();
}
}
if (null==userInterventionTypeDescr) {
userInterventionTypeDescr = "Generico";
}
params.put("userInterventionType", userInterventionTypeDescr);
String assignedInterventionTypeDescr = null;
if (ticket.getOpInterventionType()>0) {
InterventionType opInterventionType = ticketManager.getInterventionType(ticket.getOpInterventionType());
if (null!=opInterventionType) {
assignedInterventionTypeDescr = opInterventionType.getDescr();
}
}
if (null==assignedInterventionTypeDescr) {
assignedInterventionTypeDescr = "Generico";
}
params.put("assignedInterventionType", assignedInterventionTypeDescr);
String priority = ticketManager.getPriorities().get(ticket.getPriority());
if (priority==null) priority = "Normale";
params.put("priority", priority);
Date closingDate = ticket.getClosingDate();
if (closingDate!=null) {
params.put("creationDate", DateConverter.getFormattedDate(closingDate, "dd/MM/yyyy"));
}
// TODO gestire messaggio esito positivo?
if (ticket.isResolved()) {
params.put("resolved", "risolta");
} else {
params.put("resolved", "non risolta");
}
if (operation!=null) {
params.put("wttRole", operation.getWttRole());
params.put("operator", operation.getOperator());
params.put("note", operation.getNote());
params.put("operationDate", DateConverter.getFormattedDate(operation.getDate(), "dd/MM/yyyy"));
}
return params;
}
private String prepareBody(String defaultText, Map<String, String> params) {
String body = defaultText;
Iterator<Entry<String, String>> it = params.entrySet().iterator();
while (it.hasNext()) {
Entry<String, String> pairs = it.next();
String field = "{" + pairs.getKey() + "}";
int start = body.indexOf(field);
if (start >= 0) {
int end = start + field.length();
body = body.substring(0, start) + pairs.getValue()
+ body.substring(end);
}
}
return body;
}
public WttMailConfig getConfig() {
return _config;
}
protected void setConfig(WttMailConfig config) {
this._config = config;
}
protected IMailManager getMailManager() {
return _mailManager;
}
public void setMailManager(IMailManager mailManager) {
this._mailManager = mailManager;
}
protected BaseConfigManager getConfigManager() {
return _configManager;
}
public void setConfigManager(BaseConfigManager configManager) {
this._configManager = configManager;
}
public IRoleManager getRoleManager() {
return _roleManager;
}
public void setRoleManager(IRoleManager roleManager) {
this._roleManager = roleManager;
}
public ITicketManager getTicketManager() {
return ticketManager;
}
public void setTicketManager(ITicketManager ticketManager) {
this.ticketManager = ticketManager;
}
private WttMailConfig _config;
private IMailManager _mailManager;
private BaseConfigManager _configManager;
private IRoleManager _roleManager;
private ITicketManager ticketManager;
public static final String WTT_MAIL_ALERTER_THREAD_NAME = "WttMailAlerterThread";
}