/* ** ** Copyright 2013, Jules White ** ** */ package org.magnum.soda.server.wamp; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.websocket.WebSocket; import org.eclipse.jetty.websocket.WebSocketFactory; import org.magnum.soda.msg.Protocol; import org.magnum.soda.protocol.generic.DefaultProtocol; import org.magnum.soda.server.wamp.adapters.jetty.JettyServer; import org.magnum.soda.server.wamp.adapters.jetty.JettyServerHandler; import org.magnum.soda.svc.AuthService; public abstract class WebsocketServletAdapter extends HttpServlet { private static WebSocketFactory _wsFactory; private static WebSocketFactory get(final WebsocketServletAdapter wrapper) { if (_wsFactory == null) { boolean initClient = false; if (wrapper.getWampServer() == null) { Protocol protoc = wrapper.getSodaProtocol(); WampServer wampocServer = new WampServer(); SourceHonestyFilter filter = new SourceHonestyFilter(protoc); wampocServer.addListener(filter); wampocServer.addPublishFilter(filter); wampocServer.setSubscriptions(wrapper .getSodaSubscriptionManager()); wrapper.setWampServer(wampocServer); initClient = true; } // Create and configure WS factory _wsFactory = new WebSocketFactory(new JettyServerHandler( wrapper.getWampServer())); _wsFactory.setBufferSize(4096); _wsFactory.setMaxIdleTime(60000); if (initClient) { Thread t = new Thread(new Runnable() { @Override public void run() { ServerSoda soda = new ServerSoda( wrapper.getSodaProtocol(), wrapper.getSodaAuthService(), wrapper.getPath(), wrapper.getPort()); wrapper.getWampServer().addListener(soda); soda.connect(null); } }); t.start(); } } return _wsFactory; } private int port_ = -1; private WampServer wampServer_; private String path_ = "/"; @Override public void init() throws ServletException { if (port_ == -1) { port_ = Integer.parseInt(getServletConfig().getServletContext() .getInitParameter("port")); } get(this); } public String getPath() { return path_; } public void setPath(String path) { path_ = path; } protected Subscriptions getSodaSubscriptionManager() { return new Subscriptions(); } protected AuthService getSodaAuthService() { return AuthService.NO_AUTH_SVC; } protected Protocol getSodaProtocol() { return new DefaultProtocol(); } public int getPort() { return port_; } public void setPort(int port) { port_ = port; } public WampServer getWampServer() { return wampServer_; } public void setWampServer(WampServer wampServer) { wampServer_ = wampServer; } protected abstract void started(ServerSoda soda); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { if (_wsFactory.acceptWebSocket(request, response)) return; response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Websocket only"); } }