/*
* COMSAT
* Copyright (C) 2014-2016, Parallel Universe Software Co. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 3.0
* as published by the Free Software Foundation.
*/
package co.paralleluniverse.embedded.containers;
import javax.servlet.Servlet;
import javax.servlet.ServletContextListener;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
public final class JettyServer extends AbstractEmbeddedServer {
private Server server;
private ServletContextHandler context;
private boolean wsEnabled;
private void build() {
if (server != null)
return;
this.server = new Server(new QueuedThreadPool(nThreads, nThreads));
final ServerConnector http = new ServerConnector(server);
http.setPort(port);
http.setAcceptQueueSize(maxConn);
server.addConnector(http);
this.context = new ServletContextHandler(ServletContextHandler.SESSIONS);
}
@Override
public final ServletDesc addServlet(String name, Class<? extends Servlet> servletClass, String mapping) {
if (context == null)
build();
ServletHolder sh = new ServletHolder(servletClass);
context.addServlet(sh, mapping);
return new JettyServletDesc(sh);
}
@Override
public final void addServletContextListener(Class<? extends ServletContextListener> scl) {
if (context == null)
build();
try {
context.addEventListener(scl.newInstance());
} catch (InstantiationException | IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
@Override
public final void start() throws Exception {
if (context==null)
build();
server.setHandler(context);
if (wsEnabled)
WebSocketServerContainerInitializer.configureContext(context);
server.start();
}
@Override
public final void stop() throws Exception {
server.stop();
}
@Override
public final void enableWebsockets() throws Exception {
this.wsEnabled = true;
}
@Override
public final void setResourceBase(final String resourceBaseUrl) {
if (context==null)
build();
context.setResourceBase(resourceBaseUrl);
}
private static final class JettyServletDesc implements ServletDesc {
private final ServletHolder impl;
public JettyServletDesc(ServletHolder sh) {
this.impl = sh;
}
@Override
public final ServletDesc setInitParameter(String name, String value) {
impl.setInitParameter(name, value);
return this;
}
@Override
public final ServletDesc setLoadOnStartup(int load) {
impl.setInitOrder(load);
return this;
}
}
}