package org.atomnuke.container.packaging.bindings.lang.rhinojs;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import org.atomnuke.container.packaging.bindings.environment.BindingEnvironment;
import org.atomnuke.container.packaging.bindings.PackageLoadingException;
import org.atomnuke.container.packaging.bindings.lang.LanguageDescriptor;
import org.atomnuke.container.packaging.bindings.lang.LanguageDescriptorImpl;
import org.atomnuke.container.packaging.bindings.lang.BindingLanguage;
import org.atomnuke.container.packaging.resource.Resource;
import org.atomnuke.plugin.Environment;
/**
*
* @author zinic
*/
public class RhinoInterpreterContext implements BindingEnvironment {
private static final LanguageDescriptor LANGUAGE_DESCRIPTOR = new LanguageDescriptorImpl(BindingLanguage.JAVASCRIPT, ".js");
public static RhinoInterpreterContext newInstance() {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(classLoader);
return new RhinoInterpreterContext(scriptEngineManager, classLoader);
}
private final RhinoJsEnvrionment rhinoJsEnvrionment;
private final ScriptEngine jsEngine;
public RhinoInterpreterContext(ScriptEngineManager scriptEngineManager, ClassLoader internalLoader) {
jsEngine = scriptEngineManager.getEngineByName("javascript");
rhinoJsEnvrionment = new RhinoJsEnvrionment(jsEngine, internalLoader);
}
@Override
public LanguageDescriptor language() {
return LANGUAGE_DESCRIPTOR;
}
@Override
public Environment environment() {
return rhinoJsEnvrionment;
}
@Override
public void load(Resource resource) throws PackageLoadingException {
try {
final InputStream in = resource.uri().toURL().openStream();
jsEngine.eval(new InputStreamReader(in));
in.close();
} catch (Exception se) {
throw new PackageLoadingException("Failed to load Javascript file. Reason: " + se.getMessage(), se);
}
}
}