You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ke...@apache.org on 2007/06/03 03:05:45 UTC

svn commit: r543818 [2/2] - in /geronimo/sandbox/kevan: ./ tomcat-patches/ tomcat-patches/TOMCAT-6.0.13.patch

Added: geronimo/sandbox/kevan/tomcat-patches/TOMCAT-6.0.13.patch
URL: http://svn.apache.org/viewvc/geronimo/sandbox/kevan/tomcat-patches/TOMCAT-6.0.13.patch?view=auto&rev=543818
==============================================================================
--- geronimo/sandbox/kevan/tomcat-patches/TOMCAT-6.0.13.patch (added)
+++ geronimo/sandbox/kevan/tomcat-patches/TOMCAT-6.0.13.patch Sat Jun  2 18:05:44 2007
@@ -0,0 +1,2165 @@
+Index: java/org/apache/jasper/JspCompilationContext.java
+===================================================================
+--- java/org/apache/jasper/JspCompilationContext.java	(revision 543812)
++++ java/org/apache/jasper/JspCompilationContext.java	(working copy)
+@@ -589,12 +589,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"),
+@@ -607,6 +602,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 543812)
++++ 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 @@
+         }
+         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 543812)
++++ 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$, $Date$
+- */
+-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/servlet/JspServletWrapper.java
+===================================================================
+--- java/org/apache/jasper/servlet/JspServletWrapper.java	(revision 543812)
++++ 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) {
+@@ -442,15 +437,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 543812)
++++ java/org/apache/jasper/Constants.java	(working copy)
+@@ -193,4 +193,7 @@
+     public static final boolean IS_SECURITY_ENABLED = 
+         (System.getSecurityManager() != null);
+ 
++    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 543812)
++++ 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;
+ 
+@@ -410,14 +410,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("}");
+@@ -521,8 +521,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();
+     }
+@@ -2142,11 +2142,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(") ");
+@@ -2155,14 +2155,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
+@@ -2220,8 +2213,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();");
+ 
+@@ -2247,6 +2239,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) {
+ 
+@@ -2308,11 +2334,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) {
+@@ -2355,11 +2377,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()) {
+@@ -2391,21 +2409,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)
+@@ -2458,11 +2463,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 543812)
++++ 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$
+- */
+-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/ApplicationFilterConfig.java
+===================================================================
+--- java/org/apache/catalina/core/ApplicationFilterConfig.java	(revision 543812)
++++ 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 543812)
++++ 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
+ 
+ 
+@@ -1032,83 +1006,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
+@@ -1116,7 +1016,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()) {
+@@ -1128,14 +1028,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) ||
+@@ -1387,7 +1279,7 @@
+ 
+             // Annotation processing
+             if (!((Context) getParent()).getIgnoreAnnotations()) {
+-               ((StandardContext)getParent()).getAnnotationProcessor().preDestroy(instance);
++               ((StandardContext)getParent()).getInstanceManager().destroyInstance(instance);
+             }
+ 
+         } catch (Throwable t) {
+@@ -1430,7 +1322,7 @@
+                     }
+                     // Annotation processing
+                     if (!((Context) getParent()).getIgnoreAnnotations()) {
+-                       ((StandardContext)getParent()).getAnnotationProcessor().preDestroy(s);
++                       ((StandardContext)getParent()).getInstanceManager().destroyInstance(s);
+                     }
+                 }
+             } catch (Throwable t) {
+@@ -1608,33 +1500,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 543812)
++++ 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;
+     }
+ 
+     
+@@ -3758,7 +3761,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;
+@@ -3767,13 +3769,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",
+@@ -3873,29 +3869,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;
+                 }
+             }
+         }
+ 
+         // 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",
+@@ -4300,21 +4293,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
+-        if (ok && !getIgnoreAnnotations()) {
+-            if (annotationProcessor == null) {
++        if (ok ) {
++            if (instanceManager == null) {
++                javax.naming.Context context = null;
+                 if (isUseNaming() && namingContextListener != null) {
+-                    annotationProcessor = 
+-                        new DefaultAnnotationProcessor(namingContextListener.getEnvContext());
+-                } else {
+-                    annotationProcessor = new DefaultAnnotationProcessor(null);
++                    context = namingContextListener.getEnvContext();
+                 }
++                Map<String, Map<String, String>> injectionMap = 
++                	buildInjectionMap(getIgnoreAnnotations() ? new NamingResources(): getNamingResources());
++                instanceManager = new DefaultInstanceManager
++                	(context, injectionMap, this, this.getClass().getClassLoader());
++                getServletContext().setAttribute(InstanceManager.class.getName(), instanceManager);
+             }
+-            getServletContext().setAttribute
+-                (AnnotationProcessor.class.getName(), annotationProcessor);
+         }
+ 
+         try {
+@@ -4395,6 +4385,48 @@
+         //cacheContext();
+     }
+ 
++    private Map<String, Map<String, String>> buildInjectionMap(NamingResources namingResources) {
++        Map<String, Map<String, String>> injectionMap = new HashMap<String, Map<String, String>>();
++        for (Injectable resource: namingResources.findLocalEjbs()) {
++            addInjectionTarget(resource, injectionMap);
++        }
++        for (Injectable resource: namingResources.findEjbs()) {
++            addInjectionTarget(resource, injectionMap);
++        }
++        for (Injectable resource: namingResources.findEnvironments()) {
++            addInjectionTarget(resource, injectionMap);
++        }
++        for (Injectable resource: namingResources.findMessageDestinationRefs()) {
++            addInjectionTarget(resource, injectionMap);
++        }
++        for (Injectable resource: namingResources.findResourceEnvRefs()) {
++            addInjectionTarget(resource, injectionMap);
++        }
++        for (Injectable resource: namingResources.findResources()) {
++            addInjectionTarget(resource, injectionMap);
++        }
++        for (Injectable resource: namingResources.findServices()) {
++            addInjectionTarget(resource, injectionMap);
++        }
++        return injectionMap;
++    }
++
++    private void addInjectionTarget(Injectable resource, Map<String, Map<String, String>> injectionMap) {
++        List<InjectionTarget> injectionTargets = resource.getInjectionTargets();
++        if (injectionTargets != null && injectionTargets.size() > 0) {
++            String jndiName = resource.getName();
++            for (InjectionTarget injectionTarget: injectionTargets) {
++                String clazz = injectionTarget.getTargetClass();
++                Map<String, String> injections = injectionMap.get(clazz);
++                if (injections == null) {
++                    injections = new HashMap<String, String>();
++                    injectionMap.put(clazz, injections);
++                }
++                injections.put(injectionTarget.getTargetName(), jndiName);
++            }
++        }
++    }
++
+     /**
+      * Processes TLDs.
+      *
+Index: java/org/apache/catalina/core/LocalStrings.properties
+===================================================================
+--- java/org/apache/catalina/core/LocalStrings.properties	(revision 543812)
++++ java/org/apache/catalina/core/LocalStrings.properties	(working copy)
+@@ -185,7 +185,6 @@
+ standardWrapper.notContext=Parent container of a Wrapper must be a Context
+ standardWrapper.notFound=Servlet {0} is not available
+ standardWrapper.notServlet=Class {0} is not a Servlet
+-standardWrapper.privilegedServlet=Servlet of class {0} is privileged and cannot be loaded by this web application
+ standardWrapper.releaseFilters=Release filters exception for servlet {0}
+ standardWrapper.serviceException=Servlet.service() for servlet {0} threw exception
+ standardWrapper.statusHeader=HTTP Status {0} - {1}
+@@ -194,7 +193,9 @@
+ standardWrapper.unloadException=Servlet {0} threw unload() exception
+ standardWrapper.unloading=Cannot allocate servlet {0} because it is being unloaded
+ standardWrapper.waiting=Waiting for {0} instance(s) to be deallocated
+-standardWrapper.restrictedServletsResource=Restricted servlets property file not found
+ 
+-applicationFilterConfig.restrictedFiltersResource=Restricted filters property file not found
+-applicationFilterConfig.privilegedFilter=Filter of class {0} is privileged and cannot be loaded by this web application
++defaultInstanceManager.restrictedServletsResource=Restricted servlets property file not found
++defaultInstanceManager.privilegedServlet=Servlet of class {0} is privileged and cannot be loaded by this web application
++defaultInstanceManager.restrictedFiltersResource=Restricted filters property file not found
++defaultInstanceManager.privilegedFilter=Filter of class {0} is privileged and cannot be loaded by this web application
++defaultInstanceManager.restrictedListenersResources="Restricted listeners property file not found
+\ No newline at end of file
+Index: java/org/apache/catalina/core/mbeans-descriptors.xml
+===================================================================
+--- java/org/apache/catalina/core/mbeans-descriptors.xml	(revision 543812)
++++ java/org/apache/catalina/core/mbeans-descriptors.xml	(working copy)
+@@ -25,9 +25,9 @@
+                is="true"
+                type="boolean"/>
+       
+-     <attribute name="annotationProcessor"
+-                description="Object that processes things like injection annotations"
+-                type="org.apache.AnnotationProcessor" />
++    <attribute name="instanceManager"
++                description="Object that creates and destroys servlets, filters, and listeners. Include dependency injection and postConstruct/preDestory handling"
++                type="org.apache.catalina.instanceManagement.InstanceManager" />
+ 
+     <attribute name="antiJARLocking"
+                description="Take care to not lock jar files"
+Index: java/org/apache/catalina/deploy/ContextEnvironment.java
+===================================================================
+--- java/org/apache/catalina/deploy/ContextEnvironment.java	(revision 543812)
++++ java/org/apache/catalina/deploy/ContextEnvironment.java	(working copy)
+@@ -19,6 +19,8 @@
+ package org.apache.catalina.deploy;
+ 
+ import java.io.Serializable;
++import java.util.ArrayList;
++import java.util.List;
+ 
+ 
+ /**
+@@ -29,7 +31,7 @@
+  * @version $Revision$ $Date$
+  */
+ 
+-public class ContextEnvironment implements Serializable {
++public class ContextEnvironment implements Serializable, Injectable {
+ 
+ 
+     // ------------------------------------------------------------- Properties
+@@ -105,6 +107,18 @@
+         this.value = value;
+     }
+ 
++
++    private List<InjectionTarget> injectionTargets = new ArrayList<InjectionTarget>();
++
++    public void addInjectionTarget(String injectionTargetName, String jndiName) {
++        InjectionTarget target = new InjectionTarget(injectionTargetName, jndiName);
++        injectionTargets.add(target);
++    }
++
++    public List<InjectionTarget> getInjectionTargets() {
++        return injectionTargets;
++    }
++
+     // --------------------------------------------------------- Public Methods
+ 
+ 
+Index: java/org/apache/catalina/deploy/ResourceBase.java
+===================================================================
+--- java/org/apache/catalina/deploy/ResourceBase.java	(revision 543812)
++++ java/org/apache/catalina/deploy/ResourceBase.java	(working copy)
+@@ -21,6 +21,8 @@
+ import java.io.Serializable;
+ import java.util.Iterator;
+ import java.util.HashMap;
++import java.util.List;
++import java.util.ArrayList;
+ 
+ 
+ /**
+@@ -30,7 +32,7 @@
+  * @version $Revision$ $Date$
+  */
+ 
+-public class ResourceBase implements Serializable {
++public class ResourceBase implements Serializable, Injectable {
+ 
+ 
+     // ------------------------------------------------------------- Properties
+@@ -111,8 +113,18 @@
+     public Iterator listProperties() {
+         return properties.keySet().iterator();
+     }
+-    
+-    
++
++    private List<InjectionTarget> injectionTargets = new ArrayList<InjectionTarget>();
++
++    public void addInjectionTarget(String injectionTargetName, String jndiName) {
++        InjectionTarget target = new InjectionTarget(injectionTargetName, jndiName);
++        injectionTargets.add(target);
++    }
++
++    public List<InjectionTarget> getInjectionTargets() {
++        return injectionTargets;
++    }
++
+     // -------------------------------------------------------- Package Methods
+ 
+ 
+Index: java/org/apache/catalina/deploy/MessageDestinationRef.java
+===================================================================
+--- java/org/apache/catalina/deploy/MessageDestinationRef.java	(revision 543812)
++++ java/org/apache/catalina/deploy/MessageDestinationRef.java	(working copy)
+@@ -19,6 +19,8 @@
+ package org.apache.catalina.deploy;
+ 
+ import java.io.Serializable;
++import java.util.ArrayList;
++import java.util.List;
+ 
+ 
+ /**
+@@ -31,7 +33,7 @@
+  * @since Tomcat 5.0
+  */
+ 
+-public class MessageDestinationRef implements Serializable {
++public class MessageDestinationRef implements Serializable, Injectable {
+ 
+ 
+     // ------------------------------------------------------------- Properties
+@@ -106,7 +108,17 @@
+         this.usage = usage;
+     }
+ 
++    private List<InjectionTarget> injectionTargets = new ArrayList<InjectionTarget>();
+ 
++    public void addInjectionTarget(String injectionTargetName, String jndiName) {
++        InjectionTarget target = new InjectionTarget(injectionTargetName, jndiName);
++        injectionTargets.add(target);
++    }
++
++    public List<InjectionTarget> getInjectionTargets() {
++        return injectionTargets;
++    }
++
+     // --------------------------------------------------------- Public Methods
+ 
+ 
+Index: java/org/apache/catalina/startup/ConnectorCreateRule.java
+===================================================================
+--- java/org/apache/catalina/startup/ConnectorCreateRule.java	(revision 543812)
++++ java/org/apache/catalina/startup/ConnectorCreateRule.java	(working copy)
+@@ -20,13 +20,12 @@
+ package org.apache.catalina.startup;
+ 
+ 
++import org.apache.catalina.Executor;
++import org.apache.catalina.Service;
+ import org.apache.catalina.connector.Connector;
++import org.apache.tomcat.util.IntrospectionUtils;
+ import org.apache.tomcat.util.digester.Rule;
+ import org.xml.sax.Attributes;
+-import org.apache.catalina.Service;
+-import org.apache.catalina.Executor;
+-import org.apache.tomcat.util.IntrospectionUtils;
+-import java.lang.reflect.Method;
+ 
+ 
+ /**
+@@ -51,14 +50,14 @@
+             ex = svc.getExecutor(attributes.getValue("executor"));
+         }
+         Connector con = new Connector(attributes.getValue("protocol"));
+-        if ( ex != null )  _setExecutor(con,ex);
++        if ( ex != null )  setExecutor(con,ex);
+         
+         digester.push(con);
+     }
+     
+-    public void _setExecutor(Connector con, Executor ex) throws Exception {
+-        Method m = IntrospectionUtils.findMethod(con.getProtocolHandler().getClass(),"setExecutor",new Class[] {java.util.concurrent.Executor.class});
+-        m.invoke(con.getProtocolHandler(),new Object[] {ex});
++    public void setExecutor(Connector con, Executor ex) throws Exception {
++    	IntrospectionUtils.callMethod1(con.getProtocolHandler(), "setExecutor", 
++    			ex, java.util.concurrent.Executor.class.getName(), getClass().getClassLoader());
+     }
+ 
+ 
+@@ -66,7 +65,7 @@
+      * Process the end of this element.
+      */
+     public void end() throws Exception {
+-        Object top = digester.pop();
++        digester.pop();
+     }
+ 
+ 
+Index: java/org/apache/catalina/startup/WebRuleSet.java
+===================================================================
+--- java/org/apache/catalina/startup/WebRuleSet.java	(revision 543812)
++++ java/org/apache/catalina/startup/WebRuleSet.java	(working copy)
+@@ -24,6 +24,8 @@
+ 
+ import org.apache.catalina.Context;
+ import org.apache.catalina.Wrapper;
++import org.apache.catalina.deploy.ContextHandler;
++import org.apache.catalina.deploy.ContextService;
+ import org.apache.catalina.deploy.SecurityConstraint;
+ import org.apache.tomcat.util.IntrospectionUtils;
+ import org.apache.tomcat.util.digester.CallMethodRule;
+@@ -136,59 +138,8 @@
+         digester.addRule(prefix + "web-app/distributable",
+                          new SetDistributableRule());
+ 
+-        digester.addObjectCreate(prefix + "web-app/ejb-local-ref",
+-                                 "org.apache.catalina.deploy.ContextLocalEjb");
+-        digester.addRule(prefix + "web-app/ejb-local-ref",
+-                new SetNextNamingRule("addLocalEjb",
+-                            "org.apache.catalina.deploy.ContextLocalEjb"));
++        configureNamingRules(digester);
+ 
+-        digester.addCallMethod(prefix + "web-app/ejb-local-ref/description",
+-                               "setDescription", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-local-ref/ejb-link",
+-                               "setLink", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-local-ref/ejb-ref-name",
+-                               "setName", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-local-ref/ejb-ref-type",
+-                               "setType", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-local-ref/local",
+-                               "setLocal", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-local-ref/local-home",
+-                               "setHome", 0);
+-
+-        digester.addObjectCreate(prefix + "web-app/ejb-ref",
+-                                 "org.apache.catalina.deploy.ContextEjb");
+-        digester.addRule(prefix + "web-app/ejb-ref",
+-                new SetNextNamingRule("addEjb",
+-                            "org.apache.catalina.deploy.ContextEjb"));
+-
+-        digester.addCallMethod(prefix + "web-app/ejb-ref/description",
+-                               "setDescription", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-ref/ejb-link",
+-                               "setLink", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-ref/ejb-ref-name",
+-                               "setName", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-ref/ejb-ref-type",
+-                               "setType", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-ref/home",
+-                               "setHome", 0);
+-        digester.addCallMethod(prefix + "web-app/ejb-ref/remote",
+-                               "setRemote", 0);
+-
+-        digester.addObjectCreate(prefix + "web-app/env-entry",
+-                                 "org.apache.catalina.deploy.ContextEnvironment");
+-        digester.addRule(prefix + "web-app/env-entry",
+-                new SetNextNamingRule("addEnvironment",
+-                            "org.apache.catalina.deploy.ContextEnvironment"));
+-
+-        digester.addCallMethod(prefix + "web-app/env-entry/description",
+-                               "setDescription", 0);
+-        digester.addCallMethod(prefix + "web-app/env-entry/env-entry-name",
+-                               "setName", 0);
+-        digester.addCallMethod(prefix + "web-app/env-entry/env-entry-type",
+-                               "setType", 0);
+-        digester.addCallMethod(prefix + "web-app/env-entry/env-entry-value",
+-                               "setValue", 0);
+-
+         digester.addObjectCreate(prefix + "web-app/error-page",
+                                  "org.apache.catalina.deploy.ErrorPage");
+         digester.addSetNext(prefix + "web-app/error-page",
+@@ -279,6 +230,156 @@
+         digester.addCallParam(prefix + "web-app/mime-mapping/extension", 0);
+         digester.addCallParam(prefix + "web-app/mime-mapping/mime-type", 1);
+ 
++
++        digester.addObjectCreate(prefix + "web-app/security-constraint",
++                                 "org.apache.catalina.deploy.SecurityConstraint");
++        digester.addSetNext(prefix + "web-app/security-constraint",
++                            "addConstraint",
++                            "org.apache.catalina.deploy.SecurityConstraint");
++
++        digester.addRule(prefix + "web-app/security-constraint/auth-constraint",
++                         new SetAuthConstraintRule());
++        digester.addCallMethod(prefix + "web-app/security-constraint/auth-constraint/role-name",
++                               "addAuthRole", 0);
++        digester.addCallMethod(prefix + "web-app/security-constraint/display-name",
++                               "setDisplayName", 0);
++        digester.addCallMethod(prefix + "web-app/security-constraint/user-data-constraint/transport-guarantee",
++                               "setUserConstraint", 0);
++
++        digester.addObjectCreate(prefix + "web-app/security-constraint/web-resource-collection",
++                                 "org.apache.catalina.deploy.SecurityCollection");
++        digester.addSetNext(prefix + "web-app/security-constraint/web-resource-collection",
++                            "addCollection",
++                            "org.apache.catalina.deploy.SecurityCollection");
++        digester.addCallMethod(prefix + "web-app/security-constraint/web-resource-collection/http-method",
++                               "addMethod", 0);
++        digester.addCallMethod(prefix + "web-app/security-constraint/web-resource-collection/url-pattern",
++                               "addPattern", 0);
++        digester.addCallMethod(prefix + "web-app/security-constraint/web-resource-collection/web-resource-name",
++                               "setName", 0);
++
++        digester.addCallMethod(prefix + "web-app/security-role/role-name",
++                               "addSecurityRole", 0);
++
++        digester.addRule(prefix + "web-app/servlet",
++                         new WrapperCreateRule());
++        digester.addSetNext(prefix + "web-app/servlet",
++                            "addChild",
++                            "org.apache.catalina.Container");
++
++        digester.addCallMethod(prefix + "web-app/servlet/init-param",
++                               "addInitParameter", 2);
++        digester.addCallParam(prefix + "web-app/servlet/init-param/param-name",
++                              0);
++        digester.addCallParam(prefix + "web-app/servlet/init-param/param-value",
++                              1);
++
++        digester.addCallMethod(prefix + "web-app/servlet/jsp-file",
++                               "setJspFile", 0);
++        digester.addCallMethod(prefix + "web-app/servlet/load-on-startup",
++                               "setLoadOnStartupString", 0);
++        digester.addCallMethod(prefix + "web-app/servlet/run-as/role-name",
++                               "setRunAs", 0);
++
++        digester.addCallMethod(prefix + "web-app/servlet/security-role-ref",
++                               "addSecurityReference", 2);
++        digester.addCallParam(prefix + "web-app/servlet/security-role-ref/role-link", 1);
++        digester.addCallParam(prefix + "web-app/servlet/security-role-ref/role-name", 0);
++
++        digester.addCallMethod(prefix + "web-app/servlet/servlet-class",
++                              "setServletClass", 0);
++        digester.addCallMethod(prefix + "web-app/servlet/servlet-name",
++                              "setName", 0);
++
++        digester.addRule(prefix + "web-app/servlet-mapping",
++                               new CallMethodMultiRule("addServletMapping", 2, 0));
++        digester.addCallParam(prefix + "web-app/servlet-mapping/servlet-name", 1);
++        digester.addRule(prefix + "web-app/servlet-mapping/url-pattern", new CallParamMultiRule(0));
++
++        digester.addRule(prefix + "web-app/session-config",
++                         sessionConfig);
++        
++        digester.addCallMethod(prefix + "web-app/session-config/session-timeout",
++                               "setSessionTimeout", 1,
++                               new Class[] { Integer.TYPE });
++        digester.addCallParam(prefix + "web-app/session-config/session-timeout", 0);
++
++        digester.addCallMethod(prefix + "web-app/taglib",
++                               "addTaglib", 2);
++        digester.addCallParam(prefix + "web-app/taglib/taglib-location", 1);
++        digester.addCallParam(prefix + "web-app/taglib/taglib-uri", 0);
++
++        digester.addCallMethod(prefix + "web-app/welcome-file-list/welcome-file",
++                               "addWelcomeFile", 0);
++
++        digester.addCallMethod(prefix + "web-app/locale-encoding-mapping-list/locale-encoding-mapping",
++                              "addLocaleEncodingMappingParameter", 2);
++        digester.addCallParam(prefix + "web-app/locale-encoding-mapping-list/locale-encoding-mapping/locale", 0);
++        digester.addCallParam(prefix + "web-app/locale-encoding-mapping-list/locale-encoding-mapping/encoding", 1);
++
++    }
++
++    protected void configureNamingRules(Digester digester) {
++        //ejb-local-ref
++        digester.addObjectCreate(prefix + "web-app/ejb-local-ref",
++                                 "org.apache.catalina.deploy.ContextLocalEjb");
++        digester.addRule(prefix + "web-app/ejb-local-ref",
++                new SetNextNamingRule("addLocalEjb",
++                            "org.apache.catalina.deploy.ContextLocalEjb"));
++
++        digester.addCallMethod(prefix + "web-app/ejb-local-ref/description",
++                               "setDescription", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-local-ref/ejb-link",
++                               "setLink", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-local-ref/ejb-ref-name",
++                               "setName", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-local-ref/ejb-ref-type",
++                               "setType", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-local-ref/local",
++                               "setLocal", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-local-ref/local-home",
++                               "setHome", 0);
++        configureInjectionRules(digester, "web-app/ejb-local-ref/");
++
++        //ejb-ref
++        digester.addObjectCreate(prefix + "web-app/ejb-ref",
++                                 "org.apache.catalina.deploy.ContextEjb");
++        digester.addRule(prefix + "web-app/ejb-ref",
++                new SetNextNamingRule("addEjb",
++                            "org.apache.catalina.deploy.ContextEjb"));
++
++        digester.addCallMethod(prefix + "web-app/ejb-ref/description",
++                               "setDescription", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-ref/ejb-link",
++                               "setLink", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-ref/ejb-ref-name",
++                               "setName", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-ref/ejb-ref-type",
++                               "setType", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-ref/home",
++                               "setHome", 0);
++        digester.addCallMethod(prefix + "web-app/ejb-ref/remote",
++                               "setRemote", 0);
++        configureInjectionRules(digester, "web-app/ejb-ref/");
++
++        //env-entry
++        digester.addObjectCreate(prefix + "web-app/env-entry",
++                                 "org.apache.catalina.deploy.ContextEnvironment");
++        digester.addRule(prefix + "web-app/env-entry",
++                new SetNextNamingRule("addEnvironment",
++                            "org.apache.catalina.deploy.ContextEnvironment"));
++
++        digester.addCallMethod(prefix + "web-app/env-entry/description",
++                               "setDescription", 0);
++        digester.addCallMethod(prefix + "web-app/env-entry/env-entry-name",
++                               "setName", 0);
++        digester.addCallMethod(prefix + "web-app/env-entry/env-entry-type",
++                               "setType", 0);
++        digester.addCallMethod(prefix + "web-app/env-entry/env-entry-value",
++                               "setValue", 0);
++        configureInjectionRules(digester, "web-app/env-entry/");
++
++        //resource-env-ref
+         digester.addObjectCreate(prefix + "web-app/resource-env-ref",
+             "org.apache.catalina.deploy.ContextResourceEnvRef");
+         digester.addRule(prefix + "web-app/resource-env-ref",
+@@ -289,7 +390,9 @@
+                 "setName", 0);
+         digester.addCallMethod(prefix + "web-app/resource-env-ref/resource-env-ref-type",
+                 "setType", 0);
++        configureInjectionRules(digester, "web-app/ejb-local-ref/");
+ 
++        //message-destination
+         digester.addObjectCreate(prefix + "web-app/message-destination",
+                                  "org.apache.catalina.deploy.MessageDestination");
+         digester.addSetNext(prefix + "web-app/message-destination",
+@@ -307,6 +410,7 @@
+         digester.addCallMethod(prefix + "web-app/message-destination/message-destination-name",
+                                "setName", 0);
+ 
++        //message-destination-ref
+         digester.addObjectCreate(prefix + "web-app/message-destination-ref",
+                                  "org.apache.catalina.deploy.MessageDestinationRef");
+         digester.addSetNext(prefix + "web-app/message-destination-ref",
+@@ -324,6 +428,9 @@
+         digester.addCallMethod(prefix + "web-app/message-destination-ref/message-destination-usage",
+                                "setUsage", 0);
+ 
++        configureInjectionRules(digester, "web-app/message-destination-ref/");
++
++        //resource-ref
+         digester.addObjectCreate(prefix + "web-app/resource-ref",
+                                  "org.apache.catalina.deploy.ContextResource");
+         digester.addRule(prefix + "web-app/resource-ref",
+@@ -340,37 +447,9 @@
+                                "setScope", 0);
+         digester.addCallMethod(prefix + "web-app/resource-ref/res-type",
+                                "setType", 0);
++        configureInjectionRules(digester, "web-app/resource-ref/");
+ 
+-        digester.addObjectCreate(prefix + "web-app/security-constraint",
+-                                 "org.apache.catalina.deploy.SecurityConstraint");
+-        digester.addSetNext(prefix + "web-app/security-constraint",
+-                            "addConstraint",
+-                            "org.apache.catalina.deploy.SecurityConstraint");
+-
+-        digester.addRule(prefix + "web-app/security-constraint/auth-constraint",
+-                         new SetAuthConstraintRule());
+-        digester.addCallMethod(prefix + "web-app/security-constraint/auth-constraint/role-name",
+-                               "addAuthRole", 0);
+-        digester.addCallMethod(prefix + "web-app/security-constraint/display-name",
+-                               "setDisplayName", 0);
+-        digester.addCallMethod(prefix + "web-app/security-constraint/user-data-constraint/transport-guarantee",
+-                               "setUserConstraint", 0);
+-
+-        digester.addObjectCreate(prefix + "web-app/security-constraint/web-resource-collection",
+-                                 "org.apache.catalina.deploy.SecurityCollection");
+-        digester.addSetNext(prefix + "web-app/security-constraint/web-resource-collection",
+-                            "addCollection",
+-                            "org.apache.catalina.deploy.SecurityCollection");
+-        digester.addCallMethod(prefix + "web-app/security-constraint/web-resource-collection/http-method",
+-                               "addMethod", 0);
+-        digester.addCallMethod(prefix + "web-app/security-constraint/web-resource-collection/url-pattern",
+-                               "addPattern", 0);
+-        digester.addCallMethod(prefix + "web-app/security-constraint/web-resource-collection/web-resource-name",
+-                               "setName", 0);
+-
+-        digester.addCallMethod(prefix + "web-app/security-role/role-name",
+-                               "addSecurityRole", 0);
+-
++        //service-ref
+         digester.addObjectCreate(prefix + "web-app/service-ref",
+                                  "org.apache.catalina.deploy.ContextService");
+         digester.addRule(prefix + "web-app/service-ref",
+@@ -391,11 +470,8 @@
+                                "setWsdlfile", 0);
+         digester.addCallMethod(prefix + "web-app/service-ref/jaxrpc-mapping-file",
+                                "setJaxrpcmappingfile", 0);
+-        digester.addCallMethod(prefix + "web-app/service-ref/service-qname/namespaceURI",
+-                               "setServiceqnameNamespaceURI", 0);
+-        digester.addCallMethod(prefix + "web-app/service-ref/service-qname/localpart",
+-                               "setServiceqnameLocalpart", 0);
+-
++        digester.addRule(prefix + "web-app/service-ref/service-qname", new ServiceQnameRule());
++        
+         digester.addRule(prefix + "web-app/service-ref/port-component-ref",
+                                new CallMethodMultiRule("addPortcomponent", 2, 1));
+         digester.addCallParam(prefix + "web-app/service-ref/port-component-ref/service-endpoint-interface", 0);
+@@ -406,7 +482,7 @@
+         digester.addRule(prefix + "web-app/service-ref/handler",
+                          new SetNextRule("addHandler",
+                          "org.apache.catalina.deploy.ContextHandler"));
+-        
++
+         digester.addCallMethod(prefix + "web-app/service-ref/handler/handler-name",
+                                "setName", 0);
+         digester.addCallMethod(prefix + "web-app/service-ref/handler/handler-class",
+@@ -419,76 +495,26 @@
+         digester.addCallParam(prefix + "web-app/service-ref/handler/init-param/param-value",
+                               1);
+ 
+-        digester.addCallMethod(prefix + "web-app/service-ref/handler/soap-header",
+-                               "addSoapHeaders", 2);
+-        digester.addCallParam(prefix + "web-app/service-ref/handler/soap-header/localpart",
+-                              0);
+-        digester.addCallParam(prefix + "web-app/service-ref/handler/soap-header/namespaceURI",
+-                              1);
++        digester.addRule(prefix + "web-app/service-ref/handler/soap-header", new SoapHeaderRule());
+ 
+         digester.addCallMethod(prefix + "web-app/service-ref/handler/soap-role",
+                                "addSoapRole", 0);
+         digester.addCallMethod(prefix + "web-app/service-ref/handler/port-name",
+                                "addPortName", 0);
+-        
+-        digester.addRule(prefix + "web-app/servlet",
+-                         new WrapperCreateRule());
+-        digester.addSetNext(prefix + "web-app/servlet",
+-                            "addChild",
+-                            "org.apache.catalina.Container");
++        configureInjectionRules(digester, "web-app/service-ref/");
+ 
+-        digester.addCallMethod(prefix + "web-app/servlet/init-param",
+-                               "addInitParameter", 2);
+-        digester.addCallParam(prefix + "web-app/servlet/init-param/param-name",
+-                              0);
+-        digester.addCallParam(prefix + "web-app/servlet/init-param/param-value",
+-                              1);
+ 
+-        digester.addCallMethod(prefix + "web-app/servlet/jsp-file",
+-                               "setJspFile", 0);
+-        digester.addCallMethod(prefix + "web-app/servlet/load-on-startup",
+-                               "setLoadOnStartupString", 0);
+-        digester.addCallMethod(prefix + "web-app/servlet/run-as/role-name",
+-                               "setRunAs", 0);
++    }
+ 
+-        digester.addCallMethod(prefix + "web-app/servlet/security-role-ref",
+-                               "addSecurityReference", 2);
+-        digester.addCallParam(prefix + "web-app/servlet/security-role-ref/role-link", 1);
+-        digester.addCallParam(prefix + "web-app/servlet/security-role-ref/role-name", 0);
++    protected void configureInjectionRules(Digester digester, String base) {
+ 
+-        digester.addCallMethod(prefix + "web-app/servlet/servlet-class",
+-                              "setServletClass", 0);
+-        digester.addCallMethod(prefix + "web-app/servlet/servlet-name",
+-                              "setName", 0);
++        digester.addCallMethod(prefix + base + "injection-target", "addInjectionTarget", 2);
++        digester.addCallParam(prefix + base + "injection-target/injection-target-class", 0);
++        digester.addCallParam(prefix + base + "injection-target/injection-target-name", 1);
+ 
+-        digester.addRule(prefix + "web-app/servlet-mapping",
+-                               new CallMethodMultiRule("addServletMapping", 2, 0));
+-        digester.addCallParam(prefix + "web-app/servlet-mapping/servlet-name", 1);
+-        digester.addRule(prefix + "web-app/servlet-mapping/url-pattern", new CallParamMultiRule(0));
++    }
+ 
+-        digester.addRule(prefix + "web-app/session-config",
+-                         sessionConfig);
+-        
+-        digester.addCallMethod(prefix + "web-app/session-config/session-timeout",
+-                               "setSessionTimeout", 1,
+-                               new Class[] { Integer.TYPE });
+-        digester.addCallParam(prefix + "web-app/session-config/session-timeout", 0);
+ 
+-        digester.addCallMethod(prefix + "web-app/taglib",
+-                               "addTaglib", 2);
+-        digester.addCallParam(prefix + "web-app/taglib/taglib-location", 1);
+-        digester.addCallParam(prefix + "web-app/taglib/taglib-uri", 0);
+-
+-        digester.addCallMethod(prefix + "web-app/welcome-file-list/welcome-file",
+-                               "addWelcomeFile", 0);
+-
+-        digester.addCallMethod(prefix + "web-app/locale-encoding-mapping-list/locale-encoding-mapping",
+-                              "addLocaleEncodingMappingParameter", 2);
+-        digester.addCallParam(prefix + "web-app/locale-encoding-mapping-list/locale-encoding-mapping/locale", 0);
+-        digester.addCallParam(prefix + "web-app/locale-encoding-mapping-list/locale-encoding-mapping/encoding", 1);
+-
+-    }
+-
+     /**
+      * Reset counter used for validating the web.xml file.
+      */
+@@ -826,3 +852,52 @@
+     }
+ 
+ }
++
++/**
++ * A Rule that sets soap headers on the ContextHandler.
++ * 
++ */
++final class SoapHeaderRule extends Rule {
++
++    public SoapHeaderRule() {
++    }
++
++    public void body(String text)
++        throws Exception {
++        String namespaceuri = null;
++        String localpart = text;
++        int colon = text.indexOf(':');
++        if (colon >= 0) {
++            String prefix = text.substring(0,colon);
++            namespaceuri = digester.findNamespaceURI(prefix);
++            localpart = text.substring(colon+1);
++        }
++        ContextHandler contextHandler = (ContextHandler)digester.peek();
++        contextHandler.addSoapHeaders(localpart,namespaceuri);
++    }
++}
++
++/**
++ * A Rule that sets service qname on the ContextService.
++ * 
++ */
++final class ServiceQnameRule extends Rule {
++
++    public ServiceQnameRule() {
++    }
++
++    public void body(String text)
++        throws Exception {
++        String namespaceuri = null;
++        String localpart = text;
++        int colon = text.indexOf(':');
++        if (colon >= 0) {
++            String prefix = text.substring(0,colon);
++            namespaceuri = digester.findNamespaceURI(prefix);
++            localpart = text.substring(colon+1);
++        }
++        ContextService contextService = (ContextService)digester.peek();
++        contextService.setServiceqnameLocalpart(localpart);
++        contextService.setServiceqnameNamespaceURI(namespaceuri);
++    }
++}
+\ No newline at end of file
+Index: java/org/apache/catalina/security/SecurityClassLoad.java
+===================================================================
+--- java/org/apache/catalina/security/SecurityClassLoad.java	(revision 543812)
++++ java/org/apache/catalina/security/SecurityClassLoad.java	(working copy)
+@@ -65,6 +65,9 @@
+         loader.loadClass
+             (basePackage +
+              "core.StandardWrapper$1");
++        loader.loadClass
++        	(basePackage +
++             "core.ApplicationHttpRequest$AttributeNamesEnumerator");
+     }
+     
+     
+Index: java/org/apache/catalina/util/DefaultAnnotationProcessor.java
+===================================================================
+--- java/org/apache/catalina/util/DefaultAnnotationProcessor.java	(revision 543812)
++++ java/org/apache/catalina/util/DefaultAnnotationProcessor.java	(working copy)
+@@ -1,244 +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.catalina.util;
+-
+-import java.lang.reflect.Field;
+-import java.lang.reflect.InvocationTargetException;
+-import java.lang.reflect.Method;
+-import java.lang.reflect.Modifier;
+-
+-import javax.annotation.PostConstruct;
+-import javax.annotation.PreDestroy;
+-import javax.annotation.Resource;
+-import javax.ejb.EJB;
+-import javax.naming.NamingException;
+-import javax.persistence.PersistenceContext;
+-import javax.persistence.PersistenceUnit;
+-import javax.xml.ws.WebServiceRef;
+-
+-import org.apache.AnnotationProcessor;
+-
+-
+-/**
+- * Verify the annotation and Process it.
+- *
+- * @author Fabien Carrion
+- * @author Remy Maucherat
+- * @version $Revision$, $Date$
+- */
+-public class DefaultAnnotationProcessor implements AnnotationProcessor {
+-    
+-    protected javax.naming.Context context = null;
+-    
+-    public DefaultAnnotationProcessor(javax.naming.Context context) {
+-        this.context = context;
+-    }
+-
+-
+-    /**
+-     * Call postConstruct method on the specified instance.
+-     */
+-    public void postConstruct(Object instance)
+-        throws IllegalAccessException, InvocationTargetException {
+-        
+-        Method[] methods = instance.getClass().getDeclaredMethods();
+-        Method postConstruct = null;
+-        for (int i = 0; i < methods.length; i++) {
+-            if (methods[i].isAnnotationPresent(PostConstruct.class)) {
+-                if ((postConstruct != null) 
+-                        || (methods[i].getParameterTypes().length != 0)
+-                        || (Modifier.isStatic(methods[i].getModifiers())) 
+-                        || (methods[i].getExceptionTypes().length > 0)
+-                        || (!methods[i].getReturnType().getName().equals("void"))) {
+-                    throw new IllegalArgumentException("Invalid PostConstruct annotation");
+-                }
+-                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 void preDestroy(Object instance)
+-        throws IllegalAccessException, InvocationTargetException {
+-        
+-        Method[] methods = instance.getClass().getDeclaredMethods();
+-        Method preDestroy = null;
+-        for (int i = 0; i < methods.length; i++) {
+-            if (methods[i].isAnnotationPresent(PreDestroy.class)) {
+-                if ((preDestroy != null) 
+-                        || (methods[i].getParameterTypes().length != 0)
+-                        || (Modifier.isStatic(methods[i].getModifiers())) 
+-                        || (methods[i].getExceptionTypes().length > 0)
+-                        || (!methods[i].getReturnType().getName().equals("void"))) {
+-                    throw new IllegalArgumentException("Invalid PreDestroy annotation");
+-                }
+-                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 void processAnnotations(Object instance)
+-        throws IllegalAccessException, InvocationTargetException, NamingException {
+-        
+-        if (context == null) {
+-            // No resource injection
+-            return;
+-        }
+-        

[... 116 lines stripped ...]