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: [email protected]
For additional commands, e-mail: [email protected]