package hudson.plugins.selenium;
import com.thoughtworks.selenium.grid.configuration.HubConfiguration;
import com.thoughtworks.selenium.grid.hub.HubRegistry;
import com.thoughtworks.selenium.grid.hub.HubServlet;
import com.thoughtworks.selenium.grid.hub.management.LifecycleManagerServlet;
import com.thoughtworks.selenium.grid.hub.management.RegistrationServlet;
import com.thoughtworks.selenium.grid.hub.management.UnregistrationServlet;
import com.thoughtworks.selenium.grid.hub.management.console.ConsoleServlet;
import hudson.remoting.Callable;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import java.lang.reflect.Field;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Starts the selenium grid server.
*
* This callable blocks until the server is shut down and thus generally never returns.
*
* @author Kohsuke Kawaguchi
*/
public class HubLauncher implements Callable<Void,Exception> {
private final int port;
private final Level logLevel;
public HubLauncher(int port, Level logLevel) {
this.port = port;
this.logLevel = logLevel;
}
public Void call() throws Exception {
HubRegistry r = HubRegistry.registry();
// hack up the pool
Field pool = r.getClass().getDeclaredField("pool");
pool.setAccessible(true);
pool.set(r,new HudsonRemoteControlPool());
// and environment manager
Field env = r.getClass().getDeclaredField("environmentManager");
env.setAccessible(true);
env.set(r,new HudsonEnvironmentManager());
r.gridConfiguration().getHub().setPort(port);
start();
return null;
}
private void start() throws Exception {
final ContextHandlerCollection contexts;
final HubConfiguration configuration;
final Server server;
final Context root;
configuration = HubRegistry.registry().gridConfiguration().getHub();
server = new Server(configuration.getPort());
contexts = new ContextHandlerCollection();
server.setHandler(contexts);
root = new Context(contexts, "/", Context.SESSIONS);
// root.setResourceBase("./");
// root.addHandler(new ResourceHandler());
root.addServlet(new ServletHolder(new HubServlet()), "/selenium-server/driver/*");
root.addServlet(new ServletHolder(new ConsoleServlet()), "/console");
root.addServlet(new ServletHolder(new RegistrationServlet()), "/registration-manager/register");
root.addServlet(new ServletHolder(new UnregistrationServlet()), "/registration-manager/unregister");
root.addServlet(new ServletHolder(new LifecycleManagerServlet()), "/lifecycle-manager");
server.start();
Logger.getLogger("com.thoughtworks.selenium").setLevel(logLevel);
Logger.getLogger("org.apache.commons.httpclient").setLevel(logLevel);
}
}