Author: markt
Date: Wed Feb 20 18:22:32 2013
New Revision: 1448338

URL: http://svn.apache.org/r1448338
Log:
Complete generic type ID refactoring

Added:
    tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java
      - copied, changed from r1447682, 
tomcat/trunk/test/org/apache/tomcat/websocket/TestWsSession.java
Removed:
    tomcat/trunk/test/org/apache/tomcat/websocket/TestWsSession.java
Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/Util.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Util.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Util.java?rev=1448338&r1=1448337&r2=1448338&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/Util.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/Util.java Wed Feb 20 18:22:32 
2013
@@ -16,6 +16,9 @@
  */
 package org.apache.tomcat.websocket;
 
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 import java.util.Queue;
@@ -23,6 +26,7 @@ import java.util.concurrent.ConcurrentLi
 
 import javax.websocket.CloseReason.CloseCode;
 import javax.websocket.CloseReason.CloseCodes;
+import javax.websocket.MessageHandler;
 
 /**
  * Utility class for internal use only within the
@@ -129,4 +133,76 @@ class Util {
 
         return result;
     }
+
+
+    static Class<?> getMessageType(MessageHandler listener) {
+        return (Class<?>) Util.getGenericType(MessageHandler.class,
+                listener.getClass());
+    }
+
+
+    private static <T> Object getGenericType(Class<T> type,
+            Class<? extends T> clazz) {
+
+        // Look to see if this class implements the generic MessageHandler<>
+        // interface
+
+        // Get all the interfaces
+        Type[] interfaces = clazz.getGenericInterfaces();
+        for (Type iface : interfaces) {
+            // Only need to check interfaces that use generics
+            if (iface instanceof ParameterizedType) {
+                ParameterizedType pi = (ParameterizedType) iface;
+                // Look for the MessageHandler<> interface
+                if (pi.getRawType() instanceof Class) {
+                    if (type.isAssignableFrom((Class<?>) pi.getRawType())) {
+                        return getTypeParameter(
+                                clazz, pi.getActualTypeArguments()[0]);
+                    }
+                }
+            }
+        }
+
+        // Interface not found on this class. Look at the superclass.
+        Class<? extends T> superClazz =
+                (Class<? extends T>) clazz.getSuperclass();
+
+        Object result = getGenericType(type, superClazz);
+        if (result instanceof Class<?>) {
+            // Superclass implements interface and defines explicit type for
+            // MessageHandler<>
+            return result;
+        } else if (result instanceof Integer) {
+            // 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,
+                    superClassType.getActualTypeArguments()[
+                            ((Integer) result).intValue()]);
+        } else {
+            // Error will be logged further up the call stack
+            return null;
+        }
+    }
+
+
+    /*
+     * 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) {
+        if (argType instanceof Class<?>) {
+            return argType;
+        } else {
+            TypeVariable<?>[] tvs = clazz.getTypeParameters();
+            for (int i = 0; i < tvs.length; i++) {
+                if (tvs[i].equals(argType)) {
+                    return Integer.valueOf(i);
+                }
+            }
+            return null;
+        }
+    }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1448338&r1=1448337&r2=1448338&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Wed Feb 20 
18:22:32 2013
@@ -17,9 +17,7 @@
 package org.apache.tomcat.websocket;
 
 import java.io.IOException;
-import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
 import java.net.URI;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
@@ -120,7 +118,7 @@ public class WsSession implements Sessio
     @SuppressWarnings("unchecked")
     @Override
     public void addMessageHandler(MessageHandler listener) {
-        Type t = getMessageType(listener);
+        Type t = Util.getMessageType(listener);
 
         if (t.equals(String.class)) {
             if (textMessageHandler != null) {
@@ -406,73 +404,4 @@ public class WsSession implements Sessio
     }
 
     // Protected so unit tests can use it
-    protected static Class<?> getMessageType(MessageHandler listener) {
-        return (Class<?>) getGenericType(listener.getClass());
-    }
-
-
-    private static Object getGenericType(Class<? extends MessageHandler> 
clazz) {
-
-        // Look to see if this class implements the generic MessageHandler<>
-        // interface
-
-        // Get all the interfaces
-        Type[] interfaces = clazz.getGenericInterfaces();
-        for (Type iface : interfaces) {
-            // Only need to check interfaces that use generics
-            if (iface instanceof ParameterizedType) {
-                ParameterizedType pi = (ParameterizedType) iface;
-                // Look for the MessageHandler<> interface
-                if (pi.getRawType() instanceof Class) {
-                    if (MessageHandler.class.isAssignableFrom(
-                            (Class<?>) pi.getRawType())) {
-                        return getTypeParameter(
-                                clazz, pi.getActualTypeArguments()[0]);
-                    }
-                }
-            }
-        }
-
-        // Interface not found on this class. Look at the superclass.
-        Class<? extends MessageHandler> superClazz =
-                (Class<? extends MessageHandler>) clazz.getSuperclass();
-
-        Object result = getGenericType(superClazz);
-        if (result instanceof Class<?>) {
-            // Superclass implements interface and defines explicit type for
-            // MessageHandler<>
-            return result;
-        } else if (result instanceof Integer) {
-            // 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,
-                    superClassType.getActualTypeArguments()[
-                            ((Integer) result).intValue()]);
-        } else {
-            // Error will be logged further up the call stack
-            return null;
-        }
-    }
-
-
-    /*
-     * 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) {
-        if (argType instanceof Class<?>) {
-            return argType;
-        } else {
-            TypeVariable<?>[] tvs = clazz.getTypeParameters();
-            for (int i = 0; i < tvs.length; i++) {
-                if (tvs[i].equals(argType)) {
-                    return Integer.valueOf(i);
-                }
-            }
-            return null;
-        }
-    }
 }

Copied: tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java (from 
r1447682, tomcat/trunk/test/org/apache/tomcat/websocket/TestWsSession.java)
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java?p2=tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java&p1=tomcat/trunk/test/org/apache/tomcat/websocket/TestWsSession.java&r1=1447682&r2=1448338&rev=1448338&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestWsSession.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java Wed Feb 20 
18:22:32 2013
@@ -21,40 +21,40 @@ import javax.websocket.MessageHandler;
 import org.junit.Assert;
 import org.junit.Test;
 
-public class TestWsSession {
+public class TestUtil {
 
     @Test
     public void testGetMessageTypeSimple() {
         Assert.assertEquals(
-                String.class, WsSession.getMessageType(new Simple()));
+                String.class, Util.getMessageType(new Simple()));
     }
 
 
     @Test
     public void testGetMessageTypeSubclass() {
         Assert.assertEquals(String.class,
-                WsSession.getMessageType(new SubSimple()));
+                Util.getMessageType(new SubSimple()));
     }
 
 
     @Test
     public void testGetMessageTypeGenericSubclass() {
         Assert.assertEquals(String.class,
-                WsSession.getMessageType(new GenericSub()));
+                Util.getMessageType(new GenericSub()));
     }
 
 
     @Test
     public void testGetMessageTypeGenericMultipleSubclass() {
         Assert.assertEquals(String.class,
-                WsSession.getMessageType(new GenericMultipleSubSub()));
+                Util.getMessageType(new GenericMultipleSubSub()));
     }
 
 
     @Test
     public void testGetMessageTypeGenericMultipleSubclassSwap() {
         Assert.assertEquals(String.class,
-                WsSession.getMessageType(new GenericMultipleSubSubSwap()));
+                Util.getMessageType(new GenericMultipleSubSubSwap()));
     }
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to