package com.dgrid.handlers; import java.io.File; import org.mozilla.javascript.Context; import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.Function; import org.mozilla.javascript.Scriptable; import com.dgrid.api.GenericScriptTypeHandler; import com.dgrid.api.JobletTypeHandler; import com.dgrid.api.SimpleJoblet; import com.dgrid.api.SimpleJobletResult; import com.dgrid.gen.JOB_STATUS; import com.dgrid.gen.Joblet; import com.dgrid.service.DGridClient; public class JavascriptJobletTypeHandler extends GenericScriptTypeHandler implements JobletTypeHandler { public JavascriptJobletTypeHandler(File root) { super(root); } @Override protected SimpleJoblet compile(String code) throws Exception { log.trace("execute()"); return new JavascriptSimpleJoblet(code); } private static class JavascriptSimpleJoblet implements SimpleJoblet { private String code; private JavascriptSimpleJoblet(String code) { this.code = code; } public SimpleJobletResult execute(Joblet joblet, DGridClient gridClient) throws Exception { Context cx = ContextFactory.getGlobal().enterContext(); Scriptable scope = cx.initStandardObjects(); Object evalReturn = cx.evaluateString(scope, code, "", 1, null); Object fObj = scope.get("execute", scope); SimpleJobletResult sjr = null; if (!(fObj instanceof Function)) { String retval = (evalReturn != null) ? evalReturn.toString() : ""; sjr = new SimpleJobletResult(0, JOB_STATUS.COMPLETED, retval); } else { Object wrappedJoblet = Context.javaToJS(joblet, scope); Object wrappedGridClient = Context.javaToJS(gridClient, scope); Object[] functionArgs = { wrappedJoblet, wrappedGridClient }; Function f = (Function) fObj; Object result = f.call(cx, scope, scope, functionArgs); sjr = (SimpleJobletResult) Context.jsToJava(result, SimpleJobletResult.class); } return sjr; } } }