You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2010/11/20 16:05:49 UTC

svn commit: r1037230 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java test/java/org/apache/cayenne/reflect/LifecycleCallbackRegistryTest.java

Author: aadamchik
Date: Sat Nov 20 15:05:49 2010
New Revision: 1037230

URL: http://svn.apache.org/viewvc?rev=1037230&view=rev
Log:
CAY-1509 Lifecycle event annotations support

* support for listener annotated superclass methods

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/LifecycleCallbackRegistryTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java?rev=1037230&r1=1037229&r2=1037230&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java Sat Nov 20 15:05:49 2010
@@ -169,34 +169,41 @@ public class LifecycleCallbackRegistry {
             throw new NullPointerException("Null listener");
         }
 
-        for (Method m : listener.getClass().getDeclaredMethods()) {
-
-            for (Annotation a : m.getAnnotations()) {
-                AnnotationReader reader = getAnnotationsMap().get(
-                        a.annotationType().getName());
-
-                if (reader != null) {
-
-                    Set<Class<?>> types = new HashSet<Class<?>>();
-                    for (Class<?> type : reader.entities(a)) {
-                        // TODO: ignoring entity subclasses? whenever we add those, take
-                        // into account "exlcudeSuperclassListeners" flag
-                        types.add(type);
-                    }
-
-                    for (Class<? extends Annotation> type : reader.entityAnnotations(a)) {
-                        types.addAll(getAnnotatedEntities(type));
-                    }
-
-                    for (Class<?> type : types) {
-                        eventCallbacks[reader.eventType().ordinal()].addListener(
-                                type,
-                                listener,
-                                m);
+        Class<?> listenerType = listener.getClass();
+        do {
+            for (Method m : listenerType.getDeclaredMethods()) {
+
+                for (Annotation a : m.getAnnotations()) {
+                    AnnotationReader reader = getAnnotationsMap().get(
+                            a.annotationType().getName());
+
+                    if (reader != null) {
+
+                        Set<Class<?>> types = new HashSet<Class<?>>();
+                        for (Class<?> type : reader.entities(a)) {
+                            // TODO: ignoring entity subclasses? whenever we add those,
+                            // take
+                            // into account "exlcudeSuperclassListeners" flag
+                            types.add(type);
+                        }
+
+                        for (Class<? extends Annotation> type : reader
+                                .entityAnnotations(a)) {
+                            types.addAll(getAnnotatedEntities(type));
+                        }
+
+                        for (Class<?> type : types) {
+                            eventCallbacks[reader.eventType().ordinal()].addListener(
+                                    type,
+                                    listener,
+                                    m);
+                        }
                     }
                 }
             }
-        }
+
+            listenerType = listenerType.getSuperclass();
+        } while (listenerType != null && !listenerType.equals(Object.class));
     }
 
     /**

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/LifecycleCallbackRegistryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/LifecycleCallbackRegistryTest.java?rev=1037230&r1=1037229&r2=1037230&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/LifecycleCallbackRegistryTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/LifecycleCallbackRegistryTest.java Sat Nov 20 15:05:49 2010
@@ -57,6 +57,28 @@ public class LifecycleCallbackRegistryTe
         context.newObject(Painting.class);
         assertEquals("e:Painting;", listener.getAndReset());
     }
+
+    public void testAddListener_PostAdd_InheritedListenerMethods() {
+        LifecycleCallbackRegistry registry = new LifecycleCallbackRegistry(context
+                .getEntityResolver());
+
+        context.getEntityResolver().setCallbackRegistry(registry);
+
+        PostAddListenerSubclass listener = new PostAddListenerSubclass();
+        registry.addListener(listener);
+
+        context.newObject(Gallery.class);
+        assertEquals("e:Gallery;", listener.getAndReset());
+
+        context.newObject(Artist.class);
+        assertEquals("a:Artist;", listener.getAndReset());
+
+        context.newObject(Exhibit.class);
+        assertEquals("", listener.getAndReset());
+
+        context.newObject(Painting.class);
+        assertEquals("e:Painting;", listener.getAndReset());
+    }
 }
 
 class PostAddListener {
@@ -81,3 +103,7 @@ class PostAddListener {
         return v;
     }
 }
+
+class PostAddListenerSubclass extends PostAddListener {
+
+}