Author: markt
Date: Sun Mar 24 18:34:24 2013
New Revision: 1460421

URL: http://svn.apache.org/r1460421
Log:
Better @PathParam handling
- null can be coerced to some types (e.g. boolean)
- if decoding fails, need to throw DecodeException from onMessage

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
    
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java
    
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java

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=1460421&r1=1460420&r2=1460421&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties 
Sun Mar 24 18:34:24 2013
@@ -18,6 +18,7 @@ pojoEndpointBase.onCloseFail=Failed to c
 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}]
+pojoMethodMapping.decodePathParamFail=Failed to decode path parameter value 
[{0}] to expected type [{1}]
 pojoMethodMapping.duplicateLastParam=Multiple boolean (last) parameters 
present on the method [{0}] of class [{1}] that was annotated with OnMessage
 pojoMethodMapping.duplicateMessageParam=Multiple message parameters present on 
the method [{0}] of class [{1}] that was annotated with OnMessage
 pojoMethodMapping.duplicatePongMessageParam=Multiple PongMessage parameters 
present on the method [{0}] of class [{1}] that was annotated with OnMessage
@@ -28,5 +29,4 @@ pojoMethodMapping.partialInputStream=Inv
 pojoMethodMapping.partialPong=Invalid PongMesssge and boolean parameters 
present on the method [{0}] of class [{1}] that was annotated with OnMessage
 pojoMethodMapping.partialReader=Invalid Reader and boolean parameters present 
on the method [{0}] of class [{1}] that was annotated with OnMessage
 pojoMethodMapping.pongWithPayload=Invalid PongMessgae and Message parameters 
present on the method [{0}] of class [{1}] that was annotated with OnMessage
-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/PojoMessageHandlerPartialBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java?rev=1460421&r1=1460420&r2=1460421&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java
 Sun Mar 24 18:34:24 2013
@@ -20,9 +20,12 @@ 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 org.apache.tomcat.websocket.WsSession;
+
 /**
  * Common implementation code for the POJO partial message handlers. All
  * the real work is done in this class and in the superclass.
@@ -45,6 +48,12 @@ public abstract class PojoMessageHandler
 
     @Override
     public final void onMessage(T message, boolean last) {
+        if (params != null && params.length == 1 &&
+                params[0] instanceof DecodeException) {
+            ((WsSession) session).getLocal().onError(session,
+                    (DecodeException) params[0]);
+            return;
+        }
         Object[] parameters = params.clone();
         if (indexBoolean != -1) {
             parameters[indexBoolean] = Boolean.valueOf(last);

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=1460421&r1=1460420&r2=1460421&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java
 Sun Mar 24 18:34:24 2013
@@ -22,9 +22,7 @@ import java.lang.reflect.Method;
 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;
 
 /**
@@ -36,9 +34,6 @@ import org.apache.tomcat.websocket.WsSes
 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 convert, int indexSession) {
@@ -50,14 +45,19 @@ public abstract class PojoMessageHandler
     @Override
     public final void onMessage(T message) {
 
+        if (params != null && params.length == 1 &&
+                params[0] instanceof DecodeException) {
+            ((WsSession) session).getLocal().onError(session,
+                    (DecodeException) params[0]);
+            return;
+        }
+
         // Can this message be decoded?
         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);
+            ((WsSession) session).getLocal().onError(session, de);
             return;
         }
 

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=1460421&r1=1460420&r2=1460421&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java 
Sun Mar 24 18:34:24 2013
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Set;
 
 import javax.websocket.CloseReason;
+import javax.websocket.DecodeException;
 import javax.websocket.Decoder;
 import javax.websocket.Decoder.Binary;
 import javax.websocket.Decoder.BinaryStream;
@@ -111,7 +112,7 @@ public class PojoMethodMapping {
 
 
     public Object[] getOnOpenArgs(Map<String,String> pathParameters,
-            Session session) {
+            Session session) throws DecodeException {
         return buildArgs(onOpenParams, pathParameters, session, null, null);
     }
 
@@ -122,7 +123,7 @@ public class PojoMethodMapping {
 
 
     public Object[] getOnCloseArgs(Map<String,String> pathParameters,
-            Session session, CloseReason closeReason) {
+            Session session, CloseReason closeReason) throws DecodeException {
         return buildArgs(
                 onCloseParams, pathParameters, session, null, closeReason);
     }
@@ -134,7 +135,7 @@ public class PojoMethodMapping {
 
 
     public Object[] getOnErrorArgs(Map<String,String> pathParameters,
-            Session session, Throwable throwable) {
+            Session session, Throwable throwable) throws DecodeException {
         return buildArgs(
                 onErrorParams, pathParameters, session, throwable, null);
     }
@@ -220,7 +221,8 @@ public class PojoMethodMapping {
 
     private static Object[] buildArgs(PojoPathParam[] pathParams,
             Map<String,String> pathParameters, Session session,
-            Throwable throwable, CloseReason closeReason) {
+            Throwable throwable, CloseReason closeReason)
+            throws DecodeException {
         Object[] result = new Object[pathParams.length];
         for (int i = 0; i < pathParams.length; i++) {
             Class<?> type = pathParams[i].getType();
@@ -233,10 +235,12 @@ public class PojoMethodMapping {
             } else {
                 String name = pathParams[i].getName();
                 String value = pathParameters.get(name);
-                if (value == null) {
-                    result[i] = null;
-                } else {
+                try {
                     result[i] = Util.coerceToType(type, value);
+                } catch (Exception e) {
+                    throw new DecodeException(value, sm.getString(
+                            "pojoMethodMapping.decodePathParamFail",
+                            value, type), e);
                 }
             }
         }
@@ -481,8 +485,14 @@ public class PojoMethodMapping {
                 PojoPathParam pathParam = entry.getValue();
                 String valueString = pathParameters.get(pathParam.getName());
                 Object value = null;
-                if (valueString != null) {
+                try {
                     value = Util.coerceToType(pathParam.getType(), 
valueString);
+                } catch (Exception e) {
+                    DecodeException de =  new DecodeException(valueString,
+                            sm.getString(
+                                    "pojoMethodMapping.decodePathParamFail",
+                                    valueString, pathParam.getType()), e);
+                    params = new Object[] { de };
                 }
                 params[entry.getKey().intValue()] = value;
             }



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

Reply via email to