[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