Package com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.mail

Source Code of com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.mail.MailTicketAlerter

/*
*
* 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";
 
}
TOP

Related Classes of com.agiletec.plugins.jpwtt.aps.system.services.ticket.alerter.mail.MailTicketAlerter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.