Author: markt Date: Thu Mar 7 13:04:18 2013 New Revision: 1453843 URL: http://svn.apache.org/r1453843 Log: Align implementation with spec
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsSci.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainerProvider.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsSci.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsSci.java?rev=1453843&r1=1453842&r2=1453843&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsSci.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsSci.java Thu Mar 7 13:04:18 2013 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.websocket.server; +import java.util.HashSet; import java.util.Set; import javax.servlet.ServletContainerInitializer; @@ -23,14 +24,18 @@ import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.HandlesTypes; import javax.websocket.DeploymentException; +import javax.websocket.Endpoint; +import javax.websocket.server.ServerApplicationConfig; import javax.websocket.server.ServerEndpoint; +import javax.websocket.server.ServerEndpointConfig; /** * Registers an interest in any class that is annotated with * {@link ServerEndpoint} so that Endpoint can be published via the WebSocket * server. */ -@HandlesTypes({ServerEndpoint.class}) +@HandlesTypes({ServerEndpoint.class, ServerEndpointConfig.class, + ServerApplicationConfig.class}) public class WsSci implements ServletContainerInitializer { @Override @@ -43,14 +48,62 @@ public class WsSci implements ServletCon return; } + // Group the discovered classes by type + Set<ServerApplicationConfig> serverApplicationConfigs = new HashSet<>(); + Set<ServerEndpointConfig> scannedEndpointConfigs = new HashSet<>(); + Set<Class<? extends Endpoint>> scannedEndpointClazzes = new HashSet<>(); + Set<Class<?>> scannedPojoEndpoints = new HashSet<>(); + + try { + for (Class<?> clazz : clazzes) { + if (ServerApplicationConfig.class.isAssignableFrom(clazz)) { + serverApplicationConfigs.add( + (ServerApplicationConfig) clazz.newInstance()); + } + if (ServerEndpointConfig.class.isAssignableFrom(clazz)) { + @SuppressWarnings("unchecked") + Class<? extends ServerEndpointConfig> configClazz = + (Class<? extends ServerEndpointConfig>) clazz; + ServerEndpointConfig config = configClazz.newInstance(); + scannedEndpointConfigs.add(config); + scannedEndpointClazzes.add( + (Class<? extends Endpoint>) config.getEndpointClass()); + } + if (clazz.isAnnotationPresent(ServerEndpoint.class)) { + scannedPojoEndpoints.add(clazz); + } + } + } catch (InstantiationException | IllegalAccessException e) { + throw new ServletException(e); + } + + // Filter the results + Set<ServerEndpointConfig> filteredEndpointConfigs = new HashSet<>(); + Set<Class<?>> filteredPojoEndpoints = new HashSet<>(); + + if (serverApplicationConfigs.isEmpty()) { + filteredEndpointConfigs.addAll(scannedEndpointConfigs); + filteredPojoEndpoints.addAll(scannedPojoEndpoints); + } else { + for (ServerApplicationConfig config : serverApplicationConfigs) { + filteredEndpointConfigs.addAll( + config.getEndpointConfigs(scannedEndpointClazzes)); + } + } + WsServerContainer sc = WsServerContainer.getServerContainer(); sc.setServletContext(ctx); - for (Class<?> clazz : clazzes) { - try { + try { + // Deploy endpoints + for (ServerEndpointConfig config : filteredEndpointConfigs) { + sc.addEndpoint(config); + } + // Deploy POJOs + for (Class<?> clazz : filteredPojoEndpoints) { sc.addEndpoint(clazz); - } catch (DeploymentException e) { - throw new ServletException(e); } + } catch (DeploymentException e) { + throw new ServletException(e); } } } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java?rev=1453843&r1=1453842&r2=1453843&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java Thu Mar 7 13:04:18 2013 @@ -84,6 +84,11 @@ public class WsServerContainer extends W new ConcurrentHashMap<>(); + private WsServerContainer() { + // Hide default constructor + } + + public void setServletContext(ServletContext servletContext) { if (this.servletContext == servletContext) { Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainerProvider.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainerProvider.java?rev=1453843&r1=1453842&r2=1453843&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainerProvider.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainerProvider.java Thu Mar 7 13:04:18 2013 @@ -24,6 +24,6 @@ public class WsServerContainerProvider e @Override protected ServerContainer getContainer() { - return new WsServerContainer(); + return WsServerContainer.getServerContainer(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org