Author: markt
Date: Wed Jun 26 12:45:47 2013
New Revision: 1496907
URL: http://svn.apache.org/r1496907
Log:
BZ 55143
Handle removal of listeners that might have been wrapped
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1496907&r1=1496906&r2=1496907&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Wed Jun 26
12:45:47 2013
@@ -44,6 +44,7 @@ import javax.websocket.WebSocketContaine
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.res.StringManager;
+import org.apache.tomcat.websocket.pojo.PojoMessageHandlerBase;
public class WsSession implements Session {
@@ -236,23 +237,42 @@ public class WsSession implements Sessio
return;
}
- // TODO Handle wrapped listeners
+ MessageHandler wrapped = null;
- if (listener.equals(textMessageHandler)) {
+ if (listener instanceof PojoMessageHandlerBase) {
+ wrapped =
+ ((PojoMessageHandlerBase<?>) listener).getWrappedHandler();
+ }
+
+ if (wrapped == null) {
+ wrapped = listener;
+ }
+
+ boolean removed = false;
+ if (wrapped.equals(textMessageHandler) ||
+ listener.equals(textMessageHandler)) {
textMessageHandler = null;
- return;
- } else if (listener.equals(binaryMessageHandler)) {
+ removed = true;
+ }
+
+ if (listener.equals(binaryMessageHandler) ||
+ listener.equals(binaryMessageHandler)) {
binaryMessageHandler = null;
- return;
- } else if (listener.equals(pongMessageHandler)) {
+ removed = true;
+ }
+
+ if (listener.equals(pongMessageHandler) ||
+ listener.equals(pongMessageHandler)) {
pongMessageHandler = null;
- return;
+ removed = true;
}
- // ISE for now. Could swallow this silently / log this if the ISE
- // becomes a problem
- throw new IllegalStateException(
- sm.getString("wsSession.removeHandlerFailed", listener));
+ if (!removed) {
+ // ISE for now. Could swallow this silently / log this if the ISE
+ // becomes a problem
+ throw new IllegalStateException(
+ sm.getString("wsSession.removeHandlerFailed", listener));
+ }
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java?rev=1496907&r1=1496906&r2=1496907&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java
Wed Jun 26 12:45:47 2013
@@ -21,6 +21,7 @@ import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import javax.websocket.EncodeException;
+import javax.websocket.MessageHandler;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
@@ -73,4 +74,18 @@ public abstract class PojoMessageHandler
throw new IllegalStateException(ioe);
}
}
+
+
+ /**
+ * Expose the POJO if it is a message handler so the Session is able to
+ * match requests to remove handlers if the original handler has been
+ * wrapped.
+ */
+ public MessageHandler getWrappedHandler() {
+ if (pojo instanceof MessageHandler) {
+ return (MessageHandler) pojo;
+ } else {
+ return null;
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]