package com.dgrid.handlers;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.dgrid.api.BaseJobletTypeHandler;
import com.dgrid.api.JobletTypeHandler;
import com.dgrid.gen.JOB_STATUS;
import com.dgrid.gen.Joblet;
import com.dgrid.gen.JobletResult;
import com.dgrid.helpers.HttpClientHelper;
import com.dgrid.helpers.MailSender;
import com.dgrid.service.DGridClient;
import com.dgrid.service.XmppConnection;
import com.dgrid.util.io.HostnameDiscovery;
import com.dgrid.util.webclient.HttpResponse;
public class CallbackJobletTypeHandler extends BaseJobletTypeHandler implements
JobletTypeHandler {
public static final String TYPE = "callback";
private Log log = LogFactory.getLog(getClass());
public JobletResult execute(Joblet joblet, DGridClient gridClient)
throws Throwable {
log.trace("execute()");
long start = System.currentTimeMillis();
Map<String, String> params = joblet.getParameters();
int jobId = Integer.parseInt(params.get("jobId"));
String status = params.get("jobStatus");
String callbackType = params.get("callbackType");
String callbackAddress = params.get("callbackAddress");
String subject = getSubject(jobId, status);
String body = getBody(joblet.getContent(), jobId, status, joblet);
if ("xmpp".equals(callbackType)) {
xmppCallback(callbackAddress, subject, body, gridClient);
} else if ("http".equals(callbackType)) {
httpCallback(callbackAddress, jobId, gridClient);
} else if ("email".equals(callbackType)) {
emailCallback(callbackAddress, subject, body, gridClient);
} else if ("job".equals(callbackType)) {
jobCallback(Integer.parseInt(callbackAddress), gridClient);
} else {
throw new RuntimeException("unknown job callback type");
}
return new JobletResult(0, 0l, 0, (System.currentTimeMillis() - start),
JOB_STATUS.COMPLETED, "", joblet);
}
private void xmppCallback(String to, String subject, String body,
DGridClient gridClient) throws Exception {
log.trace("xmppCallback()");
XmppConnection conn = (XmppConnection) gridClient
.getBean(XmppConnection.NAME);
conn.sendTextMessage(to, subject, body);
}
private void httpCallback(String url, int jobId, DGridClient gridClient)
throws Exception {
log.trace("httpCallback()");
HttpClientHelper httpClient = (HttpClientHelper) gridClient
.getBean(HttpClientHelper.NAME);
url = String.format(url, jobId);
HttpResponse response = null;
try {
response = httpClient.getPage(url);
} finally {
try {
response.releaseConnection();
} catch (Exception e) {
}
}
}
private void emailCallback(String to, String subject, String body,
DGridClient gridClient) throws Exception {
log.trace("emailCallback()");
String from = gridClient.getSetting("mail.from", String.format(
"grid@%1$s", HostnameDiscovery.getHostname()));
MailSender mailSender = (MailSender) gridClient
.getBean(MailSender.NAME);
mailSender.send(from, to, subject, body);
}
private void jobCallback(int jobId, DGridClient gridClient) {
log.trace("jobCallback()");
throw new RuntimeException("jobCallback() is not yet implemented()");
}
private String getSubject(int jobId, String status) {
log.trace("getSubject()");
return String.format("Job # %1$d completed with status %2$s", jobId,
status);
}
private String getBody(String content, int jobId, String status,
Joblet joblet) {
log.trace("getBody()");
if ((content != null) && (content.length() > 0))
return content;
else
return String.format("Job # %1$d completed with status %2$s.",
jobId, status);
}
}