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

Reply via email to