blob: 9cddfaec9503c87666f3036e200353190e18c6f3 [file] [log] [blame]
package net.onrc.onos.apps.websocket;
import javax.websocket.DeploymentException;
import javax.websocket.server.ServerContainer;
import net.onrc.onos.core.topology.ITopologyService;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* The WebSocket manager class.
* There is a single instance for all WebSocket endpoints.
*/
class WebSocketManager {
protected static ITopologyService topologyService;
private static final Logger log =
LoggerFactory.getLogger(WebSocketManager.class);
private int webSocketPort;
private JettyServer jettyServer;
/**
* Constructor.
*
* @param topologyService the Topology Service to use.
* @param webSocketPort the WebSocket port to use.
*/
@SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD",
justification = "The writing to WebSocketManager.topologyService happens only once on startup")
WebSocketManager(ITopologyService topologyService,
int webSocketPort) {
WebSocketManager.topologyService = topologyService;
this.webSocketPort = webSocketPort;
}
/**
* Startup processing.
*/
void startup() {
log.debug("Starting WebSocket server on port {}", webSocketPort);
jettyServer = new JettyServer(webSocketPort);
this.jettyServer.start();
}
/**
* Class for creating the WebSocket server and associated state.
*/
static class JettyServer extends Thread {
private Server server;
private ServletContextHandler context;
private ServerContainer container;
/**
* Constructor.
*
* @param port the port to listen on.
*/
JettyServer(final int port) {
server = new Server(port);
// Initialize the context handler
context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/ws/onos");
server.setHandler(context);
// Initialize the WebSocket layer
container =
WebSocketServerContainerInitializer.configureContext(context);
try {
container.addEndpoint(TopologyWebSocket.class);
} catch (DeploymentException e) {
log.debug("Exception adding WebSocket endpoint: ", e);
}
}
/**
* Run the thread.
*/
@Override
public void run() {
try {
this.server.start();
} catch (final Exception e) {
log.debug("Exception starting the WebSocket server: ", e);
}
try {
this.server.join();
} catch (final InterruptedException e) {
log.debug("Exception joining the WebSocket server: ", e);
}
}
}
}