import java.net.*;
import org.codehaus.janino.*;
import racer2d.core.*;
import java.io.*;
import org.newdawn.slick.util.*;
/**
* An interpreter which loads classes from Java source
* files.
*
* @author davedes
*/
public class JaninoInterpreter implements Interpreter {
private SimpleCompiler compiler = new SimpleCompiler();
/** Creates a new instance of JaninoInterpreter. */
public JaninoInterpreter() {
}
/**
* Compile the simple Java source file into the interpreter.
* The Java source can only have one package but can contain
* multiple public classes.
*
* @param ref the path to the module
* @throws RuntimeException if the file wasn't found
* @throws InterpreterException if there was a problem compiling
*/
public void compile(String ref) throws InterpreterException {
compile(ResourceLoader.getResourceAsStream(ref));
}
/**
* Compile the simple Java source file into the interpreter.
* The Java source can only have one package but can contain
* multiple public classes.
*
* @param in the stream to the module
* @throws InterpreterException if there was a problem compiling
*/
public void compile(InputStream in) throws InterpreterException {
try {
compiler.cook(in);
} catch (Exception e) {
throw new InterpreterException("Error compiling source: "
+e.getMessage(), e);
}
}
/**
* Called to load a new class instance. The source
* files containing the class must be compiled before
* the classes can be accessed through this method.
*
* @param type the class type to return
* @param name the qualified name of the class to load
*
* @return a new instance of the interpreted class
* @throws ClassNotFoundException if the class was not found
* @throws InterpreterException if there was an error
* interpreting the class
* @throws ClassCastException if the class could not be cast
* to the given type
*/
public T get(Class type, String name) throws InterpreterException,
ClassNotFoundException,
ClassCastException {
ClassLoader loader = compiler.getClassLoader();
Object o = null;
try {
Class> klass = loader.loadClass(name);
o = klass.newInstance();
}
catch (InstantiationException e) {
throw new InterpreterException("Instantiation err: "
+e.getMessage(), e);
}
catch (IllegalAccessException e) {
throw new InterpreterException("Access err: "
+e.getMessage(), e);
}
return (T)o;
}
}