package com.dgrid.handlers;
import groovy.lang.GroovyClassLoader;
import java.io.File;
import com.dgrid.api.BaseJobletTypeHandler;
import com.dgrid.api.JobletTypeHandler;
import com.dgrid.api.MapReduceJob;
import com.dgrid.gen.Constants;
import com.dgrid.gen.JOB_STATUS;
import com.dgrid.gen.Joblet;
import com.dgrid.gen.JobletResult;
import com.dgrid.service.DGridClient;
import com.dgrid.util.io.InputStreamUtils;
public class GroovyMapReduceTypeHandler extends BaseJobletTypeHandler implements
JobletTypeHandler {
public static final String SCRIPT_PARAM = "script";
private File dir;
private JavaMapReduceTypeHandler delegate;
private GroovyClassLoader loader;
public GroovyMapReduceTypeHandler(File dir) {
this.dir = dir;
this.loader = new GroovyClassLoader(getClass().getClassLoader());
this.delegate = new JavaMapReduceTypeHandler();
}
public JobletResult execute(Joblet joblet, DGridClient gridClient)
throws Throwable {
String script = joblet.getParameters().get(SCRIPT_PARAM);
MapReduceJob mrj = null;
String code = null;
if (script == null) {
// get from joblet contents
code = joblet.getContent();
} else {
File file = new File(this.dir, script);
code = InputStreamUtils.getFileAsString(file);
}
mrj = compile(code);
JobletResult jr = null;
if (joblet.getJobletType().equals(Constants.GROOVY_MR_JOB)) {
jr = delegate.map(mrj, joblet, gridClient);
Joblet reducer = new Joblet(0, 0l, joblet.getJobId(), 0, joblet
.getSubmitter(), joblet.getPriority(),
Constants.GROOVY_MR_REDUCER, "", joblet.getParameters(),
joblet.getContent(), JOB_STATUS.SAVED);
gridClient.submitJoblet(reducer, joblet.getJobId());
} else if (joblet.getJobletType().equals(Constants.GROOVY_MR_REDUCER))
jr = delegate.reduce(Constants.GROOVY_MR_JOB, mrj, joblet,
gridClient);
else
throw new UnsupportedOperationException(String.format(
"Unknown joblet type (%1$s)", joblet.getJobletType()));
return jr;
}
protected MapReduceJob compile(String code) throws Exception {
log.trace("compile()");
Class clz = loader.parseClass(code);
Object obj = clz.newInstance();
MapReduceJob mrj = (MapReduceJob) obj;
return mrj;
}
}