package water;
import java.lang.reflect.Method;
import java.net.*;
import water.util.Log;
/**
* Creates a node in-process using a separate class loader.
*/
public class NodeContainer extends Thread {
private final String[] _args;
private final URLClassLoader _initialClassLoader, _classLoader;
public NodeContainer(String[] args) {
super("NodeContainer");
_args = args;
_initialClassLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
URL[] _classpath = _initialClassLoader.getURLs();
_classLoader = new URLClassLoader(_classpath, null);
}
public void run() {
assert Thread.currentThread().getContextClassLoader() == _initialClassLoader;
Thread.currentThread().setContextClassLoader(_classLoader);
try {
Class<?> c = _classLoader.loadClass("water.H2O");
Method method = c.getMethod("main", String[].class);
method.setAccessible(true);
method.invoke(null, (Object) _args);
} catch( Exception e ) {
throw Log.throwErr(e);
} finally {
Thread.currentThread().setContextClassLoader(_initialClassLoader);
}
}
}