package org.peerbox.server;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.servlet.GuiceFilter;
/**
* Simple HTTP server that handles incoming web requests.
*
* @author albrecht
*
*/
public class HttpServer implements IServer {
private static final Logger logger = LoggerFactory.getLogger(HttpServer.class);
private Server server;
private int port = 0;
/**
* Creates and initializes a new server with the given path, but does not start it.
*
* @param port on which server should listen.
*/
public HttpServer(int port) {
this.port = port;
server = new Server();
initConnector();
initHandler();
}
private void initConnector() {
ServerConnector connector = new ServerConnector(server);
connector.setPort(port);
connector.setHost("localhost");
server.setConnectors(new Connector[]{connector});
}
private void initHandler() {
// default servlet required for jetty to accept all requests
// (guice will define mappings between urls and servlets)
ServletContextHandler handler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
handler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
handler.addServlet(DefaultServlet.class, "/");
}
@Override
public boolean start() {
try {
server.start();
logger.info("Server started (port {})", getPort());
return true;
} catch (Exception e) {
logger.warn("Could not start the server.", e);
}
return false;
}
@Override
public boolean stop() {
try {
server.stop();
logger.info("Server stopped (port {})", getPort());
return true;
} catch (Exception e) {
logger.warn("Could not stop the server.", e);
}
return false;
}
@Override
public int getPort() {
return port;
}
}