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