Author: hlship
Date: Thu Jun 26 10:22:44 2008
New Revision: 671956

URL: http://svn.apache.org/viewvc?rev=671956&view=rev
Log:
TAPESTRY-2481: ClassTransformation acts as if all type-level annotations are 
inherited; it should filter out non-inherited annotations

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/InternalClassTransformationImplTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java?rev=671956&r1=671955&r2=671956&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
 Thu Jun 26 10:22:44 2008
@@ -36,6 +36,7 @@
 import org.slf4j.Logger;
 
 import java.lang.annotation.Annotation;
+import java.lang.annotation.Inherited;
 import java.lang.reflect.Modifier;
 import java.util.*;
 
@@ -387,7 +388,7 @@
         {
             List<Annotation> result = CollectionFactory.newList();
 
-            addAnnotationsToList(result, member.getAnnotations());
+            addAnnotationsToList(result, member.getAnnotations(), false);
 
             return result;
         }
@@ -397,11 +398,24 @@
         }
     }
 
-    private void addAnnotationsToList(List<Annotation> list, Object[] 
annotations)
+    private void addAnnotationsToList(List<Annotation> list, Object[] 
annotations, boolean filterNonInherited)
     {
         for (Object o : annotations)
         {
             Annotation a = (Annotation) o;
+
+            // When assembling class annotations from a base class, you want 
to ignore any
+            // that are not @Inherited.
+
+            if (filterNonInherited)
+            {
+                Class<? extends Annotation> annotationType = 
a.annotationType();
+
+                Inherited inherited = 
annotationType.getAnnotation(Inherited.class);
+
+                if (inherited == null) continue;
+            }
+
             list.add(a);
         }
     }
@@ -1498,11 +1512,17 @@
     {
         classAnnotations = CollectionFactory.newList();
 
+        boolean filter = false;
+
         try
         {
             for (CtClass current = ctClass; current != null; current = 
current.getSuperclass())
             {
-                addAnnotationsToList(classAnnotations, 
current.getAnnotations());
+                addAnnotationsToList(classAnnotations, 
current.getAnnotations(), filter);
+
+                // Super-class annotations are filtered
+
+                filter = true;
             }
         }
         catch (NotFoundException ex)

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/InternalClassTransformationImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/InternalClassTransformationImplTest.java?rev=671956&r1=671955&r2=671956&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/InternalClassTransformationImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/InternalClassTransformationImplTest.java
 Thu Jun 26 10:22:44 2008
@@ -416,6 +416,23 @@
         verify();
     }
 
+    // TAPESTRY-2481
+    @Test
+    public void 
ensure_only_inherited_annotations_from_parent_class_are_visible() throws 
Exception
+    {
+        Logger logger = mockLogger();
+
+        replay();
+
+        ClassTransformation ct = 
createClassTransformation(ChildClassInheritsAnnotation.class, logger);
+
+        Meta meta = ct.getAnnotation(Meta.class);
+
+        assertNull(meta);
+
+        verify();
+    }
+
     /**
      * These tests are really to assert my understanding of Javassist's API. I 
guess we should keep them around to make
      * sure that future versions of Javassist work the same as our 
expectations.


Reply via email to