Author: markt
Date: Fri Mar  8 14:24:19 2013
New Revision: 1454400

URL: http://svn.apache.org/r1454400
Log:
More plumbing for Decoders. Still more work to do to get this working end to 
end.

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
    
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/PojoMessageHandlerWholeText.java
    tomcat/trunk/res/checkstyle/org-import-control.xml

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=1454400&r1=1454399&r2=1454400&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Fri Mar  8 
14:24:19 2013
@@ -386,6 +386,11 @@ public class WsSession implements Sessio
     }
 
 
+    public Endpoint getLocal() {
+        return localEndpoint;
+    }
+
+
     protected MessageHandler getTextMessageHandler() {
         return textMessageHandler;
     }

Modified: 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties?rev=1454400&r1=1454399&r2=1454400&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties 
Fri Mar  8 14:24:19 2013
@@ -16,4 +16,6 @@
 pojoEndpointBase.onCloseFail=Failed to call onClose method of POJO end point 
for POJO of type [{0}]
 pojoEndpointBase.onErrorFail=Failed to call onError method of POJO end point 
for POJO of type [{0}]
 pojoEndpointBase.onOpenFail=Failed to call onOpen method of POJO end point for 
POJO of type [{0}]
-pojoEndpointServer.getPojoInstanceFail=Failed to create instance of POJO of 
type [{0}]
\ No newline at end of file
+pojoEndpointServer.getPojoInstanceFail=Failed to create instance of POJO of 
type [{0}]
+pojoMessageHandlerWhole.decodeFail=Failed to decode received message with 
first matching Decoder instance
+pojoMessageHandlerWhole.decodeIoFail=IO error while decoding message
\ No newline at end of file

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=1454400&r1=1454399&r2=1454400&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 14:24:19 2013
@@ -20,8 +20,13 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 
+import javax.websocket.DecodeException;
 import javax.websocket.MessageHandler;
 import javax.websocket.Session;
+import javax.websocket.SessionException;
+
+import org.apache.tomcat.util.res.StringManager;
+import org.apache.tomcat.websocket.WsSession;
 
 /**
  * Common implementation code for the POJO whole message handlers. All the real
@@ -32,6 +37,9 @@ import javax.websocket.Session;
 public abstract class PojoMessageHandlerWholeBase<T>
         extends PojoMessageHandlerBase<T> implements MessageHandler.Whole<T> {
 
+    private static final StringManager sm =
+            StringManager.getManager(Constants.PACKAGE_NAME);
+
     public PojoMessageHandlerWholeBase(Object pojo, Method method,
             Session session, Object[] params, int indexPayload,
             boolean unwrap, int indexSession) {
@@ -44,7 +52,15 @@ public abstract class PojoMessageHandler
     public final void onMessage(T message) {
 
         // Can this message be decoded?
-        Object payload = decode(message);
+        Object payload;
+        try {
+            payload = decode(message);
+        } catch (DecodeException de) {
+            SessionException se = new SessionException(sm.getString(
+                    "pojoMessageHandlerWhole.decodeFail"), de, session);
+            ((WsSession) session).getLocal().onError(session, se);
+            return;
+        }
 
         if (payload == null) {
             // Not decoded. Unwrap if required. Unwrap only ever applies to
@@ -75,6 +91,6 @@ public abstract class PojoMessageHandler
     }
 
 
-    protected abstract Object decode(T message);
+    protected abstract Object decode(T message) throws DecodeException;
     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=1454400&r1=1454399&r2=1454400&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 14:24:19 2013
@@ -16,23 +16,31 @@
  */
 package org.apache.tomcat.websocket.pojo;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.websocket.DecodeException;
 import javax.websocket.Decoder;
 import javax.websocket.Decoder.Binary;
 import javax.websocket.Decoder.BinaryStream;
 import javax.websocket.EndpointConfig;
 import javax.websocket.Session;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * ByteBuffer specific concrete whole message implementation.
  */
 public class PojoMessageHandlerWholeBinary
         extends PojoMessageHandlerWholeBase<ByteBuffer> {
 
+    private static final StringManager sm =
+            StringManager.getManager(Constants.PACKAGE_NAME);
+
     private final List<Decoder> decoders = new ArrayList<>();
 
     public PojoMessageHandlerWholeBinary(Object pojo, Method method,
@@ -52,7 +60,7 @@ public class PojoMessageHandlerWholeBina
                     decoder.init(config);
                     decoders.add(decoder);
                 } else {
-                    // Text decoder - ignore is
+                    // Text decoder - ignore it
                 }
             }
         } catch (IllegalAccessException | InstantiationException e) {
@@ -62,8 +70,24 @@ public class PojoMessageHandlerWholeBina
 
 
     @Override
-    protected Object decode(ByteBuffer message) {
-        // TODO Not implemented
+    protected Object decode(ByteBuffer message) throws DecodeException {
+        for (Decoder decoder : decoders) {
+            if (decoder instanceof Binary) {
+                if (((Binary<?>) decoder).willDecode(message)) {
+                    return ((Binary<?>) decoder).decode(message);
+                }
+            } else {
+                byte[] array = new byte[message.limit() - message.position()];
+                message.get(array);
+                ByteArrayInputStream bais = new ByteArrayInputStream(array);
+                try {
+                    return ((BinaryStream<?>) decoder).decode(bais);
+                } catch (IOException ioe) {
+                    throw new DecodeException(message, sm.getString(
+                            "pojoMessageHandlerWhole.decodeIoFail"), ioe);
+                }
+            }
+        }
         return null;
     }
 

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=1454400&r1=1454399&r2=1454400&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 14:24:19 2013
@@ -16,22 +16,30 @@
  */
 package org.apache.tomcat.websocket.pojo;
 
+import java.io.IOException;
+import java.io.StringReader;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.websocket.DecodeException;
 import javax.websocket.Decoder;
 import javax.websocket.Decoder.Text;
 import javax.websocket.Decoder.TextStream;
 import javax.websocket.EndpointConfig;
 import javax.websocket.Session;
 
+import org.apache.tomcat.util.res.StringManager;
+
 /**
  * Text specific concrete whole message implementation.
  */
 public class PojoMessageHandlerWholeText
         extends PojoMessageHandlerWholeBase<String> {
 
+    private static final StringManager sm =
+            StringManager.getManager(Constants.PACKAGE_NAME);
+
     private final List<Decoder> decoders = new ArrayList<>();
 
     public PojoMessageHandlerWholeText(Object pojo, Method method,
@@ -52,7 +60,7 @@ public class PojoMessageHandlerWholeText
                     decoder.init(config);
                     decoders.add(decoder);
                 } else {
-                    // Binary decoder - ignore is
+                    // Binary decoder - ignore it
                 }
             }
         } catch (IllegalAccessException | InstantiationException e) {
@@ -62,8 +70,22 @@ public class PojoMessageHandlerWholeText
 
 
     @Override
-    protected Object decode(String message) {
-        // TODO Auto-generated method stub
+    protected Object decode(String message) throws DecodeException {
+        for (Decoder decoder : decoders) {
+            if (decoder instanceof Text) {
+                if (((Text<?>) decoder).willDecode(message)) {
+                    return ((Text<?>) decoder).decode(message);
+                }
+            } else {
+                StringReader r = new StringReader(message);
+                try {
+                    return ((TextStream<?>) decoder).decode(r);
+                } catch (IOException ioe) {
+                    throw new DecodeException(message, sm.getString(
+                            "pojoMessageHandlerWhole.decodeIoFail"), ioe);
+                }
+            }
+        }
         return null;
     }
 

Modified: tomcat/trunk/res/checkstyle/org-import-control.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/res/checkstyle/org-import-control.xml?rev=1454400&r1=1454399&r2=1454400&view=diff
==============================================================================
--- tomcat/trunk/res/checkstyle/org-import-control.xml (original)
+++ tomcat/trunk/res/checkstyle/org-import-control.xml Fri Mar  8 14:24:19 2013
@@ -148,6 +148,9 @@
       <!-- Ideally want to remove this -->
       <allow pkg="org.apache.tomcat.websocket.pojo"/>
       <disallow pkg="javax.servlet"/>
+      <subpackage name="pojo">
+        <allow pkg="org.apache.tomcat.websocket"/>
+      </subpackage>
       <subpackage name="server">
         <allow pkg="javax.servlet"/>
         <allow pkg="org.apache.tomcat.websocket"/>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to