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