You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2008/06/26 19:22:45 UTC

svn commit: r671956 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java test/java/org/apache/tapestry5/internal/services/InternalClassTransformationImplTest.java

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.