/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.jstestdriver; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.servlet.ServletHandler; import org.mortbay.jetty.servlet.ServletHolder; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Observable; import java.util.Set; import javax.servlet.http.HttpServlet; /** * @author jeremiele@google.com (Jeremie Lenfant-Engelmann) */ public class JsTestDriverServer extends Observable { private final Server server = new Server(); private ServletHandler servletHandler; private final int port; private final CapturedBrowsers capturedBrowsers; public JsTestDriverServer(int port, CapturedBrowsers capturedBrowsers) { this.port = port; this.capturedBrowsers = capturedBrowsers; initJetty(this.port); initServlets(); } private void initServlets() { addServlet("/hello", new HelloServlet()); addServlet("/heartbeat", new HeartbeatServlet(capturedBrowsers, new TimeImpl())); addServlet("/capture", new CaptureServlet(String.format("%s/capture.html", SlaveResourceServlet.RESOURCE_LOCATION), capturedBrowsers)); addServlet("/slave/*", new SlaveResourceServlet(SlaveResourceServlet.RESOURCE_LOCATION)); addServlet("/cmd", new CommandServlet(capturedBrowsers)); addServlet("/query/*", new BrowserQueryResponseServlet(capturedBrowsers)); Map<String, String> filesToServe = new HashMap<String, String>(); addServlet("/test/*", new TestResourceServlet(filesToServe)); addServlet("/fileSet", new FileSetServlet(capturedBrowsers, filesToServe)); addServlet("/", new HomeServlet(capturedBrowsers)); } private void addServlet(String url, HttpServlet servlet) { servletHandler.addServletWithMapping(new ServletHolder(servlet), url); } private void initJetty(int port) { SocketConnector connector = new SocketConnector(); connector.setPort(port); server.addConnector(connector); servletHandler = new ServletHandler(); server.addHandler(servletHandler); } public void start() { try { server.start(); setChanged(); notifyObservers(); } catch (Exception e) { throw new RuntimeException(e); } } public void stop() { try { server.stop(); } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) { FlagsImpl flags = new FlagsImpl(); CmdLineParser parser = new CmdLineParser(flags); if (args.length == 0) { parser.printUsage(System.out); System.exit(0); } try { parser.parseArgument(args); if (flags.getDisplayHelp()) { parser.printUsage(System.out); System.exit(0); } File config = new File(flags.getConfig()); Set<String> fileSet = new LinkedHashSet<String>(); String defaultServerAddress = null; if (flags.getTests().size() > 0 || flags.getReset() || !flags.getArguments().isEmpty()) { if (config.exists()) { ConfigurationParser configParser = new ConfigurationParser(config.getParentFile()); try { configParser.parse(new FileInputStream(flags.getConfig())); fileSet = configParser.getFilesList(); defaultServerAddress = configParser.getServer(); } catch (FileNotFoundException e) { System.err.println(e); System.exit(1); } } } ActionRunner runner = new ActionRunner(new ActionParser(new ActionFactory()).parseFlags(flags, fileSet, defaultServerAddress)); runner.runActions(); } catch (CmdLineException e) { System.err.println(e.getMessage()); parser.printUsage(System.err); } catch (Exception e) { System.err.println(e); System.exit(1); } } }