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