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: [email protected]
For additional commands, e-mail: [email protected]