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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org