From 324431a072344af085776aac9f24a30fe7d940b6 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Thu, 28 Jun 2012 10:53:57 -0700 Subject: [PATCH] Adding support for discovering annotations from superclass chain --- .../annotations/EventMethodsCache.java | 106 ++++++++---------- .../annotations/EventMethodsCacheTest.java | 22 ++++ .../annotations/MyEchoBinarySocket.java | 24 ++++ .../websocket/annotations/MyEchoSocket.java | 5 + 4 files changed, 99 insertions(+), 58 deletions(-) create mode 100644 jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoBinarySocket.java diff --git a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/annotations/EventMethodsCache.java b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/annotations/EventMethodsCache.java index c74011cb1d5..71a978e9d3d 100644 --- a/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/annotations/EventMethodsCache.java +++ b/jetty-websocket/websocket-core/src/main/java/org/eclipse/jetty/websocket/annotations/EventMethodsCache.java @@ -269,25 +269,6 @@ public class EventMethodsCache return methods; } - private boolean isNotPublicVoid(Method method) - { - // validate modifiers - int mods = method.getModifiers(); - if (!Modifier.isPublic(mods) || Modifier.isStatic(mods)) - { - return true; - } - - // validate return - if (!Void.TYPE.isAssignableFrom(method.getReturnType())) - { - return true; - } - - // we have a public void method - return true; - } - private boolean isSameParameters(Class[] actual, Class[] params) { if(actual.length != params.length) { @@ -320,51 +301,59 @@ public class EventMethodsCache private EventMethods scanAnnotatedMethods(Class pojo) { + Class clazz = pojo; EventMethods events = new EventMethods(pojo,true); - for (Method method : pojo.getDeclaredMethods()) + clazz = pojo; + while (clazz.getAnnotation(WebSocket.class) != null) { - if (method.getAnnotation(OnWebSocketConnect.class) != null) + for (Method method : clazz.getDeclaredMethods()) { - assertValidSignature(method,OnWebSocketConnect.class,validConnectParams); - assertUnset(events.onConnect,OnWebSocketConnect.class,method); - events.onConnect = new EventMethod(pojo,method); - continue; + if (method.getAnnotation(OnWebSocketConnect.class) != null) + { + assertValidSignature(method,OnWebSocketConnect.class,validConnectParams); + assertUnset(events.onConnect,OnWebSocketConnect.class,method); + events.onConnect = new EventMethod(pojo,method); + continue; + } + + if (method.getAnnotation(OnWebSocketBinary.class) != null) + { + assertValidSignature(method,OnWebSocketBinary.class,validBinaryParams); + assertUnset(events.onBinary,OnWebSocketBinary.class,method); + events.onBinary = new EventMethod(pojo,method); + continue; + } + + if (method.getAnnotation(OnWebSocketClose.class) != null) + { + assertValidSignature(method,OnWebSocketClose.class,validCloseParams); + assertUnset(events.onClose,OnWebSocketClose.class,method); + events.onClose = new EventMethod(pojo,method); + continue; + } + + if (method.getAnnotation(OnWebSocketText.class) != null) + { + assertValidSignature(method,OnWebSocketText.class,validTextParams); + assertUnset(events.onText,OnWebSocketText.class,method); + events.onText = new EventMethod(pojo,method); + continue; + } + + if (method.getAnnotation(OnWebSocketFrame.class) != null) + { + assertValidSignature(method,OnWebSocketFrame.class,validFrameParams); + assertFrameUnset(events,method); + events.addOnFrame(new EventMethod(pojo,method)); + continue; + } + + // Not a tagged method we are interested in, ignore } - if (method.getAnnotation(OnWebSocketBinary.class) != null) - { - assertValidSignature(method,OnWebSocketBinary.class,validBinaryParams); - assertUnset(events.onBinary,OnWebSocketBinary.class,method); - events.onBinary = new EventMethod(pojo,method); - continue; - } - - if (method.getAnnotation(OnWebSocketClose.class) != null) - { - assertValidSignature(method,OnWebSocketClose.class,validCloseParams); - assertUnset(events.onClose,OnWebSocketClose.class,method); - events.onClose = new EventMethod(pojo,method); - continue; - } - - if (method.getAnnotation(OnWebSocketText.class) != null) - { - assertValidSignature(method,OnWebSocketText.class,validTextParams); - assertUnset(events.onText,OnWebSocketText.class,method); - events.onText = new EventMethod(pojo,method); - continue; - } - - if (method.getAnnotation(OnWebSocketFrame.class) != null) - { - assertValidSignature(method,OnWebSocketFrame.class,validFrameParams); - assertFrameUnset(events,method); - events.addOnFrame(new EventMethod(pojo,method)); - continue; - } - - // Not a tagged method we are interested in, ignore + // try superclass now + clazz = clazz.getSuperclass(); } return events; @@ -373,6 +362,7 @@ public class EventMethodsCache private EventMethods scanListenerMethods(Class pojo) { EventMethods events = new EventMethods(pojo,false); + // This is a WebSocketListener object events.onConnect = new EventMethod(pojo,"onWebSocketConnect",WebSocketConnection.class); events.onClose = new EventMethod(pojo,"onWebSocketClose",Integer.TYPE,String.class); diff --git a/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/EventMethodsCacheTest.java b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/EventMethodsCacheTest.java index 7b50ce1e1bf..d1d2cd70631 100644 --- a/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/EventMethodsCacheTest.java +++ b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/EventMethodsCacheTest.java @@ -101,6 +101,28 @@ public class EventMethodsCacheTest } } + /** + * Test Case for no exceptions and 4 methods (3 methods from parent) + */ + @Test + public void testDiscoverMyEchoBinarySocket() + { + EventMethodsCache cache = new EventMethodsCache(); + EventMethods methods = cache.getMethods(MyEchoBinarySocket.class); + + String classId = MyEchoBinarySocket.class.getSimpleName(); + + Assert.assertThat("EventMethods for " + classId,methods,notNullValue()); + + assertHasEventMethod(classId + ".onBinary",methods.onBinary); + assertHasEventMethod(classId + ".onClose",methods.onClose); + assertHasEventMethod(classId + ".onConnect",methods.onConnect); + assertNoEventMethod(classId + ".onException",methods.onException); + assertHasEventMethod(classId + ".onText",methods.onText); + + Assert.assertThat(".getOnFrames()",methods.getOnFrames().size(),is(0)); + } + /** * Test Case for no exceptions and 3 methods */ diff --git a/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoBinarySocket.java b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoBinarySocket.java new file mode 100644 index 00000000000..af736ebdb0a --- /dev/null +++ b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoBinarySocket.java @@ -0,0 +1,24 @@ +package org.eclipse.jetty.websocket.annotations; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Test of constructing a new WebSocket based on a base class + */ +@WebSocket +public class MyEchoBinarySocket extends MyEchoSocket +{ + @OnWebSocketBinary + public void echoBin(ByteBuffer payload) + { + try + { + getConnection().write(payload); + } + catch (IOException e) + { + e.printStackTrace(); + } + } +} diff --git a/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoSocket.java b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoSocket.java index 5f738d6733f..6b70c6b90a8 100644 --- a/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoSocket.java +++ b/jetty-websocket/websocket-core/src/test/java/org/eclipse/jetty/websocket/annotations/MyEchoSocket.java @@ -14,6 +14,11 @@ public class MyEchoSocket { private WebSocketConnection conn; + public WebSocketConnection getConnection() + { + return conn; + } + @OnWebSocketClose public void onClose(int statusCode, String reason) {