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.