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/12/08 16:36:32 UTC
svn commit: r1043456 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/reflect/ test/java/org/apache/cayenne/reflect/
test/java/org/apache/cayenne/testdo/inheritance_flat/
Author: aadamchik
Date: Wed Dec 8 15:36:32 2010
New Revision: 1043456
URL: http://svn.apache.org/viewvc?rev=1043456&view=rev
Log:
CAY-1509 Lifecycle event annotations support
No need to check Inherited annotation by hand... Java does it for us -- now REALLY fixing it
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackEventHandler.java
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
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inheritance_flat/User.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackEventHandler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackEventHandler.java?rev=1043456&r1=1043455&r2=1043456&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackEventHandler.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackEventHandler.java Wed Dec 8 15:36:32 2010
@@ -66,6 +66,14 @@ class LifecycleCallbackEventHandler {
listeners.clear();
defaultListeners.clear();
}
+
+ int defaultListenersSize() {
+ return defaultListeners.size();
+ }
+
+ int listenersSize() {
+ return listeners.size();
+ }
/**
* Registers a callback method to be invoked on a provided non-entity object when a
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=1043456&r1=1043455&r2=1043456&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 Wed Dec 8 15:36:32 2010
@@ -20,7 +20,6 @@ package org.apache.cayenne.reflect;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -219,6 +218,11 @@ public class LifecycleCallbackRegistry {
eventCallbacks[type.ordinal()].performCallbacks(objects);
}
+ // used by unit tests to poke inside the registry
+ LifecycleCallbackEventHandler getHandler(LifecycleEvent type) {
+ return eventCallbacks[type.ordinal()];
+ }
+
private Map<String, AnnotationReader> getAnnotationsMap() {
if (annotationsMap == null) {
@@ -373,12 +377,16 @@ public class LifecycleCallbackRegistry {
return annotationsMap;
}
- private Collection<Class<?>> getAnnotatedEntities(Class<? extends Annotation> type) {
+ private Collection<Class<?>> getAnnotatedEntities(
+ Class<? extends Annotation> annotationType) {
- Collection<Class<?>> entities = entitiesByAnnotation.get(type.getName());
+ Collection<Class<?>> entities = entitiesByAnnotation
+ .get(annotationType.getName());
if (entities == null) {
- entities = new ArrayList<Class<?>>();
+
+ // ensure no dupes
+ entities = new HashSet<Class<?>>();
for (ObjEntity entity : entityResolver.getObjEntities()) {
Class<?> entityType;
@@ -389,13 +397,31 @@ public class LifecycleCallbackRegistry {
throw new CayenneRuntimeException("Class not found: "
+ entity.getClassName(), e);
}
-
- if (entityType.isAnnotationPresent(type)) {
- entities.add(entityType);
+
+ // ensure that we don't register the same callback for multiple
+ // classes in the same hierarchy, so find the topmost type using a given
+ // annotation and register it once
+
+ // TODO: This ignores "excludeSuperclassListeners" setting, which is
+ // not possible with annotations anyways
+
+ while (entityType != null
+ && entityType.isAnnotationPresent(annotationType)) {
+
+ Class<?> superType = entityType.getSuperclass();
+
+ if (superType == null
+ || !superType.isAnnotationPresent(annotationType)) {
+ entities.add(entityType);
+ break;
+ }
+
+ entityType = superType;
}
+
}
- entitiesByAnnotation.put(type.getName(), entities);
+ entitiesByAnnotation.put(annotationType.getName(), entities);
}
return entities;
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=1043456&r1=1043455&r2=1043456&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 Wed Dec 8 15:36:32 2010
@@ -22,6 +22,7 @@ import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.Persistent;
import org.apache.cayenne.annotation.PostAdd;
import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.LifecycleEvent;
import org.apache.cayenne.testdo.testmap.Artist;
import org.apache.cayenne.testdo.testmap.Exhibit;
import org.apache.cayenne.testdo.testmap.Gallery;
@@ -45,6 +46,8 @@ public class LifecycleCallbackRegistryTe
PostAddListener listener = new PostAddListener();
registry.addListener(listener);
+ assertEquals(3, registry.getHandler(LifecycleEvent.POST_ADD).listenersSize());
+
context.newObject(Gallery.class);
assertEquals("e:Gallery;", listener.getAndReset());
@@ -67,6 +70,8 @@ public class LifecycleCallbackRegistryTe
PostAddListenerSubclass listener = new PostAddListenerSubclass();
registry.addListener(listener);
+ assertEquals(3, registry.getHandler(LifecycleEvent.POST_ADD).listenersSize());
+
context.newObject(Gallery.class);
assertEquals("e:Gallery;", listener.getAndReset());
@@ -79,6 +84,7 @@ public class LifecycleCallbackRegistryTe
context.newObject(Painting.class);
assertEquals("e:Painting;", listener.getAndReset());
}
+
}
class PostAddListener {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inheritance_flat/User.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inheritance_flat/User.java?rev=1043456&r1=1043455&r2=1043456&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inheritance_flat/User.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inheritance_flat/User.java Wed Dec 8 15:36:32 2010
@@ -1,7 +1,9 @@
package org.apache.cayenne.testdo.inheritance_flat;
import org.apache.cayenne.testdo.inheritance_flat.auto._User;
+import org.apache.cayenne.testdo.testmap.annotations.Tag2;
+@Tag2
public class User extends _User {
}