package org.frameworkset.web.socket.handler; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; import javax.servlet.ServletContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.frameworkset.schedule.TaskScheduler; import org.frameworkset.web.servlet.context.ServletContextAware; import org.frameworkset.web.socket.sockjs.TransportHandler; import org.frameworkset.web.socket.sockjs.transport.EventSourceTransportHandler; import org.frameworkset.web.socket.sockjs.transport.HtmlFileTransportHandler; import org.frameworkset.web.socket.sockjs.transport.JsonpPollingTransportHandler; import org.frameworkset.web.socket.sockjs.transport.JsonpReceivingTransportHandler; import org.frameworkset.web.socket.sockjs.transport.TransportHandlingSockJsService; import org.frameworkset.web.socket.sockjs.transport.XhrPollingTransportHandler; import org.frameworkset.web.socket.sockjs.transport.XhrReceivingTransportHandler; import org.frameworkset.web.socket.sockjs.transport.XhrStreamingTransportHandler; public class DefaultSockJsService extends TransportHandlingSockJsService implements ServletContextAware { /** * Create a DefaultSockJsService with default {@link TransportHandler handler} types. * @param scheduler a task scheduler for heart-beat messages and removing * timed-out sessions; the provided TaskScheduler should be declared as a * Spring bean to ensure it is initialized at start up and shut down when the * application stops. */ public DefaultSockJsService(TaskScheduler scheduler) { this(scheduler, getDefaultTransportHandlers(null)); } /** * Create a DefaultSockJsService with overridden {@link TransportHandler handler} types * replacing the corresponding default handler implementation. * @param scheduler a task scheduler for heart-beat messages and removing timed-out sessions; * the provided TaskScheduler should be declared as a Spring bean to ensure it gets * initialized at start-up and shuts down when the application stops * @param handlerOverrides zero or more overrides to the default transport handler types */ public DefaultSockJsService(TaskScheduler scheduler, TransportHandler... handlerOverrides) { this(scheduler, Arrays.asList(handlerOverrides)); } /** * Create a DefaultSockJsService with overridden {@link TransportHandler handler} types * replacing the corresponding default handler implementation. * @param scheduler a task scheduler for heart-beat messages and removing timed-out sessions; * the provided TaskScheduler should be declared as a Spring bean to ensure it gets * initialized at start-up and shuts down when the application stops * @param handlerOverrides zero or more overrides to the default transport handler types */ public DefaultSockJsService(TaskScheduler scheduler, Collection<TransportHandler> handlerOverrides) { super(scheduler, getDefaultTransportHandlers(handlerOverrides)); } private static Set<TransportHandler> getDefaultTransportHandlers(Collection<TransportHandler> overrides) { Set<TransportHandler> result = new LinkedHashSet<TransportHandler>(8); result.add(new XhrPollingTransportHandler()); result.add(new XhrReceivingTransportHandler()); result.add(new XhrStreamingTransportHandler()); result.add(new JsonpPollingTransportHandler()); result.add(new JsonpReceivingTransportHandler()); result.add(new EventSourceTransportHandler()); result.add(new HtmlFileTransportHandler()); try { result.add(new WebSocketTransportHandler(new DefaultHandshakeHandler())); } catch (Exception ex) { Log logger = LogFactory.getLog(DefaultSockJsService.class); if (logger.isWarnEnabled()) { logger.warn("Failed to create a default WebSocketTransportHandler", ex); } } if (overrides != null) { result.addAll(overrides); } return result; } @Override public void setServletContext(ServletContext servletContext) { for (TransportHandler handler : getTransportHandlers().values()) { if (handler instanceof ServletContextAware) { ((ServletContextAware) handler).setServletContext(servletContext); } } } }