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

Reply via email to