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