You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dw...@apache.org on 2008/08/18 18:54:02 UTC

svn commit: r686819 [2/3] - in /geronimo/server/branches/2.1: ./ plugins/activemq/activemq-portlets/src/main/webapp/WEB-INF/view/jmsmanager/server/ plugins/activemq/activemq-portlets/src/main/webapp/WEB-INF/view/jmsmanager/server/connector/ plugins/act...

Added: geronimo/server/branches/2.1/repository/org/apache/tomcat/TOMCAT_6_0_18-G678601.patch
URL: http://svn.apache.org/viewvc/geronimo/server/branches/2.1/repository/org/apache/tomcat/TOMCAT_6_0_18-G678601.patch?rev=686819&view=auto
==============================================================================
--- geronimo/server/branches/2.1/repository/org/apache/tomcat/TOMCAT_6_0_18-G678601.patch (added)
+++ geronimo/server/branches/2.1/repository/org/apache/tomcat/TOMCAT_6_0_18-G678601.patch Mon Aug 18 09:53:56 2008
@@ -0,0 +1,3066 @@
+Index: java/org/apache/catalina/core/DefaultInstanceManager.java
+===================================================================
+--- java/org/apache/catalina/core/DefaultInstanceManager.java	(revision 3176)
++++ java/org/apache/catalina/core/DefaultInstanceManager.java	(working copy)
+@@ -245,64 +245,70 @@
+             return;
+         }
+ 
+-        // Initialize fields annotations
+-        Field[] fields = instance.getClass().getDeclaredFields();
+-        for (Field field : fields) {
+-            if (injections != null && injections.containsKey(field.getName())) {
+-                lookupFieldResource(context, instance, field, injections.get(field.getName()));
+-            } else if (field.isAnnotationPresent(Resource.class)) {
+-                Resource annotation = field.getAnnotation(Resource.class);
+-                lookupFieldResource(context, instance, field, annotation.name());
+-            } else if (field.isAnnotationPresent(EJB.class)) {
+-                EJB annotation = field.getAnnotation(EJB.class);
+-                lookupFieldResource(context, instance, field, annotation.name());
+-            } else if (field.isAnnotationPresent(WebServiceRef.class)) {
+-                WebServiceRef annotation =
++        Class<?> clazz = instance.getClass();
++
++        while (clazz != null) {
++            // Initialize fields annotations
++            Field[] fields = instance.getClass().getDeclaredFields();
++            for (Field field : fields) {
++                if (injections != null && injections.containsKey(field.getName())) {
++                    lookupFieldResource(context, instance, field, injections.get(field.getName()));
++                }
++                if (field.isAnnotationPresent(Resource.class)) {
++                    Resource annotation = field.getAnnotation(Resource.class);
++                    lookupFieldResource(context, instance, field, annotation.name());
++                } else if (field.isAnnotationPresent(EJB.class)) {
++                    EJB annotation = field.getAnnotation(EJB.class);
++                    lookupFieldResource(context, instance, field, annotation.name());
++                } else if (field.isAnnotationPresent(WebServiceRef.class)) {
++                    WebServiceRef annotation =
+                         field.getAnnotation(WebServiceRef.class);
+-                lookupFieldResource(context, instance, field, annotation.name());
+-            } else if (field.isAnnotationPresent(PersistenceContext.class)) {
+-                PersistenceContext annotation =
++                    lookupFieldResource(context, instance, field, annotation.name());
++                } else if (field.isAnnotationPresent(PersistenceContext.class)) {
++                    PersistenceContext annotation =
+                         field.getAnnotation(PersistenceContext.class);
+-                lookupFieldResource(context, instance, field, annotation.name());
+-            } else if (field.isAnnotationPresent(PersistenceUnit.class)) {
+-                PersistenceUnit annotation =
++                    lookupFieldResource(context, instance, field, annotation.name());
++                } else if (field.isAnnotationPresent(PersistenceUnit.class)) {
++                    PersistenceUnit annotation =
+                         field.getAnnotation(PersistenceUnit.class);
+-                lookupFieldResource(context, instance, field, annotation.name());
++                    lookupFieldResource(context, instance, field, annotation.name());
++                }
+             }
+-        }
+ 
+-        // Initialize methods annotations
+-        Method[] methods = instance.getClass().getDeclaredMethods();
+-        for (Method method : methods) {
+-            String methodName = method.getName();
+-            if (injections != null && methodName.startsWith("set") && methodName.length() > 3) {
+-                String fieldName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
+-                if (injections.containsKey(fieldName)) {
+-                    lookupMethodResource(context, instance, method, injections.get(fieldName));
+-                    break;
++            // Initialize methods annotations
++            Method[] methods = instance.getClass().getDeclaredMethods();
++            for (Method method : methods) {
++                String methodName = method.getName();
++                if (injections != null && methodName.startsWith("set") && methodName.length() > 3) {
++                    String fieldName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
++                    if (injections.containsKey(fieldName)) {
++                        lookupMethodResource(context, instance, method, injections.get(fieldName));
++                        break;
++                    }
+                 }
+-            }
+-            if (method.isAnnotationPresent(Resource.class)) {
+-                Resource annotation = method.getAnnotation(Resource.class);
+-                lookupMethodResource(context, instance, method, annotation.name());
+-            } else if (method.isAnnotationPresent(EJB.class)) {
+-                EJB annotation = method.getAnnotation(EJB.class);
+-                lookupMethodResource(context, instance, method, annotation.name());
+-            } else if (method.isAnnotationPresent(WebServiceRef.class)) {
+-                WebServiceRef annotation =
++                if (method.isAnnotationPresent(Resource.class)) {
++                    Resource annotation = method.getAnnotation(Resource.class);
++                    lookupMethodResource(context, instance, method, annotation.name());
++                } else if (method.isAnnotationPresent(EJB.class)) {
++                    EJB annotation = method.getAnnotation(EJB.class);
++                    lookupMethodResource(context, instance, method, annotation.name());
++                } else if (method.isAnnotationPresent(WebServiceRef.class)) {
++                    WebServiceRef annotation =
+                         method.getAnnotation(WebServiceRef.class);
+-                lookupMethodResource(context, instance, method, annotation.name());
+-            } else if (method.isAnnotationPresent(PersistenceContext.class)) {
+-                PersistenceContext annotation =
++                    lookupMethodResource(context, instance, method, annotation.name());
++                } else if (method.isAnnotationPresent(PersistenceContext.class)) {
++                    PersistenceContext annotation =
+                         method.getAnnotation(PersistenceContext.class);
+-                lookupMethodResource(context, instance, method, annotation.name());
+-            } else if (method.isAnnotationPresent(PersistenceUnit.class)) {
+-                PersistenceUnit annotation =
++                    lookupMethodResource(context, instance, method, annotation.name());
++                } else if (method.isAnnotationPresent(PersistenceUnit.class)) {
++                    PersistenceUnit annotation =
+                         method.getAnnotation(PersistenceUnit.class);
+-                lookupMethodResource(context, instance, method, annotation.name());
++                    lookupMethodResource(context, instance, method, annotation.name());
++                }
+             }
++
++            clazz = clazz.getSuperclass();
+         }
+-
+     }
+ 
+ 
+Index: TOMCAT_6_0_18-G678601.patch
+===================================================================
+--- TOMCAT_6_0_18-G678601.patch	(revision 3176)
++++ TOMCAT_6_0_18-G678601.patch	(working copy)
+@@ -1,2834 +1,122 @@
+-Index: java/org/apache/InstanceManager.java
++Index: java/org/apache/catalina/core/DefaultInstanceManager.java
+ ===================================================================
+---- java/org/apache/InstanceManager.java	(revision 0)
+-+++ java/org/apache/InstanceManager.java	(revision 0)
+-@@ -0,0 +1,45 @@
+-+/*
+-+ * Licensed to the Apache Software Foundation (ASF) under one
+-+ * or more contributor license agreements.  See the NOTICE file
+-+ * distributed with this work for additional information
+-+ * regarding copyright ownership.  The ASF licenses this file
+-+ * to you 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;
+-+
+-+import java.lang.reflect.InvocationTargetException;
+-+
+-+import javax.naming.NamingException;
+-+
+-+/**
+-+ * @version $Rev:$ $Date:$
+-+ */
+-+public interface InstanceManager {
+-+
+-+    public Object newInstance(String className)
+-+    	throws IllegalAccessException, InvocationTargetException, NamingException, 
+-+    		InstantiationException, ClassNotFoundException;
+-+
+-+    public Object newInstance(String fqcn, ClassLoader classLoader) 
+-+    	throws IllegalAccessException, InvocationTargetException, NamingException, 
+-+    		InstantiationException, ClassNotFoundException;
+-+
+-+    public void newInstance(Object o) 
+-+		throws IllegalAccessException, InvocationTargetException, NamingException;
+-+
+-+    public void destroyInstance(Object o)
+-+    	throws IllegalAccessException, InvocationTargetException;
+-+}
+-
+-Property changes on: java/org/apache/InstanceManager.java
+-___________________________________________________________________
+-Name: svn:eol-style
+-   + native
+-
+-Index: java/org/apache/jasper/JspCompilationContext.java
+-===================================================================
+---- java/org/apache/jasper/JspCompilationContext.java	(revision 3168)
+-+++ java/org/apache/jasper/JspCompilationContext.java	(working copy)
+-@@ -609,12 +609,7 @@
+-         try {
+-             getJspLoader();
+-             
+--            String name;
+--            if (isTagFile()) {
+--                name = tagInfo.getTagClassName();
+--            } else {
+--                name = getServletPackageName() + "." + getServletClassName();
+--            }
+-+            String name = getFQCN();
+-             servletClass = jspLoader.loadClass(name);
+-         } catch (ClassNotFoundException cex) {
+-             throw new JasperException(Localizer.getMessage("jsp.error.unable.load"),
+-@@ -627,6 +622,16 @@
+-         return servletClass;
+-     }
+- 
+-+    public String getFQCN() {
+-+        String name;
+-+        if (isTagFile()) {
+-+            name = tagInfo.getTagClassName();
+-+        } else {
+-+            name = getServletPackageName() + "." + getServletClassName();
+-+        }
+-+        return name;
+-+    }
+-+
+-     // ==================== protected methods ==================== 
+- 
+-     static Object outputDirLock = new Object();
+-Index: java/org/apache/jasper/runtime/TagHandlerPool.java
+-===================================================================
+---- java/org/apache/jasper/runtime/TagHandlerPool.java	(revision 3168)
+-+++ java/org/apache/jasper/runtime/TagHandlerPool.java	(working copy)
+-@@ -21,7 +21,7 @@
+- import javax.servlet.jsp.JspException;
+- import javax.servlet.jsp.tagext.Tag;
+- 
+--import org.apache.AnnotationProcessor;
+-+import org.apache.InstanceManager;
+- import org.apache.jasper.Constants;
+- import org.apache.juli.logging.Log;
+- import org.apache.juli.logging.LogFactory;
+-@@ -42,7 +42,7 @@
+-     
+-     // index of next available tag handler
+-     private int current;
+--    protected AnnotationProcessor annotationProcessor = null;
+-+    protected InstanceManager instanceManager = null;
+- 
+-     public static TagHandlerPool getTagHandlerPool( ServletConfig config) {
+-         TagHandlerPool result=null;
+-@@ -78,8 +78,7 @@
++--- java/org/apache/catalina/core/DefaultInstanceManager.java	(revision 3176)
+++++ java/org/apache/catalina/core/DefaultInstanceManager.java	(working copy)
++@@ -245,64 +245,70 @@
++             return;
+          }
+-         this.handlers = new Tag[maxSize];
+-         this.current = -1;
+--        this.annotationProcessor = 
+--            (AnnotationProcessor) config.getServletContext().getAttribute(AnnotationProcessor.class.getName());
+-+        instanceManager = InstanceManagerFactory.getInstanceManager(config);
+-     }
+  
+-     /**
+-@@ -112,7 +111,7 @@
+-      * @throws JspException if a tag handler cannot be instantiated
+-      */
+-     public Tag get(Class handlerClass) throws JspException {
+--	Tag handler = null;
+-+    	Tag handler;
+-         synchronized( this ) {
+-             if (current >= 0) {
+-                 handler = handlers[current--];
+-@@ -123,9 +122,13 @@
+-         // Out of sync block - there is no need for other threads to
+-         // wait for us to construct a tag for this thread.
+-         try {
+--            Tag instance = (Tag) handlerClass.newInstance();
+--            AnnotationHelper.postConstruct(annotationProcessor, instance);
+--            return instance;
+-+        	if (Constants.USE_INSTANCE_MANAGER_FOR_TAGS) {
+-+        		return (Tag) instanceManager.newInstance(handlerClass.getName(), handlerClass.getClassLoader());
+-+        	} else {
+-+                Tag instance = (Tag) handlerClass.newInstance();
+-+                instanceManager.newInstance(instance);
+-+                return instance;
+-+        	}
+-         } catch (Exception e) {
+-             throw new JspException(e.getMessage(), e);
+-         }
+-@@ -147,13 +150,11 @@
+-         }
+-         // There is no need for other threads to wait for us to release
+-         handler.release();
+--        if (annotationProcessor != null) {
+--            try {
+--                AnnotationHelper.preDestroy(annotationProcessor, handler);
+--            } catch (Exception e) {
+--                log.warn("Error processing preDestroy on tag instance of " 
+--                        + handler.getClass().getName(), e);
+--            }
+-+        try {
+-+            instanceManager.destroyInstance(handler);
+-+        } catch (Exception e) {
+-+            log.warn("Error processing preDestroy on tag instance of "
+-+                    + handler.getClass().getName(), e);
+-         }
+-     }
+- 
+-@@ -164,13 +165,11 @@
+-     public synchronized void release() {
+-         for (int i = current; i >= 0; i--) {
+-             handlers[i].release();
+--            if (annotationProcessor != null) {
+--                try {
+--                    AnnotationHelper.preDestroy(annotationProcessor, handlers[i]);
+--                } catch (Exception e) {
+--                    log.warn("Error processing preDestroy on tag instance of " 
+--                            + handlers[i].getClass().getName(), e);
+--                }
+-+            try {
+-+                instanceManager.destroyInstance(handlers[i]);
+-+            } catch (Exception e) {
+-+                log.warn("Error processing preDestroy on tag instance of "
+-+                        + handlers[i].getClass().getName(), e);
+-             }
+-         }
+-     }
+-Index: java/org/apache/jasper/runtime/AnnotationHelper.java
+-===================================================================
+---- java/org/apache/jasper/runtime/AnnotationHelper.java	(revision 3168)
+-+++ java/org/apache/jasper/runtime/AnnotationHelper.java	(working copy)
+-@@ -1,61 +0,0 @@
+--/*
+-- * Licensed to the Apache Software Foundation (ASF) under one or more
+-- * contributor license agreements.  See the NOTICE file distributed with
+-- * this work for additional information regarding copyright ownership.
+-- * The ASF licenses this file to You 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.InvocationTargetException;
+--
+--import javax.naming.NamingException;
+--
+--import org.apache.AnnotationProcessor;
+--
+--
+--/**
+-- * Verify the annotation and Process it.
+-- *
+-- * @author Fabien Carrion
+-- * @author Remy Maucherat
+-- * @version $Revision: 467222 $, $Date: 2006-10-23 23:17:11 -0400 (Mon, 23 Oct 2006) $
+-- */
+--public class AnnotationHelper {
+--
+--    
+--    /**
+--     * Call postConstruct method on the specified instance. Note: In Jasper, this
+--     * calls naming resources injection as well.
+--     */
+--    public static void postConstruct(AnnotationProcessor processor, Object instance)
+--        throws IllegalAccessException, InvocationTargetException, NamingException {
+--        if (processor != null) {
+--            processor.processAnnotations(instance);
+--            processor.postConstruct(instance);
+--        }
+--    }
+--    
+--    
+--    /**
+--     * Call preDestroy method on the specified instance.
+--     */
+--    public static void preDestroy(AnnotationProcessor processor, Object instance)
+--        throws IllegalAccessException, InvocationTargetException {
+--        if (processor != null) {
+--            processor.preDestroy(instance);
+--        }
+--    }
+--    
+--
+--}
+-Index: java/org/apache/jasper/runtime/InstanceManagerFactory.java
+-===================================================================
+---- java/org/apache/jasper/runtime/InstanceManagerFactory.java	(revision 0)
+-+++ java/org/apache/jasper/runtime/InstanceManagerFactory.java	(revision 0)
+-@@ -0,0 +1,44 @@
+-+/*
+-+ * Licensed to the Apache Software Foundation (ASF) under one
+-+ * or more contributor license agreements.  See the NOTICE file
+-+ * distributed with this work for additional information
+-+ * regarding copyright ownership.  The ASF licenses this file
+-+ * to you 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.
+-+ */
++-        // Initialize fields annotations
++-        Field[] fields = instance.getClass().getDeclaredFields();
++-        for (Field field : fields) {
++-            if (injections != null && injections.containsKey(field.getName())) {
++-                lookupFieldResource(context, instance, field, injections.get(field.getName()));
++-            } else if (field.isAnnotationPresent(Resource.class)) {
++-                Resource annotation = field.getAnnotation(Resource.class);
++-                lookupFieldResource(context, instance, field, annotation.name());
++-            } else if (field.isAnnotationPresent(EJB.class)) {
++-                EJB annotation = field.getAnnotation(EJB.class);
++-                lookupFieldResource(context, instance, field, annotation.name());
++-            } else if (field.isAnnotationPresent(WebServiceRef.class)) {
++-                WebServiceRef annotation =
+++        Class<?> clazz = instance.getClass();
+ +
+-+
+-+package org.apache.jasper.runtime;
+-+
+-+import javax.servlet.ServletConfig;
+-+
+-+import org.apache.InstanceManager;
+-+
+-+/**
+-+ * @version $Rev:$ $Date:$
+-+ */
+-+public class InstanceManagerFactory {
+-+
+-+    private InstanceManagerFactory() {
+-+    }
+-+
+-+    public static InstanceManager getInstanceManager(ServletConfig config) {
+-+        InstanceManager instanceManager = 
+-+        	(InstanceManager) config.getServletContext().getAttribute(InstanceManager.class.getName());
+-+        if (instanceManager == null) {
+-+            throw new IllegalStateException("No org.apache.InstanceManager set in ServletContext");
+-+        }
+-+        return instanceManager;
+-+    }
+-+
+-+}
+-
+-Property changes on: java/org/apache/jasper/runtime/InstanceManagerFactory.java
+-___________________________________________________________________
+-Name: svn:eol-style
+-   + native
+-
+-Index: java/org/apache/jasper/servlet/JspServletWrapper.java
+-===================================================================
+---- java/org/apache/jasper/servlet/JspServletWrapper.java	(revision 3168)
+-+++ java/org/apache/jasper/servlet/JspServletWrapper.java	(working copy)
+-@@ -31,7 +31,7 @@
+- import javax.servlet.http.HttpServletResponse;
+- import javax.servlet.jsp.tagext.TagInfo;
+- 
+--import org.apache.AnnotationProcessor;
+-+import org.apache.InstanceManager;
+- import org.apache.jasper.JasperException;
+- import org.apache.jasper.JspCompilationContext;
+- import org.apache.jasper.Options;
+-@@ -39,6 +39,7 @@
+- import org.apache.jasper.compiler.JavacErrorDetail;
+- import org.apache.jasper.compiler.JspRuntimeContext;
+- import org.apache.jasper.compiler.Localizer;
+-+import org.apache.jasper.runtime.InstanceManagerFactory;
+- import org.apache.jasper.runtime.JspSourceDependent;
+- import org.apache.juli.logging.Log;
+- import org.apache.juli.logging.LogFactory;
+-@@ -68,7 +69,6 @@
+- 
+-     private Servlet theServlet;
+-     private String jspUri;
+--    private Class servletClass;
+-     private Class tagHandlerClass;
+-     private JspCompilationContext ctxt;
+-     private long available = 0L;
+-@@ -139,15 +139,10 @@
+-                     destroy();
+-                     
+-                     Servlet servlet = null;
+--                    
+-+
+-                     try {
+--                        servletClass = ctxt.load();
+--                        servlet = (Servlet) servletClass.newInstance();
+--                        AnnotationProcessor annotationProcessor = (AnnotationProcessor) config.getServletContext().getAttribute(AnnotationProcessor.class.getName());
+--                        if (annotationProcessor != null) {
+--                           annotationProcessor.processAnnotations(servlet);
+--                           annotationProcessor.postConstruct(servlet);
+--                        }
+-+                        InstanceManager instanceManager = InstanceManagerFactory.getInstanceManager(config);
+-+                        servlet = (Servlet) instanceManager.newInstance(ctxt.getFQCN(), ctxt.getJspLoader());
+-                     } catch (IllegalAccessException e) {
+-                         throw new JasperException(e);
+-                     } catch (InstantiationException e) {
+-@@ -423,15 +418,13 @@
+-     public void destroy() {
+-         if (theServlet != null) {
+-             theServlet.destroy();
+--            AnnotationProcessor annotationProcessor = (AnnotationProcessor) config.getServletContext().getAttribute(AnnotationProcessor.class.getName());
+--            if (annotationProcessor != null) {
+--                try {
+--                    annotationProcessor.preDestroy(theServlet);
+--                } catch (Exception e) {
+--                    // Log any exception, since it can't be passed along
+--                    log.error(Localizer.getMessage("jsp.error.file.not.found",
+--                           e.getMessage()), e);
+--                }
+-+            InstanceManager instanceManager = InstanceManagerFactory.getInstanceManager(config);
+-+            try {
+-+                instanceManager.destroyInstance(theServlet);
+-+            } catch (Exception e) {
+-+                // Log any exception, since it can't be passed along
+-+                log.error(Localizer.getMessage("jsp.error.file.not.found",
+-+                        e.getMessage()), e);
+-             }
+-         }
+-     }
+-Index: java/org/apache/jasper/Constants.java
+-===================================================================
+---- java/org/apache/jasper/Constants.java	(revision 3168)
+-+++ java/org/apache/jasper/Constants.java	(working copy)
+-@@ -199,4 +199,7 @@
+-      */
+-     public static final String SESSION_PARAMETER_NAME = "jsessionid";
+- 
+-+    public static final boolean USE_INSTANCE_MANAGER_FOR_TAGS =
+-+        Boolean.valueOf(System.getProperty("org.apache.jasper.Constants.USE_INSTANCE_MANAGER_FOR_TAGS", "false")).booleanValue();
+-+
+- }
+-Index: java/org/apache/jasper/compiler/Generator.java
+-===================================================================
+---- java/org/apache/jasper/compiler/Generator.java	(revision 3168)
+-+++ java/org/apache/jasper/compiler/Generator.java	(working copy)
+-@@ -73,8 +73,8 @@
+- 
+-     private static final String VAR_EXPRESSIONFACTORY = 
+-         System.getProperty("org.apache.jasper.compiler.Generator.VAR_EXPRESSIONFACTORY", "_el_expressionfactory");
+--    private static final String VAR_ANNOTATIONPROCESSOR = 
+--        System.getProperty("org.apache.jasper.compiler.Generator.VAR_ANNOTATIONPROCESSOR", "_jsp_annotationprocessor");
+-+    private static final String VAR_INSTANCEMANAGER =
+-+        System.getProperty("org.apache.jasper.compiler.Generator.VAR_INSTANCEMANAGER", "_jsp_instancemanager");
+- 
+-     private ServletWriter out;
+- 
+-@@ -413,14 +413,14 @@
+-         }
+-         out.println(".getServletContext()).getExpressionFactory();");
+- 
+--        out.printin(VAR_ANNOTATIONPROCESSOR);
+--        out.print(" = (org.apache.AnnotationProcessor) ");
+-+        out.printin(VAR_INSTANCEMANAGER);
+-+        out.print(" = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(");
+-         if (ctxt.isTagFile()) {
+-             out.print("config");
+-         } else {
+-             out.print("getServletConfig()");
+-         }
+--        out.println(".getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());");
+-+        out.println(");");
+- 
+-         out.popIndent();
+-         out.printil("}");
+-@@ -524,8 +524,8 @@
+-         out.printin("private javax.el.ExpressionFactory ");
+-         out.print(VAR_EXPRESSIONFACTORY);
+-         out.println(";");
+--        out.printin("private org.apache.AnnotationProcessor ");
+--        out.print(VAR_ANNOTATIONPROCESSOR);
+-+        out.printin("private org.apache.InstanceManager ");
+-+        out.print(VAR_INSTANCEMANAGER);
+-         out.println(";");
+-         out.println();
+-     }
+-@@ -2135,11 +2135,11 @@
+- 
+-             String tagHandlerClassName = JspUtil
+-                     .getCanonicalName(tagHandlerClass);
+--            out.printin(tagHandlerClassName);
+--            out.print(" ");
+--            out.print(tagHandlerVar);
+--            out.print(" = ");
+-             if (isPoolingEnabled && !(n.implementsJspIdConsumer())) {
+-+                out.printin(tagHandlerClassName);
+-+                out.print(" ");
+-+                out.print(tagHandlerVar);
+-+                out.print(" = ");
+-                 out.print("(");
+-                 out.print(tagHandlerClassName);
+-                 out.print(") ");
+-@@ -2148,14 +2148,7 @@
+-                 out.print(tagHandlerClassName);
+-                 out.println(".class);");
+-             } else {
+--                out.print("new ");
+--                out.print(tagHandlerClassName);
+--                out.println("();");
+--                out.printin("org.apache.jasper.runtime.AnnotationHelper.postConstruct(");
+--                out.print(VAR_ANNOTATIONPROCESSOR);
+--                out.print(", ");
+--                out.print(tagHandlerVar);
+--                out.println(");");
+-+                writeNewInstance(tagHandlerVar, tagHandlerClassName);
+-             }
+- 
+-             // includes setting the context
+-@@ -2213,8 +2206,7 @@
+-                         out.println("[0]++;");
+-                     }
+-                     out.printin(tagHandlerVar);
+--                    out
+--                            .println(".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);");
+-+                    out.println(".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);");
+-                     out.printin(tagHandlerVar);
+-                     out.println(".doInitBody();");
+- 
+-@@ -2240,6 +2232,40 @@
+-             n.setEndJavaLine(out.getJavaLine());
+-         }
+- 
+-+        private void writeNewInstance(String tagHandlerVar, String tagHandlerClassName) {
+-+        	if (Constants.USE_INSTANCE_MANAGER_FOR_TAGS) {
+-+        		out.printin(tagHandlerClassName);
+-+        		out.print(" ");
+-+        		out.print(tagHandlerVar);
+-+        		out.print(" = (");
+-+        		out.print(tagHandlerClassName);
+-+        		out.print(")");
+-+        		out.print(VAR_INSTANCEMANAGER);
+-+        		out.print(".newInstance(\"");
+-+        		out.print(tagHandlerClassName);
+-+        		out.println("\", this.getClass().getClassLoader());");
+-+        	} else {
+-+        		out.printin(tagHandlerClassName);
+-+        		out.print(" ");
+-+        		out.print(tagHandlerVar);
+-+        		out.print(" = (");
+-+        		out.print("new ");
+-+        		out.print(tagHandlerClassName);
+-+        		out.println("());");
+-+        		out.printin(VAR_INSTANCEMANAGER);
+-+        		out.print(".newInstance(");
+-+        		out.print(tagHandlerVar);
+-+        		out.println(");");
+-+        	}
+-+        }
+-+
+-+        private void writeDestroyInstance(String tagHandlerVar) {
+-+            out.printin(VAR_INSTANCEMANAGER);
+-+            out.print(".destroyInstance(");
+-+            out.print(tagHandlerVar);
+-+            out.println(");");
+-+        }
+-+
+-         private void generateCustomEnd(Node.CustomTag n, String tagHandlerVar,
+-                 String tagEvalVar, String tagPushBodyCountVar) {
+- 
+-@@ -2301,11 +2327,7 @@
+-                 } else {
+-                     out.printin(tagHandlerVar);
+-                     out.println(".release();");
+--                    out.printin("org.apache.jasper.runtime.AnnotationHelper.preDestroy(");
+--                    out.print(VAR_ANNOTATIONPROCESSOR);
+--                    out.print(", ");
+--                    out.print(tagHandlerVar);
+--                    out.println(");");
+-+                    writeDestroyInstance(tagHandlerVar);
+-                 }
+-             }
+-             if (isTagFile || isFragment) {
+-@@ -2348,11 +2370,7 @@
+-             } else {
+-                 out.printin(tagHandlerVar);
+-                 out.println(".release();");
+--                out.printin("org.apache.jasper.runtime.AnnotationHelper.preDestroy(");
+--                out.print(VAR_ANNOTATIONPROCESSOR);
+--                out.print(", ");
+--                out.print(tagHandlerVar);
+--                out.println(");");
+-+                writeDestroyInstance(tagHandlerVar);
+-             }
+- 
+-             if (n.implementsTryCatchFinally()) {
+-@@ -2384,21 +2402,8 @@
+- 
+-             String tagHandlerClassName = JspUtil
+-                     .getCanonicalName(tagHandlerClass);
+--            out.printin(tagHandlerClassName);
+--            out.print(" ");
+--            out.print(tagHandlerVar);
+--            out.print(" = ");
+--            out.print("new ");
+--            out.print(tagHandlerClassName);
+--            out.println("();");
+-+            writeNewInstance(tagHandlerVar, tagHandlerClassName);
+- 
+--            // Resource injection
+--            out.printin("org.apache.jasper.runtime.AnnotationHelper.postConstruct(");
+--            out.print(VAR_ANNOTATIONPROCESSOR);
+--            out.print(", ");
+--            out.print(tagHandlerVar);
+--            out.println(");");
+--            
+-             generateSetters(n, tagHandlerVar, handlerInfo, true);
+- 
+-             // JspIdConsumer (after context has been set)
+-@@ -2451,11 +2456,7 @@
+-             syncScriptingVars(n, VariableInfo.AT_END);
+- 
+-             // Resource injection
+--            out.printin("org.apache.jasper.runtime.AnnotationHelper.preDestroy(");
+--            out.print(VAR_ANNOTATIONPROCESSOR);
+--            out.print(", ");
+--            out.print(tagHandlerVar);
+--            out.println(");");
+-+            writeDestroyInstance(tagHandlerVar);
+- 
+-             n.setEndJavaLine(out.getJavaLine());
+-         }
+-Index: java/org/apache/AnnotationProcessor.java
+-===================================================================
+---- java/org/apache/AnnotationProcessor.java	(revision 3168)
+-+++ java/org/apache/AnnotationProcessor.java	(working copy)
+-@@ -1,37 +0,0 @@
+--/*
+-- * Licensed to the Apache Software Foundation (ASF) under one or more
+-- * contributor license agreements.  See the NOTICE file distributed with
+-- * this work for additional information regarding copyright ownership.
+-- * The ASF licenses this file to You 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;
+--
+--import java.lang.reflect.InvocationTargetException;
+--
+--import javax.naming.NamingException;
+--
+--/**
+-- * Comment
+-- *
+-- * @author <a href="mailto:bill@jboss.org">Bill Burke</a>
+-- * @version $Revision: 467222 $
+-- */
+--public interface AnnotationProcessor {
+--    public void postConstruct(Object instance)
+--        throws IllegalAccessException, InvocationTargetException;
+--    public void preDestroy(Object instance)
+--        throws IllegalAccessException, InvocationTargetException;
+--    public void processAnnotations(Object instance)
+--        throws IllegalAccessException, InvocationTargetException, NamingException;
+--}
+-Index: java/org/apache/catalina/core/DefaultInstanceManager.java
+-===================================================================
+---- java/org/apache/catalina/core/DefaultInstanceManager.java	(revision 0)
+-+++ java/org/apache/catalina/core/DefaultInstanceManager.java	(revision 0)
+-@@ -0,0 +1,437 @@
+-+/*
+-+ * Licensed to the Apache Software Foundation (ASF) under one or more
+-+ * contributor license agreements.  See the NOTICE file distributed with
+-+ * this work for additional information regarding copyright ownership.
+-+ * The ASF licenses this file to You 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.catalina.core;
+-+
+-+
+-+import java.lang.reflect.Field;
+-+import java.lang.reflect.InvocationTargetException;
+-+import java.lang.reflect.Method;
+-+import java.lang.reflect.Modifier;
+-+import java.util.Map;
+-+import java.util.Properties;
+-+import java.security.AccessController;
+-+import java.security.PrivilegedExceptionAction;
+-+import java.security.PrivilegedActionException;
+-+import java.io.InputStream;
+-+import java.io.IOException;
+-+
+-+import javax.annotation.PostConstruct;
+-+import javax.annotation.PreDestroy;
+-+import javax.annotation.Resource;
+-+import javax.ejb.EJB;
+-+import javax.naming.Context;
+-+import javax.naming.NamingException;
+-+import javax.persistence.PersistenceContext;
+-+import javax.persistence.PersistenceUnit;
+-+import javax.xml.ws.WebServiceRef;
+-+import javax.servlet.Filter;
+-+import javax.servlet.Servlet;
+-+
+-+import org.apache.InstanceManager;
+-+import org.apache.catalina.security.SecurityUtil;
+-+import org.apache.catalina.ContainerServlet;
+-+import org.apache.catalina.core.Constants;
+-+import org.apache.catalina.util.StringManager;
+-+
+-+/**
+-+ * @version $Rev:$ $Date:$
+-+ */
+-+public class DefaultInstanceManager implements InstanceManager {
+-+
+-+    private final Context context;
+-+    private final Map<String, Map<String, String>> injectionMap;
+-+    protected final ClassLoader classLoader;
+-+    protected final ClassLoader containerClassLoader;
+-+    protected boolean privileged;
+-+    protected boolean ignoreAnnotations;
+-+    private Properties restrictedFilters = new Properties();
+-+    private Properties restrictedListeners = new Properties();
+-+    private Properties restrictedServlets = new Properties();
+-+
+-+    public DefaultInstanceManager(Context context, Map<String, Map<String, String>> injectionMap, org.apache.catalina.Context catalinaContext, ClassLoader containerClassLoader) {
+-+        classLoader = catalinaContext.getLoader().getClassLoader();
+-+        privileged = catalinaContext.getPrivileged();
+-+        this.containerClassLoader = containerClassLoader;
+-+        ignoreAnnotations = catalinaContext.getIgnoreAnnotations();
+-+        StringManager sm = StringManager.getManager(Constants.Package);
+-+        try {
+-+            InputStream is =
+-+                this.getClass().getClassLoader().getResourceAsStream
+-+                    ("org/apache/catalina/core/RestrictedServlets.properties");
+-+            if (is != null) {
+-+                restrictedServlets.load(is);
+-+            } else {
+-+                catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedServletsResource"));
+-+            }
+-+        } catch (IOException e) {
+-+            catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedServletsResource"), e);
+-+        }
+-+
+-+        try {
+-+            InputStream is =
+-+                    this.getClass().getClassLoader().getResourceAsStream
+-+                            ("org/apache/catalina/core/RestrictedListeners.properties");
+-+            if (is != null) {
+-+                restrictedListeners.load(is);
+-+            } else {
+-+                catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedListenersResources"));
+-+            }
+-+        } catch (IOException e) {
+-+            catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedListenersResources"), e);
+-+        }
+-+        try {
+-+            InputStream is =
+-+                    this.getClass().getClassLoader().getResourceAsStream
+-+                            ("org/apache/catalina/core/RestrictedFilters.properties");
+-+            if (is != null) {
+-+                restrictedFilters.load(is);
+-+            } else {
+-+                catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedFiltersResources"));
+-+            }
+-+        } catch (IOException e) {
+-+            catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedServletsResources"), e);
+-+        }
+-+        this.context = context;
+-+        this.injectionMap = injectionMap;
+-+    }
+-+
+-+    public Object newInstance(String className) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException {
+-+        Class clazz = loadClassMaybePrivileged(className, classLoader);
+-+        return newInstance(clazz.newInstance(), clazz);
+-+    }
+-+
+-+    public Object newInstance(final String className, final ClassLoader classLoader) throws IllegalAccessException, NamingException, InvocationTargetException, InstantiationException, ClassNotFoundException {
+-+        Class clazz = classLoader.loadClass(className);
+-+        return newInstance(clazz.newInstance(), clazz);
+-+    }
+-+
+-+    public void newInstance(Object o) 
+-+		throws IllegalAccessException, InvocationTargetException, NamingException {
+-+    	newInstance(o, o.getClass());
+-+    }
+-+
+-+    private Object newInstance(Object instance, Class clazz) throws IllegalAccessException, InvocationTargetException, NamingException {
+-+        if (!ignoreAnnotations) {
+-+            Map<String, String> injections = injectionMap.get(clazz.getName());
+-+            processAnnotations(instance, injections);
+-+            postConstruct(instance, clazz);
+-+        }
+-+        return instance;
+-+    }
+-+
+-+    public void destroyInstance(Object instance) throws IllegalAccessException, InvocationTargetException {
+-+        if (!ignoreAnnotations) {
+-+            preDestroy(instance, instance.getClass());
+-+        }
+-+    }
+-+
+-+    /**
+-+     * Call postConstruct method on the specified instance recursively from deepest superclass to actual class.
+-+     *
+-+     * @param instance object to call postconstruct methods on
+-+     * @param clazz    (super) class to examine for postConstruct annotation.
+-+     * @throws IllegalAccessException if postConstruct method is inaccessible.
+-+     * @throws java.lang.reflect.InvocationTargetException
+-+     *                                if call fails
+-+     */
+-+    protected void postConstruct(Object instance, Class clazz)
+-+            throws IllegalAccessException, InvocationTargetException {
+-+        Class superClass = clazz.getSuperclass();
+-+        if (superClass != Object.class) {
+-+            postConstruct(instance, superClass);
+-+        }
+-+
+-+        Method[] methods = clazz.getDeclaredMethods();
+-+        Method postConstruct = null;
+-+        for (Method method : methods) {
+-+            if (method.isAnnotationPresent(PostConstruct.class)) {
+-+                if ((postConstruct != null)
+-+                        || (method.getParameterTypes().length != 0)
+-+                        || (Modifier.isStatic(method.getModifiers()))
+-+                        || (method.getExceptionTypes().length > 0)
+-+                        || (!method.getReturnType().getName().equals("void"))) {
+-+                    throw new IllegalArgumentException("Invalid PostConstruct annotation");
+++        while (clazz != null) {
+++            // Initialize fields annotations
+++            Field[] fields = instance.getClass().getDeclaredFields();
+++            for (Field field : fields) {
+++                if (injections != null && injections.containsKey(field.getName())) {
+++                    lookupFieldResource(context, instance, field, injections.get(field.getName()));
+ +                }
+-+                postConstruct = method;
+-+            }
+-+        }
+-+
+-+        // 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 recursively from deepest superclass to actual class.
+-+     *
+-+     * @param instance object to call preDestroy methods on
+-+     * @param clazz    (super) class to examine for preDestroy annotation.
+-+     * @throws IllegalAccessException if preDestroy method is inaccessible.
+-+     * @throws java.lang.reflect.InvocationTargetException
+-+     *                                if call fails
+-+     */
+-+    protected void preDestroy(Object instance, Class clazz)
+-+            throws IllegalAccessException, InvocationTargetException {
+-+        Class superClass = clazz.getSuperclass();
+-+        if (superClass != Object.class) {
+-+            preDestroy(instance, superClass);
+-+        }
+-+
+-+        Method[] methods = clazz.getDeclaredMethods();
+-+        Method preDestroy = null;
+-+        for (Method method : methods) {
+-+            if (method.isAnnotationPresent(PreDestroy.class)) {
+-+                if ((method.getParameterTypes().length != 0)
+-+                        || (Modifier.isStatic(method.getModifiers()))
+-+                        || (method.getExceptionTypes().length > 0)
+-+                        || (!method.getReturnType().getName().equals("void"))) {
+-+                    throw new IllegalArgumentException("Invalid PreDestroy annotation");
+++                if (field.isAnnotationPresent(Resource.class)) {
+++                    Resource annotation = field.getAnnotation(Resource.class);
+++                    lookupFieldResource(context, instance, field, annotation.name());
+++                } else if (field.isAnnotationPresent(EJB.class)) {
+++                    EJB annotation = field.getAnnotation(EJB.class);
+++                    lookupFieldResource(context, instance, field, annotation.name());
+++                } else if (field.isAnnotationPresent(WebServiceRef.class)) {
+++                    WebServiceRef annotation =
++                         field.getAnnotation(WebServiceRef.class);
++-                lookupFieldResource(context, instance, field, annotation.name());
++-            } else if (field.isAnnotationPresent(PersistenceContext.class)) {
++-                PersistenceContext annotation =
+++                    lookupFieldResource(context, instance, field, annotation.name());
+++                } else if (field.isAnnotationPresent(PersistenceContext.class)) {
+++                    PersistenceContext annotation =
++                         field.getAnnotation(PersistenceContext.class);
++-                lookupFieldResource(context, instance, field, annotation.name());
++-            } else if (field.isAnnotationPresent(PersistenceUnit.class)) {
++-                PersistenceUnit annotation =
+++                    lookupFieldResource(context, instance, field, annotation.name());
+++                } else if (field.isAnnotationPresent(PersistenceUnit.class)) {
+++                    PersistenceUnit annotation =
++                         field.getAnnotation(PersistenceUnit.class);
++-                lookupFieldResource(context, instance, field, annotation.name());
+++                    lookupFieldResource(context, instance, field, annotation.name());
+ +                }
+-+                preDestroy = method;
+-+                break;
+-+            }
+-+        }
+-+
+-+        // 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.
+-+     *
+-+     * @param instance   instance to inject into
+-+     * @param injections map of injections for this class from xml deployment descriptor
+-+     * @throws IllegalAccessException       if injection target is inaccessible
+-+     * @throws javax.naming.NamingException if value cannot be looked up in jndi
+-+     * @throws java.lang.reflect.InvocationTargetException
+-+     *                                      if injection fails
+-+     */
+-+    protected void processAnnotations(Object instance, Map<String, String> injections)
+-+            throws IllegalAccessException, InvocationTargetException, NamingException {
+-+
+-+        if (context == null) {
+-+            // No resource injection
+-+            return;
+-+        }
+-+
+-+        // Initialize fields annotations
+-+        Field[] fields = instance.getClass().getDeclaredFields();
+-+        for (Field field : fields) {
+-+            if (injections != null && injections.containsKey(field.getName())) {
+-+                lookupFieldResource(context, instance, field, injections.get(field.getName()));
+-+            } else if (field.isAnnotationPresent(Resource.class)) {
+-+                Resource annotation = field.getAnnotation(Resource.class);
+-+                lookupFieldResource(context, instance, field, annotation.name());
+-+            } else if (field.isAnnotationPresent(EJB.class)) {
+-+                EJB annotation = field.getAnnotation(EJB.class);
+-+                lookupFieldResource(context, instance, field, annotation.name());
+-+            } else if (field.isAnnotationPresent(WebServiceRef.class)) {
+-+                WebServiceRef annotation =
+-+                        field.getAnnotation(WebServiceRef.class);
+-+                lookupFieldResource(context, instance, field, annotation.name());
+-+            } else if (field.isAnnotationPresent(PersistenceContext.class)) {
+-+                PersistenceContext annotation =
+-+                        field.getAnnotation(PersistenceContext.class);
+-+                lookupFieldResource(context, instance, field, annotation.name());
+-+            } else if (field.isAnnotationPresent(PersistenceUnit.class)) {
+-+                PersistenceUnit annotation =
+-+                        field.getAnnotation(PersistenceUnit.class);
+-+                lookupFieldResource(context, instance, field, annotation.name());
+-+            }
+-+        }
+-+
+-+        // Initialize methods annotations
+-+        Method[] methods = instance.getClass().getDeclaredMethods();
+-+        for (Method method : methods) {
+-+            String methodName = method.getName();
+-+            if (injections != null && methodName.startsWith("set") && methodName.length() > 3) {
+-+                String fieldName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
+-+                if (injections.containsKey(fieldName)) {
+-+                    lookupMethodResource(context, instance, method, injections.get(fieldName));
+-+                    break;
+-+                }
+-+            }
+-+            if (method.isAnnotationPresent(Resource.class)) {
+-+                Resource annotation = method.getAnnotation(Resource.class);
+-+                lookupMethodResource(context, instance, method, annotation.name());
+-+            } else if (method.isAnnotationPresent(EJB.class)) {
+-+                EJB annotation = method.getAnnotation(EJB.class);
+-+                lookupMethodResource(context, instance, method, annotation.name());
+-+            } else if (method.isAnnotationPresent(WebServiceRef.class)) {
+-+                WebServiceRef annotation =
+-+                        method.getAnnotation(WebServiceRef.class);
+-+                lookupMethodResource(context, instance, method, annotation.name());
+-+            } else if (method.isAnnotationPresent(PersistenceContext.class)) {
+-+                PersistenceContext annotation =
+-+                        method.getAnnotation(PersistenceContext.class);
+-+                lookupMethodResource(context, instance, method, annotation.name());
+-+            } else if (method.isAnnotationPresent(PersistenceUnit.class)) {
+-+                PersistenceUnit annotation =
+-+                        method.getAnnotation(PersistenceUnit.class);
+-+                lookupMethodResource(context, instance, method, annotation.name());
+-+            }
+-+        }
+-+
+-+    }
+-+
+-+
+-+    protected Class loadClassMaybePrivileged(final String className, final ClassLoader classLoader) throws ClassNotFoundException {
+-+        Class clazz;
+-+        if (SecurityUtil.isPackageProtectionEnabled()) {
+-+            try {
+-+                clazz = AccessController.doPrivileged(new PrivilegedExceptionAction<Class>() {
+-+
+-+                    public Class run() throws Exception {
+-+                        return loadClass(className, classLoader);
+-+                    }
+-+                });
+-+            } catch (PrivilegedActionException e) {
+-+                Throwable t = e.getCause();
+-+                if (t instanceof ClassNotFoundException) {
+-+                    throw (ClassNotFoundException) t;
+-+                }
+-+                throw new RuntimeException(t);
+-+            }
+-+        } else {
+-+            clazz = loadClass(className, classLoader);
+-+        }
+-+        checkAccess(clazz);
+-+        return clazz;
+-+    }
+-+
+-+    protected Class loadClass(String className, ClassLoader classLoader) throws ClassNotFoundException {
+-+        if (className.startsWith("org.apache.catalina")) {
+-+            return containerClassLoader.loadClass(className);
+-+        }
+-+        try {
+-+            Class clazz = containerClassLoader.loadClass(className);
+-+            if (ContainerServlet.class.isAssignableFrom(clazz)) {
+-+                return clazz;
+-+            }
+-+        } catch (Throwable t) {
+-+            //ignore
+-+        }
+-+        return classLoader.loadClass(className);
+-+    }
+-+
+-+    private void checkAccess(Class clazz) {
+-+        if (privileged) return;
+-+        if (clazz.isAssignableFrom(Filter.class)) {
+-+            checkAccess(clazz, restrictedFilters);
+-+        } else if (clazz.isAssignableFrom(Servlet.class)) {
+-+            checkAccess(clazz, restrictedServlets);
+-+        } else {
+-+            checkAccess(clazz, restrictedListeners);
+-+        }
+-+    }
+-+
+-+    private void checkAccess(Class clazz, Properties restricted) {
+-+        while (clazz != null) {
+-+            if ("restricted".equals(restricted.getProperty(clazz.getName()))) {
+-+                throw new SecurityException("Restricted class" + clazz);
+-+            }
+-+            clazz = clazz.getSuperclass();
+-+        }
+-+
+-+    }
+-+
+-+    /**
+-+     * Inject resources in specified field.
+-+     *
+-+     * @param context  jndi context to extract value from
+-+     * @param instance object to inject into
+-+     * @param field    field target for injection
+-+     * @param name     jndi name value is bound under
+-+     * @throws IllegalAccessException       if field is inaccessible
+-+     * @throws javax.naming.NamingException if value is not accessible in naming context
+-+     */
+-+    protected static void lookupFieldResource(Context context,
+-+            Object instance, Field field, String name)
+-+            throws NamingException, IllegalAccessException {
+-+
+-+        Object lookedupResource;
+-+        boolean accessibility;
+-+
+-+        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.
+-+     *
+-+     * @param context  jndi context to extract value from
+-+     * @param instance object to inject into
+-+     * @param method   field target for injection
+-+     * @param name     jndi name value is bound under
+-+     * @throws IllegalAccessException       if method is inaccessible
+-+     * @throws javax.naming.NamingException if value is not accessible in naming context
+-+     * @throws java.lang.reflect.InvocationTargetException
+-+     *                                      if setter call fails
+-+     */
+-+    protected static void lookupMethodResource(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;
+-+        boolean accessibility;
+-+
+-+        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);
+-+    }
+-+}
+-
+-Property changes on: java/org/apache/catalina/core/DefaultInstanceManager.java
+-___________________________________________________________________
+-Name: svn:eol-style
+-   + native
+-
+-Index: java/org/apache/catalina/core/RestrictedListeners.properties
+-===================================================================
+---- java/org/apache/catalina/core/RestrictedListeners.properties	(revision 0)
+-+++ java/org/apache/catalina/core/RestrictedListeners.properties	(revision 0)
+-@@ -0,0 +1,15 @@
+-+# Licensed to the Apache Software Foundation (ASF) under one or more
+-+# contributor license agreements.  See the NOTICE file distributed with
+-+# this work for additional information regarding copyright ownership.
+-+# The ASF licenses this file to You 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.
+-+
+-
+-Property changes on: java/org/apache/catalina/core/RestrictedListeners.properties
+-___________________________________________________________________
+-Name: svn:eol-style
+-   + native
+-
+-Index: java/org/apache/catalina/core/ApplicationFilterConfig.java
+-===================================================================
+---- java/org/apache/catalina/core/ApplicationFilterConfig.java	(revision 3168)
+-+++ java/org/apache/catalina/core/ApplicationFilterConfig.java	(working copy)
+-@@ -19,14 +19,12 @@
+- package org.apache.catalina.core;
+- 
+- 
+--import java.io.IOException;
+--import java.io.InputStream;
+- import java.io.Serializable;
+- import java.lang.reflect.InvocationTargetException;
+- import java.util.ArrayList;
+- import java.util.Enumeration;
+-+import java.util.HashMap;
+- import java.util.Map;
+--import java.util.Properties;
+- 
+- import javax.naming.NamingException;
+- import javax.servlet.Filter;
+-@@ -34,7 +32,7 @@
+- import javax.servlet.ServletContext;
+- import javax.servlet.ServletException;
+- 
+--import org.apache.AnnotationProcessor;
+-+import org.apache.InstanceManager;
+- import org.apache.catalina.Context;
+- import org.apache.catalina.Globals;
+- import org.apache.catalina.deploy.FilterDef;
+-@@ -58,7 +56,7 @@
+- 
+-     protected static StringManager sm =
+-         StringManager.getManager(Constants.Package);
+--    
+-+
+-     // ----------------------------------------------------------- Constructors
+- 
+- 
+-@@ -78,8 +76,8 @@
+-      * @exception InstantiationException if an exception occurs while
+-      *  instantiating the filter object
+-      * @exception ServletException if thrown by the filter's init() method
+--     * @throws NamingException 
+--     * @throws InvocationTargetException 
+-+     * @throws NamingException
+-+     * @throws InvocationTargetException
+-      */
+-     public ApplicationFilterConfig(Context context, FilterDef filterDef)
+-         throws ClassCastException, ClassNotFoundException,
+-@@ -88,22 +86,6 @@
+- 
+-         super();
+- 
+--        if (restrictedFilters == null) {
+--            restrictedFilters = new Properties();
+--            try {
+--                InputStream is = 
+--                    this.getClass().getClassLoader().getResourceAsStream
+--                        ("org/apache/catalina/core/RestrictedFilters.properties");
+--                if (is != null) {
+--                    restrictedFilters.load(is);
+--                } else {
+--                    context.getLogger().error(sm.getString("applicationFilterConfig.restrictedFiltersResources"));
+--                }
+--            } catch (IOException e) {
+--                context.getLogger().error(sm.getString("applicationFilterConfig.restrictedServletsResources"), e);
+--            }
+--        }
+--        
+-         this.context = context;
+-         setFilterDef(filterDef);
+- 
+-@@ -130,13 +112,12 @@
+-      */
+-     private FilterDef filterDef = null;
+- 
+--
+-     /**
+--     * Restricted filters (which can only be loaded by a privileged webapp).
+-+     * the InstanceManager used to create and destroy filter instances.
+-      */
+--    protected static Properties restrictedFilters = null;
+-+    private transient InstanceManager instanceManager;
+- 
+--    
+-+
+-     // --------------------------------------------------- FilterConfig Methods
+- 
+- 
+-@@ -223,11 +204,11 @@
+-      * @exception InstantiationException if an exception occurs while
+-      *  instantiating the filter object
+-      * @exception ServletException if thrown by the filter's init() method
+--     * @throws NamingException 
+--     * @throws InvocationTargetException 
+-+     * @throws NamingException
+-+     * @throws InvocationTargetException
+-      */
+-     Filter getFilter() throws ClassCastException, ClassNotFoundException,
+--        IllegalAccessException, InstantiationException, ServletException, 
+-+        IllegalAccessException, InstantiationException, ServletException,
+-         InvocationTargetException, NamingException {
+- 
+-         // Return the existing filter instance, if any
+-@@ -236,32 +217,10 @@
+- 
+-         // Identify the class loader we will be using
+-         String filterClass = filterDef.getFilterClass();
+--        ClassLoader classLoader = null;
+--        if (filterClass.startsWith("org.apache.catalina."))
+--            classLoader = this.getClass().getClassLoader();
+--        else
+--            classLoader = context.getLoader().getClassLoader();
+-+        this.filter = (Filter) getInstanceManager().newInstance(filterClass);
+- 
+--        ClassLoader oldCtxClassLoader =
+--            Thread.currentThread().getContextClassLoader();
+--
+--        // Instantiate a new instance of this filter and return it
+--        Class clazz = classLoader.loadClass(filterClass);
+--        if (!isFilterAllowed(clazz)) {
+--            throw new SecurityException
+--                (sm.getString("applicationFilterConfig.privilegedFilter",
+--                        filterClass));
+--        }
+--        this.filter = (Filter) clazz.newInstance();
+--        if (!context.getIgnoreAnnotations()) {
+--            if (context instanceof StandardContext) {
+--               AnnotationProcessor processor = ((StandardContext)context).getAnnotationProcessor();
+--               processor.processAnnotations(this.filter);
+--               processor.postConstruct(this.filter);
+--            }
+--        }
+-         if (context instanceof StandardContext &&
+--            ((StandardContext) context).getSwallowOutput()) {
+-+                context.getSwallowOutput()) {
+-             try {
+-                 SystemLogHandler.startCapture();
+-                 filter.init(this);
+-@@ -289,31 +248,7 @@
+- 
+-     }
+- 
+--
+-     /**
+--     * Return <code>true</code> if loading this filter is allowed.
+--     */
+--    protected boolean isFilterAllowed(Class filterClass) {
+--
+--        // Privileged webapps may load all servlets without restriction
+--        if (context.getPrivileged()) {
+--            return true;
+--        }
+--
+--        Class clazz = filterClass;
+--        while (clazz != null && !clazz.getName().equals("javax.servlet.Filter")) {
+--            if ("restricted".equals(restrictedFilters.getProperty(clazz.getName()))) {
+--                return (false);
+--            }
+--            clazz = clazz.getSuperclass();
+--        }
+--        
+--        return (true);
+--
+--    }
+--
+--
+--    /**
+-      * Release the Filter instance associated with this FilterConfig,
+-      * if there is one.
+-      */
+-@@ -323,17 +258,17 @@
+-         {
+-             if (Globals.IS_SECURITY_ENABLED) {
+-                 try {
+--                    SecurityUtil.doAsPrivilege("destroy", filter); 
+--                } catch(java.lang.Exception ex){                    
+-+                    SecurityUtil.doAsPrivilege("destroy", filter);
+-+                } catch(java.lang.Exception ex){
+-                     context.getLogger().error("ApplicationFilterConfig.doAsPrivilege", ex);
+-                 }
+-                 SecurityUtil.remove(filter);
+--            } else { 
+-+            } else {
+-                 filter.destroy();
+              }
+-             if (!context.getIgnoreAnnotations()) {
+-                 try {
+--                    ((StandardContext)context).getAnnotationProcessor().preDestroy(this.filter);
+-+                    ((StandardContext) context).getInstanceManager().destroyInstance(this.filter);
+-                 } catch (Exception e) {
+-                     context.getLogger().error("ApplicationFilterConfig.preDestroy", e);
+-                 }
+-@@ -358,8 +293,8 @@
+-      * @exception InstantiationException if an exception occurs while
+-      *  instantiating the filter object
+-      * @exception ServletException if thrown by the filter's init() method
+--     * @throws NamingException 
+--     * @throws InvocationTargetException 
+-+     * @throws NamingException
+-+     * @throws InvocationTargetException
+-      */
+-     void setFilterDef(FilterDef filterDef)
+-         throws ClassCastException, ClassNotFoundException,
+-@@ -373,17 +308,17 @@
+-             if (this.filter != null){
+-                 if( Globals.IS_SECURITY_ENABLED) {
+-                     try{
+--                        SecurityUtil.doAsPrivilege("destroy", filter);  
+--                    } catch(java.lang.Exception ex){    
+-+                        SecurityUtil.doAsPrivilege("destroy", filter);
+-+                    } catch(java.lang.Exception ex){
+-                         context.getLogger().error("ApplicationFilterConfig.doAsPrivilege", ex);
+-                     }
+-                     SecurityUtil.remove(filter);
+--                } else { 
+-+                } else {
+-                     filter.destroy();
+-                 }
+-                 if (!context.getIgnoreAnnotations()) {
+-                     try {
+--                        ((StandardContext)context).getAnnotationProcessor().preDestroy(this.filter);
+-+                        ((StandardContext) context).getInstanceManager().destroyInstance(this.filter);
+-                     } catch (Exception e) {
+-                         context.getLogger().error("ApplicationFilterConfig.preDestroy", e);
+-                     }
+-@@ -403,5 +338,18 @@
+- 
+-     // -------------------------------------------------------- Private Methods
+- 
+-+    private InstanceManager getInstanceManager() {
+-+        if (instanceManager == null) {
+-+            if (context instanceof StandardContext) {
+-+                instanceManager = ((StandardContext)context).getInstanceManager();
+-+            } else {
+-+                instanceManager = new DefaultInstanceManager(null,
+-+                        new HashMap<String, Map<String, String>>(),
+-+                        context,
+-+                        getClass().getClassLoader()); 
+-+            }
+-+        }
+-+        return instanceManager;
+-+    }
+- 
+- }
+-Index: java/org/apache/catalina/core/StandardWrapper.java
+-===================================================================
+---- java/org/apache/catalina/core/StandardWrapper.java	(revision 3168)
+-+++ java/org/apache/catalina/core/StandardWrapper.java	(working copy)
+-@@ -18,27 +18,14 @@
+- 
+- package org.apache.catalina.core;
+- 
+--import java.lang.reflect.Method;
+--import java.io.IOException;
+--import java.io.InputStream;
+- import java.io.PrintStream;
+-+import java.lang.reflect.Method;
+- import java.util.ArrayList;
+- import java.util.Enumeration;
+- import java.util.HashMap;
+- import java.util.HashSet;
+--import java.util.Properties;
+- import java.util.Stack;
+--import java.security.AccessController;
+--import java.security.PrivilegedActionException;
+--import java.security.PrivilegedExceptionAction;
+--import javax.servlet.Servlet;
+--import javax.servlet.ServletConfig;
+--import javax.servlet.ServletContext;
+--import javax.servlet.ServletException;
+--import javax.servlet.ServletRequest;
+--import javax.servlet.ServletResponse;
+--import javax.servlet.SingleThreadModel;
+--import javax.servlet.UnavailableException;
+-+
+- import javax.management.ListenerNotFoundException;
+- import javax.management.MBeanNotificationInfo;
+- import javax.management.Notification;
+-@@ -47,6 +34,14 @@
+- import javax.management.NotificationFilter;
+- import javax.management.NotificationListener;
+- import javax.management.ObjectName;
+-+import javax.servlet.Servlet;
+-+import javax.servlet.ServletConfig;
+-+import javax.servlet.ServletContext;
+-+import javax.servlet.ServletException;
+-+import javax.servlet.ServletRequest;
+-+import javax.servlet.ServletResponse;
+-+import javax.servlet.SingleThreadModel;
+-+import javax.servlet.UnavailableException;
+- 
+- import org.apache.PeriodicEventListener;
+- import org.apache.catalina.Container;
+-@@ -56,8 +51,8 @@
+- import org.apache.catalina.InstanceEvent;
+- import org.apache.catalina.InstanceListener;
+- import org.apache.catalina.LifecycleException;
+--import org.apache.catalina.Loader;
+- import org.apache.catalina.Wrapper;
+-+import org.apache.InstanceManager;
+- import org.apache.catalina.security.SecurityUtil;
+- import org.apache.catalina.util.Enumerator;
+- import org.apache.catalina.util.InstanceSupport;
+-@@ -96,22 +91,6 @@
+-         pipeline.setBasic(swValve);
+-         broadcaster = new NotificationBroadcasterSupport();
+- 
+--        if (restrictedServlets == null) {
+--            restrictedServlets = new Properties();
+--            try {
+--                InputStream is = 
+--                    this.getClass().getClassLoader().getResourceAsStream
+--                        ("org/apache/catalina/core/RestrictedServlets.properties");
+--                if (is != null) {
+--                    restrictedServlets.load(is);
+--                } else {
+--                    log.error(sm.getString("standardWrapper.restrictedServletsResource"));
+--                }
+--            } catch (IOException e) {
+--                log.error(sm.getString("standardWrapper.restrictedServletsResource"), e);
+--            }
+ -        }
+--        
+-     }
+  
+- 
+-@@ -287,12 +266,7 @@
+-                                                          ServletRequest.class,
+-                                                          ServletResponse.class};
+-     
+--    /**
+--     * Restricted servlets (which can only be loaded by a privileged webapp).
+--     */
+--    protected static Properties restrictedServlets = null;
+--    
+--    
+-+
+-     // ------------------------------------------------------------- Properties
+- 
+- 
+-@@ -1043,83 +1017,9 @@
+-                     (sm.getString("standardWrapper.notClass", getName()));
+-             }
+- 
+--            // Acquire an instance of the class loader to be used
+--            Loader loader = getLoader();
+--            if (loader == null) {
+--                unavailable(null);
+--                throw new ServletException
+--                    (sm.getString("standardWrapper.missingLoader", getName()));
+--            }
+--
+--            ClassLoader classLoader = loader.getClassLoader();
+--
+--            // Special case class loader for a container provided servlet
+--            //  
+--            if (isContainerProvidedServlet(actualClass) && 
+--                    ! ((Context)getParent()).getPrivileged() ) {
+--                // If it is a priviledged context - using its own
+--                // class loader will work, since it's a child of the container
+--                // loader
+--                classLoader = this.getClass().getClassLoader();
+--            }
+--
+--            // Load the specified servlet class from the appropriate class loader
+--            Class classClass = null;
+-+            InstanceManager instanceManager = ((StandardContext)getParent()).getInstanceManager();
+-             try {
+--                if (SecurityUtil.isPackageProtectionEnabled()){
+--                    final ClassLoader fclassLoader = classLoader;
+--                    final String factualClass = actualClass;
+--                    try{
+--                        classClass = (Class)AccessController.doPrivileged(
+--                                new PrivilegedExceptionAction(){
+--                                    public Object run() throws Exception{
+--                                        if (fclassLoader != null) {
+--                                            return fclassLoader.loadClass(factualClass);
+--                                        } else {
+--                                            return Class.forName(factualClass);
+--                                        }
+--                                    }
+--                        });
+--                    } catch(PrivilegedActionException pax){
+--                        Exception ex = pax.getException();
+--                        if (ex instanceof ClassNotFoundException){
+--                            throw (ClassNotFoundException)ex;
+--                        } else {
+--                            getServletContext().log( "Error loading "
+--                                + fclassLoader + " " + factualClass, ex );
+--                        }
+--                    }
+--                } else {
+--                    if (classLoader != null) {
+--                        classClass = classLoader.loadClass(actualClass);
+--                    } else {
+--                        classClass = Class.forName(actualClass);
+--                    }
+--                }
+--            } catch (ClassNotFoundException e) {
+--                unavailable(null);
+--                getServletContext().log( "Error loading " + classLoader + " " + actualClass, e );
+--                throw new ServletException
+--                    (sm.getString("standardWrapper.missingClass", actualClass),
+--                     e);
+--            }
+--
+--            if (classClass == null) {
+--                unavailable(null);
+--                throw new ServletException
+--                    (sm.getString("standardWrapper.missingClass", actualClass));
+--            }
+--
+--            // Instantiate and initialize an instance of the servlet class itself
+--            try {
+--                servlet = (Servlet) classClass.newInstance();
+--                // Annotation processing
+--                if (!((Context) getParent()).getIgnoreAnnotations()) {
+--                    if (getParent() instanceof StandardContext) {
+--                       ((StandardContext)getParent()).getAnnotationProcessor().processAnnotations(servlet);
+--                       ((StandardContext)getParent()).getAnnotationProcessor().postConstruct(servlet);
+--                    }
+--                }
+-+                servlet = (Servlet) instanceManager.newInstance(actualClass);
+-             } catch (ClassCastException e) {
+-                 unavailable(null);
+-                 // Restore the context ClassLoader
+-@@ -1127,7 +1027,7 @@
+-                     (sm.getString("standardWrapper.notServlet", actualClass), e);
+-             } catch (Throwable e) {
+-                 unavailable(null);
+--              
+-+
+-                 // Added extra log statement for Bugzilla 36630:
+-                 // http://issues.apache.org/bugzilla/show_bug.cgi?id=36630
+-                 if(log.isDebugEnabled()) {
+-@@ -1139,14 +1039,6 @@
+-                     (sm.getString("standardWrapper.instantiate", actualClass), e);
+-             }
+- 
+--            // Check if loading the servlet in this web application should be
+--            // allowed
+--            if (!isServletAllowed(servlet)) {
+--                throw new SecurityException
+--                    (sm.getString("standardWrapper.privilegedServlet",
+--                                  actualClass));
+--            }
+--
+-             // Special handling for ContainerServlet instances
+-             if ((servlet instanceof ContainerServlet) &&
+-                   (isContainerProvidedServlet(actualClass) ||
+-@@ -1398,7 +1290,7 @@
+- 
+-             // Annotation processing
+-             if (!((Context) getParent()).getIgnoreAnnotations()) {
+--               ((StandardContext)getParent()).getAnnotationProcessor().preDestroy(instance);
+-+               ((StandardContext)getParent()).getInstanceManager().destroyInstance(instance);
+-             }
+- 
+-         } catch (Throwable t) {
+-@@ -1441,7 +1333,7 @@
+-                     }
+-                     // Annotation processing
+-                     if (!((Context) getParent()).getIgnoreAnnotations()) {
+--                       ((StandardContext)getParent()).getAnnotationProcessor().preDestroy(s);
+-+                       ((StandardContext)getParent()).getInstanceManager().destroyInstance(s);
+-                     }
++-        // Initialize methods annotations
++-        Method[] methods = instance.getClass().getDeclaredMethods();
++-        for (Method method : methods) {
++-            String methodName = method.getName();
++-            if (injections != null && methodName.startsWith("set") && methodName.length() > 3) {
++-                String fieldName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
++-                if (injections.containsKey(fieldName)) {
++-                    lookupMethodResource(context, instance, method, injections.get(fieldName));
++-                    break;
+++            // Initialize methods annotations
+++            Method[] methods = instance.getClass().getDeclaredMethods();
+++            for (Method method : methods) {
+++                String methodName = method.getName();
+++                if (injections != null && methodName.startsWith("set") && methodName.length() > 3) {
+++                    String fieldName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
+++                    if (injections.containsKey(fieldName)) {
+++                        lookupMethodResource(context, instance, method, injections.get(fieldName));
+++                        break;
+++                    }
+                  }
+-             } catch (Throwable t) {
+-@@ -1619,33 +1511,6 @@
+-     }
+- 
+- 
+--    /**
+--     * Return <code>true</code> if loading this servlet is allowed.
+--     */
+--    protected boolean isServletAllowed(Object servlet) {
+--
+--        // Privileged webapps may load all servlets without restriction
+--        if (((Context) getParent()).getPrivileged()) {
+--            return true;
+--        }
+--        
+--        if (servlet instanceof ContainerServlet) {
+--            return (false);
+--        }
+--
+--        Class clazz = servlet.getClass();
+--        while (clazz != null && !clazz.getName().equals("javax.servlet.http.HttpServlet")) {
+--            if ("restricted".equals(restrictedServlets.getProperty(clazz.getName()))) {
+--                return (false);
+ -            }
+--            clazz = clazz.getSuperclass();
+--        }
+--        
+--        return (true);
+--
+--    }
+--
+--
+-     protected Method[] getAllDeclaredMethods(Class c) {
+- 
+-         if (c.equals(javax.servlet.http.HttpServlet.class)) {
+-Index: java/org/apache/catalina/core/StandardContext.java
+-===================================================================
+---- java/org/apache/catalina/core/StandardContext.java	(revision 3168)
+-+++ java/org/apache/catalina/core/StandardContext.java	(working copy)
+-@@ -31,6 +31,8 @@
+- import java.util.HashMap;
+- import java.util.Hashtable;
+- import java.util.Iterator;
+-+import java.util.List;
+-+import java.util.Map;
+- import java.util.Stack;
+- import java.util.TreeMap;
+- 
+-@@ -59,7 +61,7 @@
+- import javax.servlet.http.HttpSessionAttributeListener;
+- import javax.servlet.http.HttpSessionListener;
+- 
+--import org.apache.AnnotationProcessor;
+-+import org.apache.InstanceManager;
+- import org.apache.catalina.Container;
+- import org.apache.catalina.ContainerListener;
+- import org.apache.catalina.Context;
+-@@ -77,6 +79,8 @@
+- import org.apache.catalina.deploy.ErrorPage;
+- import org.apache.catalina.deploy.FilterDef;
+- import org.apache.catalina.deploy.FilterMap;
+-+import org.apache.catalina.deploy.Injectable;
+-+import org.apache.catalina.deploy.InjectionTarget;
+- import org.apache.catalina.deploy.LoginConfig;
+- import org.apache.catalina.deploy.MessageDestination;
+- import org.apache.catalina.deploy.MessageDestinationRef;
+-@@ -88,7 +92,6 @@
+- import org.apache.catalina.startup.ContextConfig;
+- import org.apache.catalina.startup.TldConfig;
+- import org.apache.catalina.util.CharsetMapper;
+--import org.apache.catalina.util.DefaultAnnotationProcessor;
+- import org.apache.catalina.util.ExtensionValidator;
+- import org.apache.catalina.util.RequestUtil;
+- import org.apache.catalina.util.URLEncoder;
+-@@ -174,9 +177,9 @@
+- 
+- 
+-     /**
+--     * Annotation processor.
+-+     * Lifecycle provider.
+-      */
+--    private AnnotationProcessor annotationProcessor = null;
+-+    private InstanceManager instanceManager = null;
+- 
+- 
+-    /**
+-@@ -679,13 +682,13 @@
+-     // ----------------------------------------------------- Context Properties
+- 
+- 
+--    public AnnotationProcessor getAnnotationProcessor() {
+--       return annotationProcessor;
+-+    public InstanceManager getInstanceManager() {
+-+       return instanceManager;
+-     }
+- 
+- 
+--    public void setAnnotationProcessor(AnnotationProcessor annotationProcessor) {
+--       this.annotationProcessor = annotationProcessor;
+-+    public void setInstanceManager(InstanceManager instanceManager) {
+-+       this.instanceManager = instanceManager;
+-     }
+- 
+-     
+-@@ -3774,7 +3777,6 @@
+-             log.debug("Configuring application event listeners");
+- 
+-         // Instantiate the required listeners
+--        ClassLoader loader = getLoader().getClassLoader();
+-         String listeners[] = findApplicationListeners();
+-         Object results[] = new Object[listeners.length];
+-         boolean ok = true;
+-@@ -3783,13 +3785,7 @@
+-                 getLogger().debug(" Configuring event listener class '" +
+-                     listeners[i] + "'");
+-             try {
+--                Class clazz = loader.loadClass(listeners[i]);
+--                results[i] = clazz.newInstance();
+--                // Annotation processing
+--                if (!getIgnoreAnnotations()) {
+--                    getAnnotationProcessor().processAnnotations(results[i]);
+--                    getAnnotationProcessor().postConstruct(results[i]);
+--                }
+-+                results[i] = instanceManager.newInstance(listeners[i]);
+-             } catch (Throwable t) {
+-                 getLogger().error
+-                     (sm.getString("standardContext.applicationListener",
+-@@ -3889,29 +3885,26 @@
+-                         ok = false;
+-                     }
+-                 }
+--                // Annotation processing
+--                if (!getIgnoreAnnotations()) {
+--                    try {
+--                        getAnnotationProcessor().preDestroy(listeners[j]);
+--                    } catch (Throwable t) {
+--                        getLogger().error
+--                            (sm.getString("standardContext.listenerStop",
+--                                listeners[j].getClass().getName()), t);
+--                        ok = false;
+--                    }
+-+                try {
+-+                    getInstanceManager().destroyInstance(listeners[j]);
+-+                } catch (Throwable t) {
+-+                    getLogger().error
+-+                       (sm.getString("standardContext.listenerStop",
+-+                            listeners[j].getClass().getName()), t);
+-+                    ok = false;
+-                 }
++-            if (method.isAnnotationPresent(Resource.class)) {
++-                Resource annotation = method.getAnnotation(Resource.class);
++-                lookupMethodResource(context, instance, method, annotation.name());
++-            } else if (method.isAnnotationPresent(EJB.class)) {
++-                EJB annotation = method.getAnnotation(EJB.class);
++-                lookupMethodResource(context, instance, method, annotation.name());
++-            } else if (method.isAnnotationPresent(WebServiceRef.class)) {
++-                WebServiceRef annotation =
+++                if (method.isAnnotationPresent(Resource.class)) {
+++                    Resource annotation = method.getAnnotation(Resource.class);
+++                    lookupMethodResource(context, instance, method, annotation.name());
+++                } else if (method.isAnnotationPresent(EJB.class)) {
+++                    EJB annotation = method.getAnnotation(EJB.class);
+++                    lookupMethodResource(context, instance, method, annotation.name());
+++                } else if (method.isAnnotationPresent(WebServiceRef.class)) {
+++                    WebServiceRef annotation =
++                         method.getAnnotation(WebServiceRef.class);
++-                lookupMethodResource(context, instance, method, annotation.name());
++-            } else if (method.isAnnotationPresent(PersistenceContext.class)) {
++-                PersistenceContext annotation =
+++                    lookupMethodResource(context, instance, method, annotation.name());
+++                } else if (method.isAnnotationPresent(PersistenceContext.class)) {
+++                    PersistenceContext annotation =
++                         method.getAnnotation(PersistenceContext.class);
++-                lookupMethodResource(context, instance, method, annotation.name());
++-            } else if (method.isAnnotationPresent(PersistenceUnit.class)) {
++-                PersistenceUnit annotation =
+++                    lookupMethodResource(context, instance, method, annotation.name());
+++                } else if (method.isAnnotationPresent(PersistenceUnit.class)) {
+++                    PersistenceUnit annotation =
++                         method.getAnnotation(PersistenceUnit.class);
++-                lookupMethodResource(context, instance, method, annotation.name());
+++                    lookupMethodResource(context, instance, method, annotation.name());
+++                }
+              }
+-         }
+- 
+-         // Annotation processing
+-         listeners = getApplicationEventListeners();
+--        if (!getIgnoreAnnotations() && listeners != null) {
+-+        if (listeners != null) {
+-             for (int i = 0; i < listeners.length; i++) {
+-                 int j = (listeners.length - 1) - i;
+-                 if (listeners[j] == null)
+-                     continue;
+-                 try {
+--                    getAnnotationProcessor().preDestroy(listeners[j]);
+-+                    getInstanceManager().destroyInstance(listeners[j]);
+-                 } catch (Throwable t) {
+-                     getLogger().error
+-                         (sm.getString("standardContext.listenerStop",
+-@@ -4308,21 +4301,18 @@
+-         // Binding thread
+-         oldCCL = bindThread();
+- 
+--        // Set annotation processing parameter for Jasper (unfortunately, since
+--        // this can be configured in many places and not just in /WEB-INF/web.xml,
+--        // there are not many solutions)
+--        // Initialize annotation processor

[... 1099 lines stripped ...]