[jbossweb-commits] JBossWeb SVN: r2286 - branches/7.4.x/src/main/java/org/apache/tomcat/websocket.
jbossweb-commits at lists.jboss.org
jbossweb-commits at lists.jboss.org
Mon Oct 21 06:06:15 EDT 2013
Author: remy.maucherat at jboss.com
Date: 2013-10-21 06:06:15 -0400 (Mon, 21 Oct 2013)
New Revision: 2286
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/Util.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java
Log:
Port websockets patches (array support + pass session to message handler method calls).
Modified: branches/7.4.x/src/main/java/org/apache/tomcat/websocket/Util.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/tomcat/websocket/Util.java 2013-10-18 08:30:12 UTC (rev 2285)
+++ branches/7.4.x/src/main/java/org/apache/tomcat/websocket/Util.java 2013-10-21 10:06:15 UTC (rev 2286)
@@ -20,6 +20,7 @@
import java.io.InputStream;
import java.io.Reader;
+import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -46,6 +47,7 @@
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.PongMessage;
+import javax.websocket.Session;
import org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBinary;
import org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeText;
@@ -158,22 +160,22 @@
static Class<?> getMessageType(MessageHandler listener) {
- return (Class<?>) Util.getGenericType(MessageHandler.class,
- listener.getClass());
+ return Util.getGenericType(MessageHandler.class,
+ listener.getClass()).getClazz();
}
public static Class<?> getDecoderType(Class<? extends Decoder> decoder) {
- return (Class<?>) Util.getGenericType(Decoder.class, decoder);
+ return Util.getGenericType(Decoder.class, decoder).getClazz();
}
static Class<?> getEncoderType(Class<? extends Encoder> encoder) {
- return (Class<?>) Util.getGenericType(Encoder.class, encoder);
+ return Util.getGenericType(Encoder.class, encoder).getClazz();
}
- private static <T> Object getGenericType(Class<T> type,
+ private static <T> TypeResult getGenericType(Class<T> type,
Class<? extends T> clazz) {
// Look to see if this class implements the generic MessageHandler<>
@@ -200,24 +202,52 @@
Class<? extends T> superClazz =
(Class<? extends T>) clazz.getSuperclass();
- Object result = getGenericType(type, superClazz);
- if (result instanceof Class<?>) {
+ TypeResult superClassTypeResult = getGenericType(type, superClazz);
+ int dimension = superClassTypeResult.getDimension();
+ if (superClassTypeResult.getIndex() == -1 && dimension == 0) {
// Superclass implements interface and defines explicit type for
// MessageHandler<>
- return result;
- } else if (result instanceof Integer) {
+ return superClassTypeResult;
+ }
+
+ if (superClassTypeResult.getIndex() > -1) {
// Superclass implements interface and defines unknown type for
// MessageHandler<>
// Map that unknown type to the generic types defined in this class
ParameterizedType superClassType =
(ParameterizedType) clazz.getGenericSuperclass();
- return getTypeParameter(clazz,
+ TypeResult result = getTypeParameter(clazz,
superClassType.getActualTypeArguments()[
- ((Integer) result).intValue()]);
- } else {
- // Error will be logged further up the call stack
- return null;
+ superClassTypeResult.getIndex()]);
+ result.incrementDimension(superClassTypeResult.getDimension());
+ if (result.getClazz() != null && result.getDimension() > 0) {
+ superClassTypeResult = result;
+ } else {
+ return result;
+ }
}
+
+ if (superClassTypeResult.getDimension() > 0) {
+ StringBuilder className = new StringBuilder();
+ for (int i = 0; i < dimension; i++) {
+ className.append('[');
+ }
+ className.append('L');
+ className.append(superClassTypeResult.getClazz().getCanonicalName());
+ className.append(';');
+
+ Class<?> arrayClazz;
+ try {
+ arrayClazz = Class.forName(className.toString());
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ return new TypeResult(arrayClazz, -1, 0);
+ }
+
+ // Error will be logged further up the call stack
+ return null;
}
@@ -225,16 +255,21 @@
* For a generic parameter, return either the Class used or if the type
* is unknown, the index for the type in definition of the class
*/
- private static Object getTypeParameter(Class<?> clazz, Type argType) {
+ private static TypeResult getTypeParameter(Class<?> clazz, Type argType) {
if (argType instanceof Class<?>) {
- return argType;
+ return new TypeResult((Class<?>) argType, -1, 0);
} else if (argType instanceof ParameterizedType) {
- return ((ParameterizedType) argType).getRawType();
+ return new TypeResult((Class<?>)((ParameterizedType) argType).getRawType(), -1, 0);
+ } else if (argType instanceof GenericArrayType) {
+ Type arrayElementType = ((GenericArrayType) argType).getGenericComponentType();
+ TypeResult result = getTypeParameter(clazz, arrayElementType);
+ result.incrementDimension(1);
+ return result;
} else {
TypeVariable<?>[] tvs = clazz.getTypeParameters();
for (int i = 0; i < tvs.length; i++) {
if (tvs[i].equals(argType)) {
- return Integer.valueOf(i);
+ return new TypeResult(null, i, 0);
}
}
return null;
@@ -313,7 +348,8 @@
public static Set<MessageHandlerResult> getMessageHandlers(
- MessageHandler listener, EndpointConfig endpointConfig) {
+ MessageHandler listener, EndpointConfig endpointConfig,
+ Session session) {
Class<?> target = Util.getMessageType(listener);
@@ -342,7 +378,7 @@
} else if (byte[].class.isAssignableFrom(target)) {
MessageHandlerResult result = new MessageHandlerResult(
new PojoMessageHandlerWholeBinary(listener,
- getOnMessageMethod(listener), null,
+ getOnMessageMethod(listener), session,
endpointConfig, null, new Object[1], 0, true, -1,
false, -1),
MessageHandlerResultType.BINARY);
@@ -350,7 +386,7 @@
} else if (InputStream.class.isAssignableFrom(target)) {
MessageHandlerResult result = new MessageHandlerResult(
new PojoMessageHandlerWholeBinary(listener,
- getOnMessageMethod(listener), null,
+ getOnMessageMethod(listener), session,
endpointConfig, null, new Object[1], 0, true, -1,
true, -1),
MessageHandlerResultType.BINARY);
@@ -358,7 +394,7 @@
} else if (Reader.class.isAssignableFrom(target)) {
MessageHandlerResult result = new MessageHandlerResult(
new PojoMessageHandlerWholeText(listener,
- getOnMessageMethod(listener), null,
+ getOnMessageMethod(listener), session,
endpointConfig, null, new Object[1], 0, true, -1,
-1),
MessageHandlerResultType.TEXT);
@@ -379,7 +415,7 @@
Method m = getOnMessageMethod(listener);
if (decoderMatch.getBinaryDecoders().size() > 0) {
MessageHandlerResult result = new MessageHandlerResult(
- new PojoMessageHandlerWholeBinary(listener, m, null,
+ new PojoMessageHandlerWholeBinary(listener, m, session,
endpointConfig,
decoderMatch.getBinaryDecoders(), new Object[1],
0, false, -1, false, -1),
@@ -388,7 +424,7 @@
}
if (decoderMatch.getTextDecoders().size() > 0) {
MessageHandlerResult result = new MessageHandlerResult(
- new PojoMessageHandlerWholeText(listener, m, null,
+ new PojoMessageHandlerWholeText(listener, m, session,
endpointConfig,
decoderMatch.getTextDecoders(), new Object[1],
0, false, -1, -1),
@@ -472,4 +508,33 @@
return (textDecoders.size() > 0) || (binaryDecoders.size() > 0);
}
}
+
+
+ private static class TypeResult {
+ private final Class<?> clazz;
+ private final int index;
+ private int dimension;
+
+ public TypeResult(Class<?> clazz, int index, int dimension) {
+ this.clazz= clazz;
+ this.index = index;
+ this.dimension = dimension;
+ }
+
+ public Class<?> getClazz() {
+ return clazz;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public int getDimension() {
+ return dimension;
+ }
+
+ public void incrementDimension(int inc) {
+ dimension += inc;
+ }
+ }
}
Modified: branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java 2013-10-18 08:30:12 UTC (rev 2285)
+++ branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java 2013-10-21 10:06:15 UTC (rev 2286)
@@ -174,7 +174,7 @@
// just as easily.
Set<MessageHandlerResult> mhResults =
- Util.getMessageHandlers(listener, endpointConfig);
+ Util.getMessageHandlers(listener, endpointConfig, this);
for (MessageHandlerResult mhResult : mhResults) {
switch (mhResult.getType()) {
More information about the jbossweb-commits
mailing list