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 {
+
+}


Reply via email to