Author: markt
Date: Mon Oct 27 06:24:06 2008
New Revision: 708168

URL: http://svn.apache.org/viewvc?rev=708168&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45285
Correctly handle annotations in parent classes
Based on a patch by Florent BENOIT

Modified:
    tomcat/tc6.0.x/trunk/STATUS.txt
    
tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/DefaultAnnotationProcessor.java
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=708168&r1=708167&r2=708168&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Mon Oct 27 06:24:06 2008
@@ -196,13 +196,6 @@
             really old to me, so where would this come from ?)
   -1: 
 
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45285
-  Correctly handle annotations in parent classes
-  http://people.apache.org/~markt/patches/2008-10-20-bug45285-v2.patch
-  Based on a patch by Florent BENOIT
-  +1: markt, remm, fhanik
-  -1: 
-
 * Fix classcast exception upon shutdown(edgecase)
   http://svn.apache.org/viewvc?rev=706433&view=rev 
   +1: fhanik

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/DefaultAnnotationProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/DefaultAnnotationProcessor.java?rev=708168&r1=708167&r2=708168&view=diff
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/DefaultAnnotationProcessor.java
 (original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/DefaultAnnotationProcessor.java
 Mon Oct 27 06:24:06 2008
@@ -56,30 +56,35 @@
     public void postConstruct(Object instance)
         throws IllegalAccessException, InvocationTargetException {
         
-        Method[] methods = instance.getClass().getDeclaredMethods();
-        Method postConstruct = null;
-        for (int i = 0; i < methods.length; i++) {
-            if (methods[i].isAnnotationPresent(PostConstruct.class)) {
-                if ((postConstruct != null) 
-                        || (methods[i].getParameterTypes().length != 0)
-                        || (Modifier.isStatic(methods[i].getModifiers())) 
-                        || (methods[i].getExceptionTypes().length > 0)
-                        || 
(!methods[i].getReturnType().getName().equals("void"))) {
-                    throw new IllegalArgumentException("Invalid PostConstruct 
annotation");
+        Class<?> clazz = instance.getClass();
+        
+        while (clazz != null) {
+            Method[] methods = clazz.getDeclaredMethods();
+            Method postConstruct = null;
+            for (int i = 0; i < methods.length; i++) {
+                if (methods[i].isAnnotationPresent(PostConstruct.class)) {
+                    if ((postConstruct != null) 
+                            || (methods[i].getParameterTypes().length != 0)
+                            || (Modifier.isStatic(methods[i].getModifiers())) 
+                            || (methods[i].getExceptionTypes().length > 0)
+                            || 
(!methods[i].getReturnType().getName().equals("void"))) {
+                        throw new IllegalArgumentException("Invalid 
PostConstruct annotation");
+                    }
+                    postConstruct = methods[i];
                 }
-                postConstruct = methods[i];
             }
-        }
-
-        // At the end the postconstruct annotated 
-        // method is invoked
-        if (postConstruct != null) {
-            boolean accessibility = postConstruct.isAccessible();
-            postConstruct.setAccessible(true);
-            postConstruct.invoke(instance);
-            postConstruct.setAccessible(accessibility);
-        }
+    
+            // At the end the postconstruct annotated 
+            // method is invoked
+            if (postConstruct != null) {
+                boolean accessibility = postConstruct.isAccessible();
+                postConstruct.setAccessible(true);
+                postConstruct.invoke(instance);
+                postConstruct.setAccessible(accessibility);
+            }
         
+            clazz = clazz.getSuperclass();
+        }
     }
     
     
@@ -89,30 +94,35 @@
     public void preDestroy(Object instance)
         throws IllegalAccessException, InvocationTargetException {
         
-        Method[] methods = instance.getClass().getDeclaredMethods();
-        Method preDestroy = null;
-        for (int i = 0; i < methods.length; i++) {
-            if (methods[i].isAnnotationPresent(PreDestroy.class)) {
-                if ((preDestroy != null) 
-                        || (methods[i].getParameterTypes().length != 0)
-                        || (Modifier.isStatic(methods[i].getModifiers())) 
-                        || (methods[i].getExceptionTypes().length > 0)
-                        || 
(!methods[i].getReturnType().getName().equals("void"))) {
-                    throw new IllegalArgumentException("Invalid PreDestroy 
annotation");
+        Class<?> clazz = instance.getClass();
+        
+        while (clazz != null) {
+            Method[] methods = clazz.getDeclaredMethods();
+            Method preDestroy = null;
+            for (int i = 0; i < methods.length; i++) {
+                if (methods[i].isAnnotationPresent(PreDestroy.class)) {
+                    if ((preDestroy != null) 
+                            || (methods[i].getParameterTypes().length != 0)
+                            || (Modifier.isStatic(methods[i].getModifiers())) 
+                            || (methods[i].getExceptionTypes().length > 0)
+                            || 
(!methods[i].getReturnType().getName().equals("void"))) {
+                        throw new IllegalArgumentException("Invalid PreDestroy 
annotation");
+                    }
+                    preDestroy = methods[i];
                 }
-                preDestroy = methods[i];
             }
-        }
+    
+            // At the end the postconstruct annotated 
+            // method is invoked
+            if (preDestroy != null) {
+                boolean accessibility = preDestroy.isAccessible();
+                preDestroy.setAccessible(true);
+                preDestroy.invoke(instance);
+                preDestroy.setAccessible(accessibility);
+            }
 
-        // At the end the postconstruct annotated 
-        // method is invoked
-        if (preDestroy != null) {
-            boolean accessibility = preDestroy.isAccessible();
-            preDestroy.setAccessible(true);
-            preDestroy.invoke(instance);
-            preDestroy.setAccessible(accessibility);
+            clazz = clazz.getSuperclass();
         }
-        
     }
     
     
@@ -131,58 +141,69 @@
         
         while (clazz != null) {
             // Initialize fields annotations
-            Field[] fields = instance.getClass().getDeclaredFields();
+            Field[] fields = clazz.getDeclaredFields();
             for (int i = 0; i < fields.length; i++) {
                 if (fields[i].isAnnotationPresent(Resource.class)) {
-                    Resource annotation = (Resource) 
fields[i].getAnnotation(Resource.class);
-                    lookupFieldResource(context, instance, fields[i], 
annotation.name());
+                    Resource annotation =
+                        fields[i].getAnnotation(Resource.class);
+                    lookupFieldResource(context, instance, fields[i],
+                            annotation.name(), clazz);
                 }
                 if (fields[i].isAnnotationPresent(EJB.class)) {
-                    EJB annotation = (EJB) fields[i].getAnnotation(EJB.class);
-                    lookupFieldResource(context, instance, fields[i], 
annotation.name());
+                    EJB annotation = fields[i].getAnnotation(EJB.class);
+                    lookupFieldResource(context, instance, fields[i],
+                            annotation.name(), clazz);
                 }
                 if (fields[i].isAnnotationPresent(WebServiceRef.class)) {
-                    WebServiceRef annotation = 
-                        (WebServiceRef) 
fields[i].getAnnotation(WebServiceRef.class);
-                    lookupFieldResource(context, instance, fields[i], 
annotation.name());
+                    WebServiceRef annotation =
+                        fields[i].getAnnotation(WebServiceRef.class);
+                    lookupFieldResource(context, instance, fields[i],
+                            annotation.name(), clazz);
                 }
                 if (fields[i].isAnnotationPresent(PersistenceContext.class)) {
                     PersistenceContext annotation = 
-                        (PersistenceContext) 
fields[i].getAnnotation(PersistenceContext.class);
-                    lookupFieldResource(context, instance, fields[i], 
annotation.name());
+                        fields[i].getAnnotation(PersistenceContext.class);
+                    lookupFieldResource(context, instance, fields[i],
+                            annotation.name(), clazz);
                 }
                 if (fields[i].isAnnotationPresent(PersistenceUnit.class)) {
                     PersistenceUnit annotation = 
-                        (PersistenceUnit) 
fields[i].getAnnotation(PersistenceUnit.class);
-                    lookupFieldResource(context, instance, fields[i], 
annotation.name());
+                        fields[i].getAnnotation(PersistenceUnit.class);
+                    lookupFieldResource(context, instance, fields[i],
+                            annotation.name(), clazz);
                 }
             }
             
             // Initialize methods annotations
-            Method[] methods = instance.getClass().getDeclaredMethods();
+            Method[] methods = clazz.getDeclaredMethods();
             for (int i = 0; i < methods.length; i++) {
                 if (methods[i].isAnnotationPresent(Resource.class)) {
-                    Resource annotation = (Resource) 
methods[i].getAnnotation(Resource.class);
-                    lookupMethodResource(context, instance, methods[i], 
annotation.name());
+                    Resource annotation = 
methods[i].getAnnotation(Resource.class);
+                    lookupMethodResource(context, instance, methods[i],
+                            annotation.name(), clazz);
                 }
                 if (methods[i].isAnnotationPresent(EJB.class)) {
-                    EJB annotation = (EJB) methods[i].getAnnotation(EJB.class);
-                    lookupMethodResource(context, instance, methods[i], 
annotation.name());
+                    EJB annotation = methods[i].getAnnotation(EJB.class);
+                    lookupMethodResource(context, instance, methods[i],
+                            annotation.name(), clazz);
                 }
                 if (methods[i].isAnnotationPresent(WebServiceRef.class)) {
                     WebServiceRef annotation = 
-                        (WebServiceRef) 
methods[i].getAnnotation(WebServiceRef.class);
-                    lookupMethodResource(context, instance, methods[i], 
annotation.name());
+                        methods[i].getAnnotation(WebServiceRef.class);
+                    lookupMethodResource(context, instance, methods[i],
+                            annotation.name(), clazz);
                 }
                 if (methods[i].isAnnotationPresent(PersistenceContext.class)) {
                     PersistenceContext annotation = 
-                        (PersistenceContext) 
methods[i].getAnnotation(PersistenceContext.class);
-                    lookupMethodResource(context, instance, methods[i], 
annotation.name());
+                        methods[i].getAnnotation(PersistenceContext.class);
+                    lookupMethodResource(context, instance, methods[i],
+                            annotation.name(), clazz);
                 }
                 if (methods[i].isAnnotationPresent(PersistenceUnit.class)) {
                     PersistenceUnit annotation = 
-                        (PersistenceUnit) 
methods[i].getAnnotation(PersistenceUnit.class);
-                    lookupMethodResource(context, instance, methods[i], 
annotation.name());
+                        methods[i].getAnnotation(PersistenceUnit.class);
+                    lookupMethodResource(context, instance, methods[i],
+                            annotation.name(), clazz);
                 }
             }
             
@@ -195,7 +216,7 @@
      * Inject resources in specified field.
      */
     protected static void lookupFieldResource(javax.naming.Context context, 
-            Object instance, Field field, String name)
+            Object instance, Field field, String name, Class<?> clazz)
         throws NamingException, IllegalAccessException {
     
         Object lookedupResource = null;
@@ -205,7 +226,8 @@
                 (name.length() > 0)) {
             lookedupResource = context.lookup(name);
         } else {
-            lookedupResource = context.lookup(instance.getClass().getName() + 
"/" + field.getName());
+            lookedupResource = context.lookup(
+                    clazz.getName() + "/" + field.getName());
         }
         
         accessibility = field.isAccessible();
@@ -219,7 +241,7 @@
      * Inject resources in specified method.
      */
     protected static void lookupMethodResource(javax.naming.Context context, 
-            Object instance, Method method, String name)
+            Object instance, Method method, String name, Class<?> clazz)
         throws NamingException, IllegalAccessException, 
InvocationTargetException {
         
         if (!method.getName().startsWith("set") 
@@ -235,8 +257,8 @@
                 (name.length() > 0)) {
             lookedupResource = context.lookup(name);
         } else {
-            lookedupResource = 
-                context.lookup(instance.getClass().getName() + "/" + 
method.getName().substring(3));
+            lookedupResource = context.lookup(
+                    clazz.getName() + "/" + method.getName().substring(3));
         }
         
         accessibility = method.isAccessible();

Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=708168&r1=708167&r2=708168&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Mon Oct 27 06:24:06 2008
@@ -98,6 +98,10 @@
         on a patch by Per Landberg. (markt)
       </fix>
       <fix>
+        <bug>45825</bug>: Correctly handle annotations in parent classes. Based
+        on a patch by Florent Benoit. (markt)
+      </fix>
+      <fix>
         <bug>45906</bug>: Further ETag handling improvements. Patch provided by
         Chris Hubick. (markt)
       </fix>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to