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]

Reply via email to