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