Author: markt Date: Thu Jun 20 22:24:25 2013 New Revision: 1495216 URL: http://svn.apache.org/r1495216 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55120 @OnOpen needs to support an optional EndpointConfig parameter. Based on a patch by Niki Dokovski.
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestPojoEndpointBase.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java?rev=1495216&r1=1495215&r2=1495216&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java Thu Jun 20 22:24:25 2013 @@ -56,7 +56,8 @@ public abstract class PojoEndpointBase e if (methodMapping.getOnOpen() != null) { try { methodMapping.getOnOpen().invoke(pojo, - methodMapping.getOnOpenArgs(pathParameters, session)); + methodMapping.getOnOpenArgs( + pathParameters, session, config)); } catch (IllegalAccessException e) { // Reflection related problems 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=1495216&r1=1495215&r2=1495216&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java Thu Jun 20 22:24:25 2013 @@ -112,8 +112,9 @@ public class PojoMethodMapping { public Object[] getOnOpenArgs(Map<String,String> pathParameters, - Session session) throws DecodeException { - return buildArgs(onOpenParams, pathParameters, session, null, null); + Session session, EndpointConfig config) throws DecodeException { + return buildArgs(onOpenParams, pathParameters, session, config, null, + null); } @@ -124,8 +125,8 @@ public class PojoMethodMapping { public Object[] getOnCloseArgs(Map<String,String> pathParameters, Session session, CloseReason closeReason) throws DecodeException { - return buildArgs( - onCloseParams, pathParameters, session, null, closeReason); + return buildArgs(onCloseParams, pathParameters, session, null, null, + closeReason); } @@ -136,8 +137,8 @@ public class PojoMethodMapping { public Object[] getOnErrorArgs(Map<String,String> pathParameters, Session session, Throwable throwable) throws DecodeException { - return buildArgs( - onErrorParams, pathParameters, session, throwable, null); + return buildArgs(onErrorParams, pathParameters, session, null, + throwable, null); } @@ -189,6 +190,9 @@ public class PojoMethodMapping { Class<?> type = types[i]; if (type.equals(Session.class)) { result[i] = new PojoPathParam(type, null); + } else if (methodType == MethodType.ON_OPEN && + type.equals(EndpointConfig.class)) { + result[i] = new PojoPathParam(type, null); } else if (methodType == MethodType.ON_ERROR && type.equals(Throwable.class)) { foundThrowable = true; @@ -223,13 +227,15 @@ public class PojoMethodMapping { private static Object[] buildArgs(PojoPathParam[] pathParams, Map<String,String> pathParameters, Session session, - Throwable throwable, CloseReason closeReason) + EndpointConfig config, Throwable throwable, CloseReason closeReason) throws DecodeException { Object[] result = new Object[pathParams.length]; for (int i = 0; i < pathParams.length; i++) { Class<?> type = pathParams[i].getType(); if (type.equals(Session.class)) { result[i] = session; + } else if (type.equals(EndpointConfig.class)) { + result[i] = config; } else if (type.equals(Throwable.class)) { result[i] = throwable; } else if (type.equals(CloseReason.class)) { Modified: tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestPojoEndpointBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestPojoEndpointBase.java?rev=1495216&r1=1495215&r2=1495216&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestPojoEndpointBase.java (original) +++ tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestPojoEndpointBase.java Thu Jun 20 22:24:25 2013 @@ -22,8 +22,11 @@ import java.util.concurrent.TimeUnit; import javax.websocket.ClientEndpoint; import javax.websocket.ContainerProvider; +import javax.websocket.EndpointConfig; import javax.websocket.OnClose; +import javax.websocket.OnError; import javax.websocket.OnOpen; +import javax.websocket.Session; import javax.websocket.WebSocketContainer; import javax.websocket.server.ServerEndpoint; @@ -72,6 +75,56 @@ public class TestPojoEndpointBase extend Assert.assertTrue("Server failed to close connection", closed); } + @Test + public void testOnOpenPojoMethod() throws Exception { + // Set up utility classes + OnOpenServerEndpoint server = new OnOpenServerEndpoint(); + SingletonConfigurator.setInstance(server); + ServerConfigListener.setPojoClazz(OnOpenServerEndpoint.class); + + Tomcat tomcat = getTomcatInstance(); + // Must have a real docBase - just use temp + Context ctx = + tomcat.addContext("", System.getProperty("java.io.tmpdir")); + ctx.addApplicationListener(new ApplicationListener( + ServerConfigListener.class.getName(), false)); + Tomcat.addServlet(ctx, "default", new DefaultServlet()); + ctx.addServletMapping("/", "default"); + + WebSocketContainer wsContainer = + ContainerProvider.getWebSocketContainer(); + + + tomcat.start(); + + Client client = new Client(); + URI uri = new URI("ws://localhost:" + getPort() + "/"); + + Session session = wsContainer.connectToServer(client, uri); + + client.waitForClose(5); + Assert.assertTrue(session.isOpen()); + } + + + + @ServerEndpoint("/") + public static class OnOpenServerEndpoint { + + @OnOpen + public void onOpen(@SuppressWarnings("unused") Session session, + EndpointConfig config) { + if (config == null) { + throw new RuntimeException(); + } + } + + @OnError + public void onError(@SuppressWarnings("unused") Throwable t){ + throw new RuntimeException(); + } + } + @ServerEndpoint("/") public static class Bug54716 { Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1495216&r1=1495215&r2=1495216&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu Jun 20 22:24:25 2013 @@ -56,7 +56,8 @@ </add> <add> Implement JSR 356 - WebSockets. The JSR 356 implementation includes - contributions from Nick Williams and Rossen Stoyanchev. (markt) + contributions from Nick Williams, Rossen Stoyanchev and Niki Dokovski. + (markt) </add> <add> <bug>45995</bug>: Align Tomcat with Apache httpd and perform MIME type --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org