/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.execution.internal;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.core.component.execution.api.ComponentEventAnnouncement;
import de.rcenvironment.core.component.execution.api.ComponentEventAnnouncementDispatcher;
import de.rcenvironment.core.mail.InvalidMailException;
import de.rcenvironment.core.mail.Mail;
import de.rcenvironment.core.mail.MailDispatchResult;
import de.rcenvironment.core.mail.MailDispatchResultListener;
import de.rcenvironment.core.mail.MailService;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.toolkit.utils.text.TextLinesReceiver;
/**
* Default implementation of {@link ComponentEventAnnouncementDispatcher}.
*
* @author Doreen Seider
*/
public class ComponentEventAnnouncementDispatcherImpl implements ComponentEventAnnouncementDispatcher {
private static final String SUBJECT_PATTERN = "[RCE] %s";
private MailService mailService;
@Override
public boolean dispatchWorkflowEventAnnouncementViaMail(String[] recipients, final ComponentEventAnnouncement compEventAnnouncement,
final TextLinesReceiver errorTextReceiver) {
String subject;
if (compEventAnnouncement.hasSubject()) {
subject = StringUtils.format(SUBJECT_PATTERN, compEventAnnouncement.getSubject());
} else {
subject = StringUtils.format(SUBJECT_PATTERN, "no subject");
}
Mail mail;
try {
mail = Mail.createMail(recipients, subject, compEventAnnouncement.getBody(), null);
} catch (InvalidMailException e) {
errorTextReceiver.addLine("Failed to send mail: " + e.getMessage());
return false;
}
final AtomicBoolean success = new AtomicBoolean(false);
Future<?> mailSendFuture = mailService.sendMail(mail, new MailDispatchResultListener() {
@Override
public void receiveResult(MailDispatchResult result, String message) {
if (message == null) {
message = ""; // to keep the code simple, should be improved to get "clearer" log messages
}
switch (result) {
case SUCCESS:
success.set(true);
break;
case FAILURE:
errorTextReceiver.addLine(
StringUtils.format("Failed to deliver email to mail server: '%s'; %s",
compEventAnnouncement.getWorkflowEventType().getDisplayName(), message));
break;
case FAILURE_RETRY:
errorTextReceiver.addLine(StringUtils.format("Failed to deliver email to mail server: '%s'; %s; retrying...",
compEventAnnouncement.getWorkflowEventType().getDisplayName(), message));
break;
case FAILURE_MAIL_SERVICE_NOT_CONFIGURED:
errorTextReceiver
.addLine(StringUtils.format("Failed to deliver email to mail server: '%s'; cause: mail server is not "
+ "configured; %s", compEventAnnouncement.getWorkflowEventType().getDisplayName(), message));
break;
default:
LogFactory.getLog(getClass()).error("Received unexpected result from the mail service.");
break;
}
}
});
try {
mailSendFuture.get();
} catch (InterruptedException e) {
// make sure the mail sending task is canceled, if this waiting thread gets interrupted
mailSendFuture.cancel(true);
LogFactory.getLog(getClass())
.warn(StringUtils.format("Interrupted while waiting for mail to be delivered that announces the component event '%s'",
compEventAnnouncement.getWorkflowEventType()));
} catch (ExecutionException e) {
LogFactory.getLog(getClass())
.error(StringUtils.format("Error when delivering mail to mail server that announces the component event '%s'",
compEventAnnouncement.getWorkflowEventType()), e);
}
return success.get();
}
protected void bindMailService(MailService service) {
this.mailService = service;
}
}