package org.atomnuke.container.packaging.bindings.lang.jython;
import java.io.InputStream;
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;
import org.python.core.Options;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;
/**
*
* @author zinic
*/
public class JythonBindingEnvironment implements BindingEnvironment {
private static final LanguageDescriptor LANGUAGE_DESCRIPTOR = new LanguageDescriptorImpl(BindingLanguage.PYTHON, ".py");
private final PythonInterpreter pythonInterpreter;
private final JythonEnvironment jythonEnvironment;
public JythonBindingEnvironment() {
this(false);
}
public JythonBindingEnvironment(boolean beVerbose) {
if (!beVerbose) {
// Quiet Jython
Options.verbose = -1;
}
final ClassLoader cl = Thread.currentThread().getContextClassLoader();
final PySystemState systemState = new PySystemState();
systemState.setClassLoader(cl);
pythonInterpreter = new PythonInterpreter(null, systemState);
// pythonInterpreter.setErr(outputStream);
// pythonInterpreter.setOut(outputStream);
jythonEnvironment = new JythonEnvironment(pythonInterpreter, cl);
}
@Override
public Environment environment() {
return jythonEnvironment;
}
@Override
public void load(Resource resource) throws PackageLoadingException {
try {
final InputStream in = resource.uri().toURL().openStream();
pythonInterpreter.execfile(in);
in.close();
} catch (Exception ex) {
throw new PackageLoadingException("Failed to load python script. Reason: " + ex.getMessage(), ex);
}
}
@Override
public LanguageDescriptor language() {
return LANGUAGE_DESCRIPTOR;
}
}