Author: markt
Date: Sat Jun 22 14:09:34 2013
New Revision: 1495735

URL: http://svn.apache.org/r1495735
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55127
Encoders have init() and destroy() methdos that need to be called.
Based on a patch provided by Niki Dokovski.

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
    
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
    
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
    
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
    tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java?rev=1495735&r1=1495734&r2=1495735&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 
Sat Jun 22 14:09:34 2013
@@ -38,6 +38,7 @@ import java.util.concurrent.atomic.Atomi
 import javax.websocket.DeploymentException;
 import javax.websocket.EncodeException;
 import javax.websocket.Encoder;
+import javax.websocket.EndpointConfig;
 import javax.websocket.RemoteEndpoint;
 import javax.websocket.SendHandler;
 import javax.websocket.SendResult;
@@ -460,13 +461,15 @@ public abstract class WsRemoteEndpointIm
     }
 
 
-    protected void setEncoders(List<Class<? extends Encoder>> encoders)
+    protected void setEncoders(EndpointConfig endpointConfig)
             throws DeploymentException {
         encoderEntries.clear();
-        for (Class<? extends Encoder> encoderClazz : encoders) {
+        for (Class<? extends Encoder> encoderClazz :
+                endpointConfig.getEncoders()) {
             Encoder instance;
             try {
                 instance = encoderClazz.newInstance();
+                instance.init(endpointConfig);
             } catch (InstantiationException | IllegalAccessException e) {
                 throw new DeploymentException(
                         sm.getString("wsRemoteEndpoint.invalidEncoder",
@@ -489,10 +492,17 @@ public abstract class WsRemoteEndpointIm
     }
 
 
+    protected final void close() {
+        for (EncoderEntry entry : encoderEntries) {
+            entry.getEncoder().destroy();
+        }
+        doClose();
+    }
+
+
     protected abstract void doWrite(SendHandler handler, ByteBuffer... data);
     protected abstract boolean isMasked();
-    protected abstract void close();
-
+    protected abstract void doClose();
 
     private static void writeHeader(ByteBuffer headerBuffer, byte opCode,
             ByteBuffer payload, boolean first, boolean last, boolean masked,

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java?rev=1495735&r1=1495734&r2=1495735&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java 
(original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java 
Sat Jun 22 14:09:34 2013
@@ -50,7 +50,7 @@ public class WsRemoteEndpointImplClient 
     }
 
     @Override
-    protected void close() {
+    protected void doClose() {
         channel.close();
     }
 }

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=1495735&r1=1495734&r2=1495735&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Sat Jun 22 
14:09:34 2013
@@ -33,8 +33,8 @@ import java.util.concurrent.atomic.Atomi
 import javax.websocket.CloseReason;
 import javax.websocket.CloseReason.CloseCodes;
 import javax.websocket.DeploymentException;
-import javax.websocket.Encoder;
 import javax.websocket.Endpoint;
+import javax.websocket.EndpointConfig;
 import javax.websocket.Extension;
 import javax.websocket.MessageHandler;
 import javax.websocket.PongMessage;
@@ -100,8 +100,7 @@ public class WsSession implements Sessio
             URI requestUri, Map<String,List<String>> requestParameterMap,
             String queryString, Principal userPrincipal, String subProtocol,
             Map<String,String> pathParameters,
-            boolean secure, List<Class<? extends Encoder>> encoders,
-            Map<String,Object> userProperties)
+            boolean secure, EndpointConfig endpointConfig)
                     throws DeploymentException {
         this.localEndpoint = localEndpoint;
         this.wsRemoteEndpoint = wsRemoteEndpoint;
@@ -133,9 +132,9 @@ public class WsSession implements Sessio
         }
         this.pathParameters = pathParameters;
         this.secure = secure;
-        this.wsRemoteEndpoint.setEncoders(encoders);
+        this.wsRemoteEndpoint.setEncoders(endpointConfig);
 
-        this.userProperties.putAll(userProperties);
+        this.userProperties.putAll(endpointConfig.getUserProperties());
         this.id = Long.toHexString(ids.getAndIncrement());
     }
 

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=1495735&r1=1495734&r2=1495735&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Sat 
Jun 22 14:09:34 2013
@@ -346,8 +346,7 @@ public class WsWebSocketContainer
         WsSession wsSession = new WsSession(endpoint, wsRemoteEndpointClient,
                 this, null, null, null, null, subProtocol,
                 Collections.EMPTY_MAP, false,
-                clientEndpointConfiguration.getEncoders(),
-                clientEndpointConfiguration.getUserProperties());
+                clientEndpointConfiguration);
         endpoint.onOpen(wsSession, clientEndpointConfiguration);
         registerSession(endpoint.getClass(), wsSession);
 

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1495735&r1=1495734&r2=1495735&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java 
(original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java 
Sat Jun 22 14:09:34 2013
@@ -113,8 +113,7 @@ public class WsHttpUpgradeHandler implem
                     handshakeRequest.getParameterMap(),
                     handshakeRequest.getQueryString(),
                     handshakeRequest.getUserPrincipal(), subProtocol,
-                    pathParameters, secure, endpointConfig.getEncoders(),
-                    endpointConfig.getUserProperties());
+                    pathParameters, secure, endpointConfig);
             WsFrameServer wsFrame = new WsFrameServer(
                     sis,
                     wsSession);

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java?rev=1495735&r1=1495734&r2=1495735&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
 Sat Jun 22 14:09:34 2013
@@ -124,7 +124,7 @@ public class WsRemoteEndpointImplServer 
 
 
     @Override
-    protected void close() {
+    protected void doClose() {
         try {
             sos.close();
         } catch (IOException e) {

Modified: 
tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java?rev=1495735&r1=1495734&r2=1495735&view=diff
==============================================================================
--- 
tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java 
(original)
+++ 
tomcat/trunk/test/org/apache/tomcat/websocket/pojo/TestEncodingDecoding.java 
Sat Jun 22 14:09:34 2013
@@ -18,6 +18,7 @@ package org.apache.tomcat.websocket.pojo
 
 import java.net.URI;
 import java.nio.ByteBuffer;
+import java.util.HashMap;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
@@ -97,6 +98,17 @@ public class TestEncodingDecoding extend
                 ((MsgString) server.received.peek()).getData());
         Assert.assertEquals(MESSAGE_ONE,
                 ((MsgString) client.received.peek()).getData());
+        session.close();
+        Thread.sleep(100);
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgStringEncoder.class.getName()+":init"));
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgStringDecoder.class.getName()+":init"));
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgByteEncoder.class.getName()+":init"));
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgByteDecoder.class.getName()+":init"));
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgStringEncoder.class.getName()+":destroy"));
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgStringDecoder.class.getName()+":destroy"));
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgByteEncoder.class.getName()+":destroy"));
+        
Assert.assertTrue(Server.isLifeCycleEventCalled(MsgByteDecoder.class.getName()+":destroy"));
+
     }
 
     @ClientEndpoint(decoders={MsgStringDecoder.class, MsgByteDecoder.class},
@@ -122,6 +134,7 @@ public class TestEncodingDecoding extend
             configurator=SingletonConfigurator.class)
     public static class Server {
         private Queue<Object> received = new ConcurrentLinkedQueue<>();
+        static HashMap<String, Boolean> lifeCyclesCalled = new HashMap<>(8);
 
         @OnMessage
         public MsgString rx(MsgString in) {
@@ -136,6 +149,15 @@ public class TestEncodingDecoding extend
             // Echo the message back
             return in;
         }
+
+        public static void addLifeCycleEvent(String event){
+            lifeCyclesCalled.put(event, Boolean.TRUE);
+        }
+
+        public static boolean isLifeCycleEventCalled(String event){
+            Boolean called = lifeCyclesCalled.get(event);
+            return called == null ? false : called.booleanValue();
+        }
     }
 
 
@@ -151,12 +173,12 @@ public class TestEncodingDecoding extend
 
         @Override
         public void init(EndpointConfig endpointConfig) {
-            // NO-OP
+            Server.addLifeCycleEvent(getClass().getName() + ":init");
         }
 
         @Override
         public void destroy() {
-            // NO-OP
+            Server.addLifeCycleEvent(getClass().getName() + ":destroy");
         }
 
         @Override
@@ -170,12 +192,12 @@ public class TestEncodingDecoding extend
 
         @Override
         public void init(EndpointConfig endpointConfig) {
-            // NO-OP
+            Server.addLifeCycleEvent(getClass().getName() + ":init");
         }
 
         @Override
         public void destroy() {
-            // NO-OP
+            Server.addLifeCycleEvent(getClass().getName() + ":destroy");
         }
 
         @Override
@@ -204,12 +226,12 @@ public class TestEncodingDecoding extend
 
         @Override
         public void init(EndpointConfig endpointConfig) {
-            // NO-OP
+            Server.addLifeCycleEvent(getClass().getName() + ":init");
         }
 
         @Override
         public void destroy() {
-            // NO-OP
+            Server.addLifeCycleEvent(getClass().getName() + ":destroy");
         }
 
         @Override
@@ -228,12 +250,12 @@ public class TestEncodingDecoding extend
 
         @Override
         public void init(EndpointConfig endpointConfig) {
-            // NO-OP
+             Server.addLifeCycleEvent(getClass().getName() + ":init");
         }
 
         @Override
         public void destroy() {
-            // NO-OP
+            Server.addLifeCycleEvent(getClass().getName() + ":destroy");
         }
 
         @Override



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to