package org.dtk;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextAction;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Script;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
public class BuilderContextAction implements ContextAction {
private String builderPath;
private String version;
private String cdn;
private String dependencies;
private String optimize;
private Exception exception;
private Scriptable topScope;
private Context context;
private String result;
public BuilderContextAction(String builderPath, String version, String cdn, String dependencies, String optimize) {
this.builderPath = builderPath;
this.version = version;
this.cdn = cdn;
this.dependencies = dependencies;
this.optimize = optimize;
this.exception = null;
this.context = null;
this.topScope = null;
}
public Object run(Context newContext) {
context = newContext;
context.setOptimizationLevel(-1);
// Set up standard scripts
topScope = context.initStandardObjects();
try {
String fileName = builderPath + "build.js";
String fileContent = FileUtil.readFromFile(fileName, null);
Script script = context.compileString(fileContent, fileName, 1, null);
// Expose top level scope as the "global" scope.
//TODO: only need this for the load function, maybe there is a built in way
//to get this.
ScriptableObject.putProperty(topScope, "global", Context.javaToJS(topScope, topScope));
// Exec the build script.
script.exec(context, topScope);
// Call build.make(builderPath)
Scriptable build = Context.toObject(topScope.get("build", topScope), topScope);
Object args[] = {
builderPath,
version,
cdn,
dependencies,
optimize
};
Function make = (Function) build.get("make", topScope);
Object resultObj = make.call(context, topScope, build, args);
result = (String) Context.jsToJava(resultObj, String.class);
} catch (Exception e) {
this.exception = e;
}
return null;
}
public String getResult() {
return result;
}
public Exception getException() {
return exception;
}
}