Author: remm
Date: Wed Apr 19 07:51:10 2006
New Revision: 395258

URL: http://svn.apache.org/viewcvs?rev=395258&view=rev
Log:
- Add annotation processor to Jasper too (tags need injection too).

Added:
    
tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java   
(with props)
Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/AnnotationProcessor.java

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/AnnotationProcessor.java
URL: 
http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/AnnotationProcessor.java?rev=395258&r1=395257&r2=395258&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/AnnotationProcessor.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/AnnotationProcessor.java 
Wed Apr 19 07:51:10 2006
@@ -35,8 +35,9 @@
 /**
  * Verify the annotation and Process it.
  *
- * @author    Fabien Carrion
- * @version   $Revision: 303236 $, $Date: 2006-03-09 16:46:52 -0600 (Thu, 09 
Mar 2006) $
+ * @author Fabien Carrion
+ * @author Remy Maucherat
+ * @version $Revision: 303236 $, $Date: 2006-03-09 16:46:52 -0600 (Thu, 09 Mar 
2006) $
  */
 public class AnnotationProcessor {
     
@@ -172,8 +173,11 @@
     }
     
     
+    /**
+     * Inject resources in specified field.
+     */
     protected static void lookupFieldResource(javax.naming.Context context, 
-            Object instance, Field f, String name)
+            Object instance, Field field, String name)
         throws NamingException, IllegalAccessException {
     
         Object lookedupResource = null;
@@ -183,16 +187,19 @@
                 (name.length() > 0)) {
             lookedupResource = context.lookup(name);
         } else {
-            lookedupResource = context.lookup(instance.getClass().getName() + 
"/" + f.getName());
+            lookedupResource = context.lookup(instance.getClass().getName() + 
"/" + field.getName());
         }
         
-        accessibility = f.isAccessible();
-        f.setAccessible(true);
-        f.set(instance, lookedupResource);
-        f.setAccessible(accessibility);
+        accessibility = field.isAccessible();
+        field.setAccessible(true);
+        field.set(instance, lookedupResource);
+        field.setAccessible(accessibility);
     }
 
 
+    /**
+     * Inject resources in specified method.
+     */
     protected static void lookupMethodResource(javax.naming.Context context, 
             Object instance, Method method, String name)
         throws NamingException, IllegalAccessException, 
InvocationTargetException {

Added: 
tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java
URL: 
http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java?rev=395258&view=auto
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java 
(added)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java 
Wed Apr 19 07:51:10 2006
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jasper.runtime;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import javax.annotation.EJB;
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.naming.NamingException;
+import javax.persistence.PersistenceContext;
+import javax.persistence.PersistenceUnit;
+import javax.xml.ws.WebServiceRef;
+
+
+/**
+ * Verify the annotation and Process it.
+ *
+ * @author Fabien Carrion
+ * @author Remy Maucherat
+ * @version $Revision: 303236 $, $Date: 2006-03-09 16:46:52 -0600 (Thu, 09 Mar 
2006) $
+ */
+public class AnnotationProcessor {
+    
+
+    /**
+     * Call postConstruct method on the specified instance.
+     */
+    public static void postConstruct(Object instance)
+        throws IllegalAccessException, InvocationTargetException {
+        
+        Method[] methods = instance.getClass().getMethods();
+        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];
+            }
+        }
+
+        // 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);
+        }
+        
+    }
+    
+    
+    /**
+     * Call preDestroy method on the specified instance.
+     */
+    public static void preDestroy(Object instance)
+        throws IllegalAccessException, InvocationTargetException {
+        
+        Method[] methods = instance.getClass().getMethods();
+        Method preDestroy = null;
+        for (int i = 0; i < methods.length; i++) {
+            if (methods[i].isAnnotationPresent(PostConstruct.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];
+            }
+        }
+
+        // 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);
+        }
+        
+    }
+    
+    
+    /**
+     * Inject resources in specified instance.
+     */
+    public static void injectNamingResources(javax.naming.Context context, 
Object instance)
+        throws IllegalAccessException, InvocationTargetException, 
NamingException {
+        
+        // Initialize fields annotations
+        Field[] fields = instance.getClass().getFields();
+        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());
+            }
+            if (fields[i].isAnnotationPresent(EJB.class)) {
+                EJB annotation = (EJB) fields[i].getAnnotation(EJB.class);
+                lookupFieldResource(context, instance, fields[i], 
annotation.name());
+            }
+            if (fields[i].isAnnotationPresent(WebServiceRef.class)) {
+                WebServiceRef annotation = 
+                    (WebServiceRef) 
fields[i].getAnnotation(WebServiceRef.class);
+                lookupFieldResource(context, instance, fields[i], 
annotation.name());
+            }
+            if (fields[i].isAnnotationPresent(PersistenceContext.class)) {
+                PersistenceContext annotation = 
+                    (PersistenceContext) 
fields[i].getAnnotation(PersistenceContext.class);
+                lookupFieldResource(context, instance, fields[i], 
annotation.name());
+            }
+            if (fields[i].isAnnotationPresent(PersistenceUnit.class)) {
+                PersistenceUnit annotation = 
+                    (PersistenceUnit) 
fields[i].getAnnotation(PersistenceUnit.class);
+                lookupFieldResource(context, instance, fields[i], 
annotation.name());
+            }
+        }
+        
+        // Initialize methods annotations
+        Method[] methods = instance.getClass().getMethods();
+        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());
+            }
+            if (methods[i].isAnnotationPresent(EJB.class)) {
+                EJB annotation = (EJB) methods[i].getAnnotation(EJB.class);
+                lookupMethodResource(context, instance, methods[i], 
annotation.name());
+            }
+            if (methods[i].isAnnotationPresent(WebServiceRef.class)) {
+                WebServiceRef annotation = 
+                    (WebServiceRef) 
methods[i].getAnnotation(WebServiceRef.class);
+                lookupMethodResource(context, instance, methods[i], 
annotation.name());
+            }
+            if (methods[i].isAnnotationPresent(PersistenceContext.class)) {
+                PersistenceContext annotation = 
+                    (PersistenceContext) 
methods[i].getAnnotation(PersistenceContext.class);
+                lookupMethodResource(context, instance, methods[i], 
annotation.name());
+            }
+            if (methods[i].isAnnotationPresent(PersistenceUnit.class)) {
+                PersistenceUnit annotation = 
+                    (PersistenceUnit) 
methods[i].getAnnotation(PersistenceUnit.class);
+                lookupMethodResource(context, instance, methods[i], 
annotation.name());
+            }
+        }
+
+    }
+    
+    
+    /**
+     * Inject resources in specified field.
+     */
+    protected static void lookupFieldResource(javax.naming.Context context, 
+            Object instance, Field field, String name)
+        throws NamingException, IllegalAccessException {
+    
+        Object lookedupResource = null;
+        boolean accessibility = false;
+        
+        if ((name != null) &&
+                (name.length() > 0)) {
+            lookedupResource = context.lookup(name);
+        } else {
+            lookedupResource = context.lookup(instance.getClass().getName() + 
"/" + field.getName());
+        }
+        
+        accessibility = field.isAccessible();
+        field.setAccessible(true);
+        field.set(instance, lookedupResource);
+        field.setAccessible(accessibility);
+    }
+
+
+    /**
+     * Inject resources in specified method.
+     */
+    protected static void lookupMethodResource(javax.naming.Context context, 
+            Object instance, Method method, String name)
+        throws NamingException, IllegalAccessException, 
InvocationTargetException {
+        
+        if (!method.getName().startsWith("set") 
+                || method.getParameterTypes().length != 1
+                || !method.getReturnType().getName().equals("void")) {
+            throw new IllegalArgumentException("Invalid method resource 
injection annotation");
+        }
+        
+        Object lookedupResource = null;
+        boolean accessibility = false;
+        
+        if ((name != null) &&
+                (name.length() > 0)) {
+            lookedupResource = context.lookup(name);
+        } else {
+            lookedupResource = 
+                context.lookup(instance.getClass().getName() + "/" + 
method.getName().substring(3));
+        }
+        
+        accessibility = method.isAccessible();
+        method.setAccessible(true);
+        method.invoke(instance, lookedupResource);
+        method.setAccessible(accessibility);
+    }
+    
+
+}

Propchange: 
tomcat/tc6.0.x/trunk/java/org/apache/jasper/runtime/AnnotationProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native



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

Reply via email to