/*
* Copyright 2009 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.server;
import java.net.URL;
import java.util.Random;
import javax.servlet.Servlet;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.security.SslSocketConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.HashSessionIdManager;
import org.mortbay.jetty.servlet.ServletHolder;
import com.google.common.base.Preconditions;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.jstestdriver.annotations.MaxFormContentSize;
import com.google.jstestdriver.annotations.Port;
import com.google.jstestdriver.model.HandlerPathPrefix;
/**
* Sippin' on Jetty and Guice.
*
* @author rdionne@google.com (Robert Dionne)
*/
public class JettyModule extends AbstractModule {
private static final URL KEYSTORE = JettyModule.class.getClassLoader()
.getResource("com/google/jstestdriver/keystore");
private static final String KEY_PASSWORD = "asdfgh";
private final int port;
private final int sslPort;
private final HandlerPathPrefix handlerPrefix;
public JettyModule(int port, int sslPort, HandlerPathPrefix handlerPrefix) {
this.port = port;
this.sslPort = sslPort;
this.handlerPrefix = handlerPrefix;
}
@Override
protected void configure() {
bindConstant().annotatedWith(Port.class).to(port);
bindConstant().annotatedWith(MaxFormContentSize.class).to(Integer.MAX_VALUE);
}
@Provides
@Singleton
SslSocketConnector provideSslSocketConnector(@Port Integer port) {
SslSocketConnector connector = new SslSocketConnector();
connector.setKeystore(KEYSTORE.toString());
connector.setKeyPassword(KEY_PASSWORD);
Preconditions.checkNotNull(port, "Port should not be null.");
Preconditions.checkNotNull(sslPort, "sslPort should not be null.");
connector.setPort(sslPort == -1 ? port + 1 : sslPort);
return connector;
}
@Provides
@Singleton
SocketConnector provideSocketConnector(@Port Integer port) {
SocketConnector connector = new SocketConnector();
connector.setPort(port);
return connector;
}
@Provides
@Singleton
ServletHolder servletHolder(Servlet handlerServlet) {
return new ServletHolder(handlerServlet);
}
@Provides
@Singleton
Server provideJettyServer(SocketConnector connector, SslSocketConnector sslConnector,
@MaxFormContentSize Integer maxFormContentSize, ServletHolder servletHolder) {
Server server = new Server();
server.setGracefulShutdown(1);
server.addConnector(connector);
server.addConnector(sslConnector);
server.setSessionIdManager(new HashSessionIdManager(new Random()));
Context context = new Context(server, "/", Context.SESSIONS);
context.setMaxFormContentSize(maxFormContentSize);
//context.addFilter(GzipFilter.class, handlerPrefix.prefixPath("/test/*"), Handler.ALL);
// TODO(rdionne): Fix HttpServletRequest#getPathInfo() provided by
// RequestHandlerServlet.
context.addServlet(servletHolder, handlerPrefix.prefixPath("/"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/cache"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/capture/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/cmd"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/favicon.ico"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/fileSet"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/forward/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/heartbeat"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/hello"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/proxy/*", "jstd"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/gateway/*", "jstd"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/log"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/query/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/runner/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/slave/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/test/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/quit"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/quit/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/static/*"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/bcr"));
context.addServlet(servletHolder, handlerPrefix.prefixPath("/bcr/*"));
context.addServlet(servletHolder, "/*");
return server;
}
}