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 ...]