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