Author: violetagg
Date: Thu Aug 13 13:03:56 2015
New Revision: 1695706

URL: http://svn.apache.org/r1695706
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58232
When ServerEndpointConfig is added programatically and the endpoint class that 
it provides is annotated, NPE is thrown while initializing HTTP upgrade handler.

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/Util.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java
    
tomcat/trunk/test/org/apache/tomcat/websocket/server/TestWsServerContainer.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Util.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Util.java?rev=1695706&r1=1695705&r2=1695706&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/Util.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/Util.java Thu Aug 13 13:03:56 
2015
@@ -331,7 +331,7 @@ public class Util {
 
 
     public static List<DecoderEntry> getDecoders(
-            Class<? extends Decoder>[] decoderClazzes)
+            List<Class<? extends Decoder>> decoderClazzes)
                     throws DeploymentException{
 
         List<DecoderEntry> result = new ArrayList<>();
@@ -464,9 +464,7 @@ public class Util {
         try {
             List<Class<? extends Decoder>> decoders =
                     endpointConfig.getDecoders();
-            @SuppressWarnings("unchecked")
-            List<DecoderEntry> decoderEntries = getDecoders(
-                    decoders.toArray(new Class[decoders.size()]));
+            List<DecoderEntry> decoderEntries = getDecoders(decoders);
             decoderMatch = new DecoderMatch(target, decoderEntries);
         } catch (DeploymentException e) {
             throw new IllegalArgumentException(e);

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1695706&r1=1695705&r2=1695706&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Thu 
Aug 13 13:03:56 2015
@@ -108,7 +108,7 @@ public class WsWebSocketContainer implem
                             pojo.getClass().getName()));
         }
 
-        Endpoint ep = new PojoEndpointClient(pojo, annotation.decoders());
+        Endpoint ep = new PojoEndpointClient(pojo, 
Arrays.asList(annotation.decoders()));
 
         Class<? extends ClientEndpointConfig.Configurator> configuratorClazz =
                 annotation.configurator();

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java?rev=1695706&r1=1695705&r2=1695706&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java 
Thu Aug 13 13:03:56 2015
@@ -17,6 +17,7 @@
 package org.apache.tomcat.websocket.pojo;
 
 import java.util.Collections;
+import java.util.List;
 
 import javax.websocket.Decoder;
 import javax.websocket.DeploymentException;
@@ -32,7 +33,7 @@ import javax.websocket.Session;
 public class PojoEndpointClient extends PojoEndpointBase {
 
     public PojoEndpointClient(Object pojo,
-            Class<? extends Decoder>[] decoders) throws DeploymentException {
+            List<Class<? extends Decoder>> decoders) throws 
DeploymentException {
         setPojo(pojo);
         setMethodMapping(
                 new PojoMethodMapping(pojo.getClass(), decoders, null));

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java?rev=1695706&r1=1695705&r2=1695706&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java 
Thu Aug 13 13:03:56 2015
@@ -71,7 +71,7 @@ public class PojoMethodMapping {
 
 
     public PojoMethodMapping(Class<?> clazzPojo,
-            Class<? extends Decoder>[] decoderClazzes, String wsPath)
+            List<Class<? extends Decoder>> decoderClazzes, String wsPath)
                     throws DeploymentException {
 
         this.wsPath = wsPath;

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=1695706&r1=1695705&r2=1695706&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServerContainer.java 
Thu Aug 13 13:03:56 2015
@@ -182,6 +182,13 @@ public class WsServerContainer extends W
         }
         String path = sec.getPath();
 
+        // Add method mapping to user properties
+        PojoMethodMapping methodMapping = new 
PojoMethodMapping(sec.getEndpointClass(),
+                sec.getDecoders(), path);
+        sec.getUserProperties().put(
+                
org.apache.tomcat.websocket.pojo.Constants.POJO_METHOD_MAPPING_KEY,
+                methodMapping);
+
         UriTemplate uriTemplate = new UriTemplate(path);
         if (uriTemplate.hasParameters()) {
             Integer key = Integer.valueOf(uriTemplate.getSegmentCount());
@@ -239,10 +246,6 @@ public class WsServerContainer extends W
         // Validate encoders
         validateEncoders(annotation.encoders());
 
-        // Method mapping
-        PojoMethodMapping methodMapping = new PojoMethodMapping(pojo,
-                annotation.decoders(), path);
-
         // ServerEndpointConfig
         ServerEndpointConfig sec;
         Class<? extends Configurator> configuratorClazz =
@@ -264,9 +267,6 @@ public class WsServerContainer extends W
                 subprotocols(Arrays.asList(annotation.subprotocols())).
                 configurator(configurator).
                 build();
-        sec.getUserProperties().put(
-                
org.apache.tomcat.websocket.pojo.Constants.POJO_METHOD_MAPPING_KEY,
-                methodMapping);
 
         addEndpoint(sec);
     }

Modified: 
tomcat/trunk/test/org/apache/tomcat/websocket/server/TestWsServerContainer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/server/TestWsServerContainer.java?rev=1695706&r1=1695705&r2=1695706&view=diff
==============================================================================
--- 
tomcat/trunk/test/org/apache/tomcat/websocket/server/TestWsServerContainer.java 
(original)
+++ 
tomcat/trunk/test/org/apache/tomcat/websocket/server/TestWsServerContainer.java 
Thu Aug 13 13:03:56 2015
@@ -16,8 +16,16 @@
  */
 package org.apache.tomcat.websocket.server;
 
+import java.net.URI;
+import java.util.Queue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import javax.servlet.ServletContextEvent;
+import javax.websocket.ContainerProvider;
 import javax.websocket.DeploymentException;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
 import javax.websocket.server.ServerContainer;
 import javax.websocket.server.ServerEndpointConfig;
 
@@ -31,6 +39,8 @@ import org.apache.catalina.servlets.Defa
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.websocket.TesterEchoServer;
+import org.apache.tomcat.websocket.TesterMessageCountClient.BasicText;
+import org.apache.tomcat.websocket.pojo.TesterUtil.SimpleClient;
 
 
 public class TestWsServerContainer extends TomcatBaseTest {
@@ -50,6 +60,43 @@ public class TestWsServerContainer exten
     }
 
 
+    @Test
+    public void testBug58232() throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+        // No file system docBase required
+        Context ctx = tomcat.addContext("", null);
+        ctx.addApplicationListener(Bug54807Config.class.getName());
+        Tomcat.addServlet(ctx, "default", new DefaultServlet());
+        ctx.addServletMapping("/", "default");
+
+        WebSocketContainer wsContainer =
+                ContainerProvider.getWebSocketContainer();
+
+        tomcat.start();
+
+        Assert.assertEquals(LifecycleState.STARTED, ctx.getState());
+
+        SimpleClient client = new SimpleClient();
+        URI uri = new URI("ws://localhost:" + getPort() + "/echoBasic");
+
+        try (Session session = wsContainer.connectToServer(client, uri);) {
+            CountDownLatch latch = new CountDownLatch(1);
+            BasicText handler = new BasicText(latch);
+            session.addMessageHandler(handler);
+            session.getBasicRemote().sendText("echoBasic");
+
+            boolean latchResult = handler.getLatch().await(10, 
TimeUnit.SECONDS);
+            Assert.assertTrue(latchResult);
+
+            Queue<String> messages = handler.getMessages();
+            Assert.assertEquals(1, messages.size());
+            for (String message : messages) {
+                Assert.assertEquals("echoBasic", message);
+            }
+        }
+    }
+
+
     public static class Bug54807Config extends WsContextListener {
 
         @Override



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to