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