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); } } } }