/** Action to send notification emails. */
public class SendNotificationEmailExecution implements ExecutionStrategy<ActionContext> {
  /** Log. */
  private static Logger log = LoggerFactory.getLogger(LogFactory.getClassName());

  /** For sending email. */
  private final EmailerFactory emailer;

  /**
   * Constructor.
   *
   * @param inEmailer For sending email.
   */
  public SendNotificationEmailExecution(final EmailerFactory inEmailer) {
    emailer = inEmailer;
  }

  /** {@inheritDoc} */
  @Override
  public Serializable execute(final ActionContext inActionContext) throws ExecutionException {
    NotificationEmailDTO request = (NotificationEmailDTO) inActionContext.getParams();
    try {
      MimeMessage message = emailer.createMessage();

      emailer.setSubject(message, request.getSubject());
      emailer.setTextBody(message, request.getTextBody());
      emailer.setHtmlBody(message, request.getHtmlBody());
      if (StringUtils.isNotBlank(request.getToRecipient())) {
        emailer.setTo(message, request.getToRecipient());
      }
      if (StringUtils.isNotBlank(request.getBccRecipients())) {
        emailer.setBcc(message, request.getBccRecipients());
      }
      if (StringUtils.isNotBlank(request.getReplyTo())) {
        emailer.setReplyTo(message, request.getReplyTo());
      }
      if (request.isHighPriority()) {
        message.addHeader("Importance", "high");
        message.addHeader("X-Priority", "1");
      }

      emailer.sendMail(message);

      log.debug("Sent email for notification {}", request.getDescription());
    } catch (MessagingException ex) {
      String msg = "Failed to send email message for notification " + request.getDescription();
      log.error(msg, ex);
      throw new ExecutionException(msg, ex);
    }

    return null;
  }
}