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]