Author: markt
Date: Fri Mar 8 00:09:27 2013
New Revision: 1454181
URL: http://svn.apache.org/r1454181
Log:
More decoder plumbing
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointBase.java
Fri Mar 8 00:09:27 2013
@@ -18,9 +18,11 @@ package org.apache.tomcat.websocket.pojo
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
+import java.util.Set;
import javax.websocket.CloseReason;
import javax.websocket.Endpoint;
+import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
@@ -39,7 +41,7 @@ public abstract class PojoEndpointBase e
private PojoMethodMapping methodMapping;
- protected final void doOnOpen(Session session) {
+ protected final void doOnOpen(Session session, EndpointConfig config) {
PojoMethodMapping methodMapping = getMethodMapping();
Object pojo = getPojo();
Map<String,String> pathParameters = getPathParameters();
@@ -55,7 +57,7 @@ public abstract class PojoEndpointBase e
}
}
for (MessageHandler mh : methodMapping.getMessageHandlers(pojo,
- pathParameters, session)) {
+ pathParameters, session, config)) {
session.addMessageHandler(mh);
}
}
@@ -74,6 +76,14 @@ public abstract class PojoEndpointBase e
pojo.getClass().getName()), e);
}
}
+
+ // Trigger the destroy method for any associated decoders
+ Set<MessageHandler> messageHandlers = session.getMessageHandlers();
+ for (MessageHandler messageHandler : messageHandlers) {
+ if (messageHandler instanceof PojoMessageHandlerWholeBase<?>) {
+ ((PojoMessageHandlerWholeBase<?>) messageHandler).onClose();
+ }
+ }
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointClient.java
Fri Mar 8 00:09:27 2013
@@ -32,6 +32,6 @@ public class PojoEndpointClient extends
@Override
public void onOpen(Session session, EndpointConfig config) {
- doOnOpen(session);
+ doOnOpen(session, config);
}
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoEndpointServer.java
Fri Mar 8 00:09:27 2013
@@ -66,6 +66,6 @@ public class PojoEndpointServer extends
POJO_METHOD_MAPPING_KEY);
setMethodMapping(methodMapping);
- doOnOpen(session);
+ doOnOpen(session, endpointConfig);
}
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java
Fri Mar 8 00:09:27 2013
@@ -76,4 +76,5 @@ public abstract class PojoMessageHandler
protected abstract Object decode(T message);
+ protected abstract void onClose();
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
Fri Mar 8 00:09:27 2013
@@ -18,7 +18,13 @@ package org.apache.tomcat.websocket.pojo
import java.lang.reflect.Method;
import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import javax.websocket.Decoder;
+import javax.websocket.Decoder.Binary;
+import javax.websocket.Decoder.BinaryStream;
+import javax.websocket.EndpointConfig;
import javax.websocket.Session;
/**
@@ -27,15 +33,45 @@ import javax.websocket.Session;
public class PojoMessageHandlerWholeBinary
extends PojoMessageHandlerWholeBase<ByteBuffer> {
+ private final List<Decoder> decoders = new ArrayList<>();
+
public PojoMessageHandlerWholeBinary(Object pojo, Method method,
- Session session, Object[] params, int indexPayload, boolean unwrap,
- int indexSession) {
+ Session session, EndpointConfig config, Object[] params,
+ int indexPayload, boolean unwrap, int indexSession) {
super(pojo, method, session, params, indexPayload, unwrap,
indexSession);
+ try {
+ for (Class<? extends Decoder> decoderClazz : config.getDecoders())
{
+ if (Binary.class.isAssignableFrom(decoderClazz)) {
+ Binary<?> decoder = (Binary<?>) decoderClazz.newInstance();
+ decoder.init(config);
+ decoders.add(decoder);
+ } else if (Decoder.TextStream.class.isAssignableFrom(
+ decoderClazz)) {
+ BinaryStream<?> decoder =
+ (BinaryStream<?>) decoderClazz.newInstance();
+ decoder.init(config);
+ decoders.add(decoder);
+ } else {
+ // Text decoder - ignore is
+ }
+ }
+ } catch (IllegalAccessException | InstantiationException e) {
+ throw new IllegalArgumentException(e);
+ }
}
+
@Override
protected Object decode(ByteBuffer message) {
// TODO Not implemented
return null;
}
+
+
+ @Override
+ protected void onClose() {
+ for (Decoder decoder : decoders) {
+ decoder.destroy();
+ }
+ }
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java
Fri Mar 8 00:09:27 2013
@@ -38,4 +38,10 @@ public class PojoMessageHandlerWholePong
// Never decoded
return null;
}
+
+
+ @Override
+ protected void onClose() {
+ // NO-OP
+ }
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
Fri Mar 8 00:09:27 2013
@@ -17,7 +17,13 @@
package org.apache.tomcat.websocket.pojo;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import javax.websocket.Decoder;
+import javax.websocket.Decoder.Text;
+import javax.websocket.Decoder.TextStream;
+import javax.websocket.EndpointConfig;
import javax.websocket.Session;
/**
@@ -26,16 +32,46 @@ import javax.websocket.Session;
public class PojoMessageHandlerWholeText
extends PojoMessageHandlerWholeBase<String> {
+ private final List<Decoder> decoders = new ArrayList<>();
+
public PojoMessageHandlerWholeText(Object pojo, Method method,
- Session session, Object[] params, int indexPayload, boolean unwrap,
- int indexSession) {
+ Session session, EndpointConfig config, Object[] params,
+ int indexPayload, boolean unwrap, int indexSession) {
super(pojo, method, session, params, indexPayload, unwrap,
indexSession);
+ try {
+ for (Class<? extends Decoder> decoderClazz : config.getDecoders())
{
+ if (Text.class.isAssignableFrom(decoderClazz)) {
+ Text<?> decoder = (Text<?>) decoderClazz.newInstance();
+ decoder.init(config);
+ decoders.add(decoder);
+ } else if (Decoder.TextStream.class.isAssignableFrom(
+ decoderClazz)) {
+ TextStream<?> decoder =
+ (TextStream<?>) decoderClazz.newInstance();
+ decoder.init(config);
+ decoders.add(decoder);
+ } else {
+ // Binary decoder - ignore is
+ }
+ }
+ } catch (IllegalAccessException | InstantiationException e) {
+ throw new IllegalArgumentException(e);
+ }
}
+
@Override
protected Object decode(String message) {
// TODO Auto-generated method stub
return null;
}
+
+
+ @Override
+ protected void onClose() {
+ for (Decoder decoder : decoders) {
+ decoder.destroy();
+ }
+ }
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java?rev=1454181&r1=1454180&r2=1454181&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java
Fri Mar 8 00:09:27 2013
@@ -24,6 +24,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.OnClose;
import javax.websocket.OnError;
@@ -118,10 +119,12 @@ public class PojoMethodMapping {
public Set<MessageHandler> getMessageHandlers(Object pojo,
- Map<String,String> pathParameters, Session session) {
+ Map<String,String> pathParameters, Session session,
+ EndpointConfig config) {
Set<MessageHandler> result = new HashSet<>();
for (MessageMethod messageMethod : onMessage) {
- result.add(messageMethod.getMessageHandler(pojo, pathParameters,
session));
+ result.add(messageMethod.getMessageHandler(pojo, pathParameters,
+ session, config));
}
return result;
}
@@ -330,7 +333,8 @@ public class PojoMethodMapping {
public MessageHandler getMessageHandler(Object pojo,
- Map<String,String> pathParameters, Session session) {
+ Map<String,String> pathParameters, Session session,
+ EndpointConfig config) {
Object[] params = new Object[m.getParameterTypes().length];
for (Map.Entry<Integer,PojoPathParam> entry :
@@ -349,13 +353,14 @@ public class PojoMethodMapping {
// Basic
if (indexString != -1) {
mh = new PojoMessageHandlerWholeText(pojo, m, session,
- params, indexString, false, indexSession);
+ config, params, indexString, false, indexSession);
} else if (indexByteArray != -1) {
mh = new PojoMessageHandlerWholeBinary(pojo, m, session,
- params, indexByteArray, true, indexSession);
+ config, params, indexByteArray, true,
indexSession);
} else if (indexByteBuffer != -1) {
mh = new PojoMessageHandlerWholeBinary(pojo, m, session,
- params, indexByteBuffer, false, indexSession);
+ config, params, indexByteBuffer, false,
+ indexSession);
} else {
mh = new PojoMessageHandlerWholePong(pojo, m, session,
params, indexPong, false, indexSession);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]