You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2007/12/17 21:55:59 UTC

svn commit: r605000 [1/2] - in /tomcat/trunk/java/org/apache: ./ catalina/core/ catalina/deploy/ catalina/security/ catalina/startup/ catalina/util/ jasper/ jasper/compiler/ jasper/runtime/ jasper/servlet/

Author: fhanik
Date: Mon Dec 17 12:55:56 2007
New Revision: 605000

URL: http://svn.apache.org/viewvc?rev=605000&view=rev
Log:
port new annotation logic from previous trunk

Added:
    tomcat/trunk/java/org/apache/InstanceManager.java   (with props)
    tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java   (with props)
    tomcat/trunk/java/org/apache/catalina/deploy/Injectable.java   (with props)
    tomcat/trunk/java/org/apache/catalina/deploy/InjectionTarget.java   (with props)
    tomcat/trunk/java/org/apache/jasper/runtime/InstanceManagerFactory.java   (with props)
Removed:
    tomcat/trunk/java/org/apache/AnnotationProcessor.java
    tomcat/trunk/java/org/apache/catalina/util/DefaultAnnotationProcessor.java
    tomcat/trunk/java/org/apache/jasper/runtime/AnnotationHelper.java
Modified:
    tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java
    tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
    tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
    tomcat/trunk/java/org/apache/catalina/deploy/ContextEnvironment.java
    tomcat/trunk/java/org/apache/catalina/deploy/MessageDestinationRef.java
    tomcat/trunk/java/org/apache/catalina/deploy/ResourceBase.java
    tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
    tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java
    tomcat/trunk/java/org/apache/jasper/Constants.java
    tomcat/trunk/java/org/apache/jasper/JspCompilationContext.java
    tomcat/trunk/java/org/apache/jasper/compiler/Generator.java
    tomcat/trunk/java/org/apache/jasper/runtime/TagHandlerPool.java
    tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java

Added: tomcat/trunk/java/org/apache/InstanceManager.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/InstanceManager.java?rev=605000&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/InstanceManager.java (added)
+++ tomcat/trunk/java/org/apache/InstanceManager.java Mon Dec 17 12:55:56 2007
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.apache;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.naming.NamingException;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public interface InstanceManager {
+
+    public Object newInstance(String className)
+    	throws IllegalAccessException, InvocationTargetException, NamingException, 
+    		InstantiationException, ClassNotFoundException;
+
+    public Object newInstance(String fqcn, ClassLoader classLoader) 
+    	throws IllegalAccessException, InvocationTargetException, NamingException, 
+    		InstantiationException, ClassNotFoundException;
+
+    public void newInstance(Object o) 
+		throws IllegalAccessException, InvocationTargetException, NamingException;
+
+    public void destroyInstance(Object o)
+    	throws IllegalAccessException, InvocationTargetException;
+}

Propchange: tomcat/trunk/java/org/apache/InstanceManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterConfig.java Mon Dec 17 12:55:56 2007
@@ -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();
-
-        ClassLoader oldCtxClassLoader =
-            Thread.currentThread().getContextClassLoader();
+        this.filter = (Filter) getInstanceManager().newInstance(filterClass);
 
-        // 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,30 +248,6 @@
 
     }
 
-
-    /**
-     * 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;
+    }
 
 }

Added: tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java?rev=605000&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java (added)
+++ tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java Mon Dec 17 12:55:56 2007
@@ -0,0 +1,437 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.catalina.core;
+
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Map;
+import java.util.Properties;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
+import java.security.PrivilegedActionException;
+import java.io.InputStream;
+import java.io.IOException;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.persistence.PersistenceContext;
+import javax.persistence.PersistenceUnit;
+import javax.xml.ws.WebServiceRef;
+import javax.servlet.Filter;
+import javax.servlet.Servlet;
+
+import org.apache.InstanceManager;
+import org.apache.catalina.security.SecurityUtil;
+import org.apache.catalina.ContainerServlet;
+import org.apache.catalina.core.Constants;
+import org.apache.catalina.util.StringManager;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class DefaultInstanceManager implements InstanceManager {
+
+    private final Context context;
+    private final Map<String, Map<String, String>> injectionMap;
+    protected final ClassLoader classLoader;
+    protected final ClassLoader containerClassLoader;
+    protected boolean privileged;
+    protected boolean ignoreAnnotations;
+    private Properties restrictedFilters = new Properties();
+    private Properties restrictedListeners = new Properties();
+    private Properties restrictedServlets = new Properties();
+
+    public DefaultInstanceManager(Context context, Map<String, Map<String, String>> injectionMap, org.apache.catalina.Context catalinaContext, ClassLoader containerClassLoader) {
+        classLoader = catalinaContext.getLoader().getClassLoader();
+        privileged = catalinaContext.getPrivileged();
+        this.containerClassLoader = containerClassLoader;
+        ignoreAnnotations = catalinaContext.getIgnoreAnnotations();
+        StringManager sm = StringManager.getManager(Constants.Package);
+        try {
+            InputStream is =
+                this.getClass().getClassLoader().getResourceAsStream
+                    ("org/apache/catalina/core/RestrictedServlets.properties");
+            if (is != null) {
+                restrictedServlets.load(is);
+            } else {
+                catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedServletsResource"));
+            }
+        } catch (IOException e) {
+            catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedServletsResource"), e);
+        }
+
+        try {
+            InputStream is =
+                    this.getClass().getClassLoader().getResourceAsStream
+                            ("org/apache/catalina/core/RestrictedListeners.properties");
+            if (is != null) {
+                restrictedFilters.load(is);
+            } else {
+                catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedListenersResources"));
+            }
+        } catch (IOException e) {
+            catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedListenersResources"), e);
+        }
+        try {
+            InputStream is =
+                    this.getClass().getClassLoader().getResourceAsStream
+                            ("org/apache/catalina/core/RestrictedFilters.properties");
+            if (is != null) {
+                restrictedFilters.load(is);
+            } else {
+                catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedFiltersResources"));
+            }
+        } catch (IOException e) {
+            catalinaContext.getLogger().error(sm.getString("defaultInstanceManager.restrictedServletsResources"), e);
+        }
+        this.context = context;
+        this.injectionMap = injectionMap;
+    }
+
+    public Object newInstance(String className) throws IllegalAccessException, InvocationTargetException, NamingException, InstantiationException, ClassNotFoundException {
+        Class clazz = loadClassMaybePrivileged(className, classLoader);
+        return newInstance(clazz.newInstance(), clazz);
+    }
+
+    public Object newInstance(final String className, final ClassLoader classLoader) throws IllegalAccessException, NamingException, InvocationTargetException, InstantiationException, ClassNotFoundException {
+        Class clazz = classLoader.loadClass(className);
+        return newInstance(clazz.newInstance(), clazz);
+    }
+
+    public void newInstance(Object o) 
+		throws IllegalAccessException, InvocationTargetException, NamingException {
+    	newInstance(o, o.getClass());
+    }
+
+    private Object newInstance(Object instance, Class clazz) throws IllegalAccessException, InvocationTargetException, NamingException {
+        if (!ignoreAnnotations) {
+            Map<String, String> injections = injectionMap.get(clazz.getName());
+            processAnnotations(instance, injections);
+            postConstruct(instance, clazz);
+        }
+        return instance;
+    }
+
+    public void destroyInstance(Object instance) throws IllegalAccessException, InvocationTargetException {
+        if (!ignoreAnnotations) {
+            preDestroy(instance, instance.getClass());
+        }
+    }
+
+    /**
+     * Call postConstruct method on the specified instance recursively from deepest superclass to actual class.
+     *
+     * @param instance object to call postconstruct methods on
+     * @param clazz    (super) class to examine for postConstruct annotation.
+     * @throws IllegalAccessException if postConstruct method is inaccessible.
+     * @throws java.lang.reflect.InvocationTargetException
+     *                                if call fails
+     */
+    protected void postConstruct(Object instance, Class clazz)
+            throws IllegalAccessException, InvocationTargetException {
+        Class superClass = clazz.getSuperclass();
+        if (superClass != Object.class) {
+            postConstruct(instance, superClass);
+        }
+
+        Method[] methods = clazz.getDeclaredMethods();
+        Method postConstruct = null;
+        for (Method method : methods) {
+            if (method.isAnnotationPresent(PostConstruct.class)) {
+                if ((postConstruct != null)
+                        || (method.getParameterTypes().length != 0)
+                        || (Modifier.isStatic(method.getModifiers()))
+                        || (method.getExceptionTypes().length > 0)
+                        || (!method.getReturnType().getName().equals("void"))) {
+                    throw new IllegalArgumentException("Invalid PostConstruct annotation");
+                }
+                postConstruct = method;
+            }
+        }
+
+        // At the end the postconstruct annotated
+        // method is invoked
+        if (postConstruct != null) {
+            boolean accessibility = postConstruct.isAccessible();
+            postConstruct.setAccessible(true);
+            postConstruct.invoke(instance);
+            postConstruct.setAccessible(accessibility);
+        }
+
+    }
+
+
+    /**
+     * Call preDestroy method on the specified instance recursively from deepest superclass to actual class.
+     *
+     * @param instance object to call preDestroy methods on
+     * @param clazz    (super) class to examine for preDestroy annotation.
+     * @throws IllegalAccessException if preDestroy method is inaccessible.
+     * @throws java.lang.reflect.InvocationTargetException
+     *                                if call fails
+     */
+    protected void preDestroy(Object instance, Class clazz)
+            throws IllegalAccessException, InvocationTargetException {
+        Class superClass = clazz.getSuperclass();
+        if (superClass != Object.class) {
+            preDestroy(instance, superClass);
+        }
+
+        Method[] methods = clazz.getDeclaredMethods();
+        Method preDestroy = null;
+        for (Method method : methods) {
+            if (method.isAnnotationPresent(PreDestroy.class)) {
+                if ((method.getParameterTypes().length != 0)
+                        || (Modifier.isStatic(method.getModifiers()))
+                        || (method.getExceptionTypes().length > 0)
+                        || (!method.getReturnType().getName().equals("void"))) {
+                    throw new IllegalArgumentException("Invalid PreDestroy annotation");
+                }
+                preDestroy = method;
+                break;
+            }
+        }
+
+        // At the end the postconstruct annotated
+        // method is invoked
+        if (preDestroy != null) {
+            boolean accessibility = preDestroy.isAccessible();
+            preDestroy.setAccessible(true);
+            preDestroy.invoke(instance);
+            preDestroy.setAccessible(accessibility);
+        }
+
+    }
+
+
+    /**
+     * Inject resources in specified instance.
+     *
+     * @param instance   instance to inject into
+     * @param injections map of injections for this class from xml deployment descriptor
+     * @throws IllegalAccessException       if injection target is inaccessible
+     * @throws javax.naming.NamingException if value cannot be looked up in jndi
+     * @throws java.lang.reflect.InvocationTargetException
+     *                                      if injection fails
+     */
+    protected void processAnnotations(Object instance, Map<String, String> injections)
+            throws IllegalAccessException, InvocationTargetException, NamingException {
+
+        if (context == null) {
+            // No resource injection
+            return;
+        }
+
+        // Initialize fields annotations
+        Field[] fields = instance.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            if (injections != null && injections.containsKey(field.getName())) {
+                lookupFieldResource(context, instance, field, injections.get(field.getName()));
+            } else if (field.isAnnotationPresent(Resource.class)) {
+                Resource annotation = field.getAnnotation(Resource.class);
+                lookupFieldResource(context, instance, field, annotation.name());
+            } else if (field.isAnnotationPresent(EJB.class)) {
+                EJB annotation = field.getAnnotation(EJB.class);
+                lookupFieldResource(context, instance, field, annotation.name());
+            } else if (field.isAnnotationPresent(WebServiceRef.class)) {
+                WebServiceRef annotation =
+                        field.getAnnotation(WebServiceRef.class);
+                lookupFieldResource(context, instance, field, annotation.name());
+            } else if (field.isAnnotationPresent(PersistenceContext.class)) {
+                PersistenceContext annotation =
+                        field.getAnnotation(PersistenceContext.class);
+                lookupFieldResource(context, instance, field, annotation.name());
+            } else if (field.isAnnotationPresent(PersistenceUnit.class)) {
+                PersistenceUnit annotation =
+                        field.getAnnotation(PersistenceUnit.class);
+                lookupFieldResource(context, instance, field, annotation.name());
+            }
+        }
+
+        // Initialize methods annotations
+        Method[] methods = instance.getClass().getDeclaredMethods();
+        for (Method method : methods) {
+            String methodName = method.getName();
+            if (injections != null && methodName.startsWith("set") && methodName.length() > 3) {
+                String fieldName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
+                if (injections.containsKey(fieldName)) {
+                    lookupMethodResource(context, instance, method, injections.get(fieldName));
+                    break;
+                }
+            }
+            if (method.isAnnotationPresent(Resource.class)) {
+                Resource annotation = method.getAnnotation(Resource.class);
+                lookupMethodResource(context, instance, method, annotation.name());
+            } else if (method.isAnnotationPresent(EJB.class)) {
+                EJB annotation = method.getAnnotation(EJB.class);
+                lookupMethodResource(context, instance, method, annotation.name());
+            } else if (method.isAnnotationPresent(WebServiceRef.class)) {
+                WebServiceRef annotation =
+                        method.getAnnotation(WebServiceRef.class);
+                lookupMethodResource(context, instance, method, annotation.name());
+            } else if (method.isAnnotationPresent(PersistenceContext.class)) {
+                PersistenceContext annotation =
+                        method.getAnnotation(PersistenceContext.class);
+                lookupMethodResource(context, instance, method, annotation.name());
+            } else if (method.isAnnotationPresent(PersistenceUnit.class)) {
+                PersistenceUnit annotation =
+                        method.getAnnotation(PersistenceUnit.class);
+                lookupMethodResource(context, instance, method, annotation.name());
+            }
+        }
+
+    }
+
+
+    protected Class loadClassMaybePrivileged(final String className, final ClassLoader classLoader) throws ClassNotFoundException {
+        Class clazz;
+        if (SecurityUtil.isPackageProtectionEnabled()) {
+            try {
+                clazz = AccessController.doPrivileged(new PrivilegedExceptionAction<Class>() {
+
+                    public Class run() throws Exception {
+                        return loadClass(className, classLoader);
+                    }
+                });
+            } catch (PrivilegedActionException e) {
+                Throwable t = e.getCause();
+                if (t instanceof ClassNotFoundException) {
+                    throw (ClassNotFoundException) t;
+                }
+                throw new RuntimeException(t);
+            }
+        } else {
+            clazz = loadClass(className, classLoader);
+        }
+        checkAccess(clazz);
+        return clazz;
+    }
+
+    protected Class loadClass(String className, ClassLoader classLoader) throws ClassNotFoundException {
+        if (className.startsWith("org.apache.catalina")) {
+            return containerClassLoader.loadClass(className);
+        }
+        try {
+            Class clazz = containerClassLoader.loadClass(className);
+            if (ContainerServlet.class.isAssignableFrom(clazz)) {
+                return clazz;
+            }
+        } catch (Throwable t) {
+            //ignore
+        }
+        return classLoader.loadClass(className);
+    }
+
+    private void checkAccess(Class clazz) {
+        if (privileged) return;
+        if (clazz.isAssignableFrom(Filter.class)) {
+            checkAccess(clazz, restrictedFilters);
+        } else if (clazz.isAssignableFrom(Servlet.class)) {
+            checkAccess(clazz, restrictedServlets);
+        } else {
+            checkAccess(clazz, restrictedListeners);
+        }
+    }
+
+    private void checkAccess(Class clazz, Properties restricted) {
+        while (clazz != null) {
+            if ("restricted".equals(restricted.getProperty(clazz.getName()))) {
+                throw new SecurityException("Restricted class" + clazz);
+            }
+            clazz = clazz.getSuperclass();
+        }
+
+    }
+
+    /**
+     * Inject resources in specified field.
+     *
+     * @param context  jndi context to extract value from
+     * @param instance object to inject into
+     * @param field    field target for injection
+     * @param name     jndi name value is bound under
+     * @throws IllegalAccessException       if field is inaccessible
+     * @throws javax.naming.NamingException if value is not accessible in naming context
+     */
+    protected static void lookupFieldResource(Context context,
+            Object instance, Field field, String name)
+            throws NamingException, IllegalAccessException {
+
+        Object lookedupResource;
+        boolean accessibility;
+
+        if ((name != null) &&
+                (name.length() > 0)) {
+            lookedupResource = context.lookup(name);
+        } else {
+            lookedupResource = context.lookup(instance.getClass().getName() + "/" + field.getName());
+        }
+
+        accessibility = field.isAccessible();
+        field.setAccessible(true);
+        field.set(instance, lookedupResource);
+        field.setAccessible(accessibility);
+    }
+
+    /**
+     * Inject resources in specified method.
+     *
+     * @param context  jndi context to extract value from
+     * @param instance object to inject into
+     * @param method   field target for injection
+     * @param name     jndi name value is bound under
+     * @throws IllegalAccessException       if method is inaccessible
+     * @throws javax.naming.NamingException if value is not accessible in naming context
+     * @throws java.lang.reflect.InvocationTargetException
+     *                                      if setter call fails
+     */
+    protected static void lookupMethodResource(Context context,
+            Object instance, Method method, String name)
+            throws NamingException, IllegalAccessException, InvocationTargetException {
+
+        if (!method.getName().startsWith("set")
+                || method.getParameterTypes().length != 1
+                || !method.getReturnType().getName().equals("void")) {
+            throw new IllegalArgumentException("Invalid method resource injection annotation");
+        }
+
+        Object lookedupResource;
+        boolean accessibility;
+
+        if ((name != null) &&
+                (name.length() > 0)) {
+            lookedupResource = context.lookup(name);
+        } else {
+            lookedupResource =
+                    context.lookup(instance.getClass().getName() + "/" + method.getName().substring(3));
+        }
+
+        accessibility = method.isAccessible();
+        method.setAccessible(true);
+        method.invoke(instance, lookedupResource);
+        method.setAccessible(accessibility);
+    }
+}

Propchange: tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Mon Dec 17 12:55:56 2007
@@ -200,7 +200,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}
@@ -209,7 +208,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

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Mon Dec 17 12:55:56 2007
@@ -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;
     }
 
     
@@ -1875,9 +1878,6 @@
      * @return The work path
      */ 
     public String getWorkPath() {
-        if (getWorkDir() == null) {
-            return null;
-        }
         File workDir = new File(getWorkDir());
         if (!workDir.isAbsolute()) {
             File catalinaHome = engineBase();
@@ -3771,7 +3771,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;
@@ -3780,13 +3779,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",
@@ -3886,29 +3879,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",
@@ -4313,21 +4303,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 {
@@ -4406,6 +4393,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);
+            }
+        }
     }
 
     /**

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java Mon Dec 17 12:55:56 2007
@@ -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;
-            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
+            InstanceManager instanceManager = ((StandardContext)getParent()).getInstanceManager();
             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)) {
@@ -1787,7 +1652,7 @@
                 broadcaster.sendNotification(notification);
             }
         } catch( Exception ex ) {
-            log.info("Error registering servlet with jmx " + this, ex);
+            log.info("Error registering servlet with jmx " + this);
         }
 
         if (isJspServlet) {
@@ -1802,7 +1667,7 @@
                     .registerComponent(instance, jspMonitorON, null);
             } catch( Exception ex ) {
                 log.info("Error registering JSP monitoring with jmx " +
-                         instance, ex);
+                         instance);
             }
         }
     }

Modified: tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml (original)
+++ tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml Mon Dec 17 12:55:56 2007
@@ -41,9 +41,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"

Modified: tomcat/trunk/java/org/apache/catalina/deploy/ContextEnvironment.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/ContextEnvironment.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/ContextEnvironment.java (original)
+++ tomcat/trunk/java/org/apache/catalina/deploy/ContextEnvironment.java Mon Dec 17 12:55:56 2007
@@ -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
@@ -103,6 +105,18 @@
 
     public void setValue(String value) {
         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

Added: tomcat/trunk/java/org/apache/catalina/deploy/Injectable.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/Injectable.java?rev=605000&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/Injectable.java (added)
+++ tomcat/trunk/java/org/apache/catalina/deploy/Injectable.java Mon Dec 17 12:55:56 2007
@@ -0,0 +1,29 @@
+/*
+ * 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.deploy;
+
+import java.util.List;
+
+public interface Injectable {
+	public String getName();
+    public void addInjectionTarget(String injectionTargetName, String jndiName);
+    public List<InjectionTarget> getInjectionTargets();
+}

Propchange: tomcat/trunk/java/org/apache/catalina/deploy/Injectable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/trunk/java/org/apache/catalina/deploy/InjectionTarget.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/InjectionTarget.java?rev=605000&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/InjectionTarget.java (added)
+++ tomcat/trunk/java/org/apache/catalina/deploy/InjectionTarget.java Mon Dec 17 12:55:56 2007
@@ -0,0 +1,55 @@
+/*
+ * 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.deploy;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class InjectionTarget {
+    private String targetClass;
+    private String targetName;
+
+
+    public InjectionTarget() {
+    }
+
+    public InjectionTarget(String targetClass, String targetName) {
+        this.targetClass = targetClass;
+        this.targetName = targetName;
+    }
+
+    public String getTargetClass() {
+        return targetClass;
+    }
+
+    public void setTargetClass(String targetClass) {
+        this.targetClass = targetClass;
+    }
+
+    public String getTargetName() {
+        return targetName;
+    }
+
+    public void setTargetName(String targetName) {
+        this.targetName = targetName;
+    }
+
+}

Propchange: tomcat/trunk/java/org/apache/catalina/deploy/InjectionTarget.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/catalina/deploy/MessageDestinationRef.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/MessageDestinationRef.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/MessageDestinationRef.java (original)
+++ tomcat/trunk/java/org/apache/catalina/deploy/MessageDestinationRef.java Mon Dec 17 12:55:56 2007
@@ -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,6 +108,16 @@
         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
 

Modified: tomcat/trunk/java/org/apache/catalina/deploy/ResourceBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/ResourceBase.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/deploy/ResourceBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/deploy/ResourceBase.java Mon Dec 17 12:55:56 2007
@@ -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
 
 

Modified: tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java (original)
+++ tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java Mon Dec 17 12:55:56 2007
@@ -66,8 +66,8 @@
             (basePackage +
              "core.StandardWrapper$1");
         loader.loadClass
-            (basePackage +
-              "core.ApplicationHttpRequest$AttributeNamesEnumerator");
+        	(basePackage +
+             "core.ApplicationHttpRequest$AttributeNamesEnumerator");
     }
     
     

Modified: tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java?rev=605000&r1=604999&r2=605000&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/WebRuleSet.java Mon Dec 17 12:55:56 2007
@@ -27,7 +27,6 @@
 import org.apache.catalina.deploy.ContextHandler;
 import org.apache.catalina.deploy.ContextService;
 import org.apache.catalina.deploy.SecurityConstraint;
-import org.apache.catalina.deploy.SecurityRoleRef;
 import org.apache.tomcat.util.IntrospectionUtils;
 import org.apache.tomcat.util.digester.CallMethodRule;
 import org.apache.tomcat.util.digester.CallParamRule;
@@ -139,58 +138,7 @@
         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"));
-
-        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);
+        configureNamingRules(digester);
 
         digester.addObjectCreate(prefix + "web-app/error-page",
                                  "org.apache.catalina.deploy.ErrorPage");
@@ -282,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",
@@ -292,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",
@@ -310,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",
@@ -327,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",
@@ -343,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",
@@ -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",
@@ -425,69 +501,20 @@
                                "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");
-
-        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.addRule(prefix + "web-app/servlet/security-role-ref",
-                new SecurityRoleRefCreateRule());
-        digester.addCallMethod(
-                prefix + "web-app/servlet/security-role-ref/role-link",
-                "setLink", 0);
-        digester.addCallMethod(
-                prefix + "web-app/servlet/security-role-ref/role-name",
-                "setName", 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));
+        configureInjectionRules(digester, "web-app/service-ref/");
 
-        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);
+    protected void configureInjectionRules(Digester digester, String base) {
 
-        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);
+        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);
 
     }
 
+
     /**
      * Reset counter used for validating the web.xml file.
      */
@@ -628,6 +655,7 @@
     public void begin(String namespace, String name, Attributes attributes)
         throws Exception {
 
+        Context context = (Context) digester.peek(digester.getCount() - 1);
         Object top = digester.peek();
         Class paramClasses[] = new Class[1];
         paramClasses[0] = "String".getClass();
@@ -874,32 +902,3 @@
     }
 }
 
-/**
- * A Rule that adds a security-role-ref to a servlet, allowing for the fact that
- * role-link is an optional element.
- */
-final class SecurityRoleRefCreateRule extends Rule {
-    
-    public SecurityRoleRefCreateRule() {
-    }
-    
-    public void begin(String namespace, String name, Attributes attributes)
-            throws Exception {
-        SecurityRoleRef securityRoleRef = new SecurityRoleRef();
-        digester.push(securityRoleRef);
-        if (digester.getLogger().isDebugEnabled())
-            digester.getLogger().debug("new SecurityRoleRef");
-    }
-
-    public void end(String namespace, String name)
-            throws Exception {
-        SecurityRoleRef securityRoleRef = (SecurityRoleRef) digester.pop();
-        Wrapper wrapper = (Wrapper) digester.peek();
-        
-        wrapper.addSecurityReference(securityRoleRef.getName(),
-                securityRoleRef.getLink());
-
-        if (digester.getLogger().isDebugEnabled())
-            digester.getLogger().debug("pop SecurityRoleRef");
-    }
-}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r605000 [1/2] - in /tomcat/trunk/java/org/apache: ./ catalina/core/ catalina/deploy/ catalina/security/ catalina/startup/ catalina/util/ jasper/ jasper/compiler/ jasper/runtime/ jasper/servlet/

Posted by Mark Thomas <ma...@apache.org>.
Filip Hanik - Dev Lists wrote:
> ok, this should take care of the problem, sorry for the delay

Delay? That was pretty speedy ;)

Your change fixes the problem I was seeing. Veto withdrawn.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r605000 [1/2] - in /tomcat/trunk/java/org/apache: ./ catalina/core/ catalina/deploy/ catalina/security/ catalina/startup/ catalina/util/ jasper/ jasper/compiler/ jasper/runtime/ jasper/servlet/

Posted by Filip Hanik - Dev Lists <de...@hanik.com>.
ok, this should take care of the problem, sorry for the delay

http://svn.apache.org/viewvc?rev=607800&view=rev

Filip

Mark Thomas wrote:
> Filip Hanik - Dev Lists wrote:
>   
>> Mark Thomas wrote:
>>     
>>> fhanik@apache.org wrote:
>>>  
>>>       
>>>> Author: fhanik
>>>> Date: Mon Dec 17 12:55:56 2007
>>>> New Revision: 605000
>>>>
>>>> URL: http://svn.apache.org/viewvc?rev=605000&view=rev
>>>> Log:
>>>> port new annotation logic from previous trunk
>>>>     
>>>>         
>>> -1.
>>>   
>>>       
>> give it some time, before you veto it, not a release branch, no need to
>> spill the eggnog yet :)
>>     
>
> It wasn't meant to be a particularly strong veto but it is a veto. I am not
> asking for an immediate revert (since I can revert it locally), I am asking
> that the code gets fixed in the short to medium term.
>
>   
>> I will look into it
>>     
>
> Great - that is all I was looking for.
>
>   
>>> An unrelated minor point is org.apache.InstanceManager should be moved,
>>> probably to org.apache.catalina.InstanceManager, as we don't have control
>>> over the org.apache package.
>>>   
>>>       
>> no-can-do, this was discussed previously, I suggested org.apache.tomcat
>> and that was turned down, see archives
>>     
>
> I remember the discussion. If you don't want to move it as part of your
> patch I'll wait until these changes are complete and then propose a patch
> to move any classes still in org.apache and we'll see what votes the patch
> gets.
>
> Mark
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
>
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r605000 [1/2] - in /tomcat/trunk/java/org/apache: ./ catalina/core/ catalina/deploy/ catalina/security/ catalina/startup/ catalina/util/ jasper/ jasper/compiler/ jasper/runtime/ jasper/servlet/

Posted by Mark Thomas <ma...@apache.org>.
Filip Hanik - Dev Lists wrote:
> Mark Thomas wrote:
>> fhanik@apache.org wrote:
>>  
>>> Author: fhanik
>>> Date: Mon Dec 17 12:55:56 2007
>>> New Revision: 605000
>>>
>>> URL: http://svn.apache.org/viewvc?rev=605000&view=rev
>>> Log:
>>> port new annotation logic from previous trunk
>>>     
>>
>> -1.
>>   
> give it some time, before you veto it, not a release branch, no need to
> spill the eggnog yet :)

It wasn't meant to be a particularly strong veto but it is a veto. I am not
asking for an immediate revert (since I can revert it locally), I am asking
that the code gets fixed in the short to medium term.

> I will look into it

Great - that is all I was looking for.

>> An unrelated minor point is org.apache.InstanceManager should be moved,
>> probably to org.apache.catalina.InstanceManager, as we don't have control
>> over the org.apache package.
>>   
> no-can-do, this was discussed previously, I suggested org.apache.tomcat
> and that was turned down, see archives

I remember the discussion. If you don't want to move it as part of your
patch I'll wait until these changes are complete and then propose a patch
to move any classes still in org.apache and we'll see what votes the patch
gets.

Mark

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r605000 [1/2] - in /tomcat/trunk/java/org/apache: ./ catalina/core/ catalina/deploy/ catalina/security/ catalina/startup/ catalina/util/ jasper/ jasper/compiler/ jasper/runtime/ jasper/servlet/

Posted by Filip Hanik - Dev Lists <de...@hanik.com>.
Mark Thomas wrote:
> fhanik@apache.org wrote:
>   
>> Author: fhanik
>> Date: Mon Dec 17 12:55:56 2007
>> New Revision: 605000
>>
>> URL: http://svn.apache.org/viewvc?rev=605000&view=rev
>> Log:
>> port new annotation logic from previous trunk
>>     
>
> -1.
>   
give it some time, before you veto it, not a release branch, no need to 
spill the eggnog yet :)
> With this patch in place I get a whole bunch of ISEs in the logs when I
> restart a webapp. I have included an example at the end of this message.
> For info, org.apache.markt.bug40593.Listener is the world's simplest
> HttpSessionListener that just writes a short message to stdout on session
> creation and destruction.
>   
I will look into it
> An unrelated minor point is org.apache.InstanceManager should be moved,
> probably to org.apache.catalina.InstanceManager, as we don't have control
> over the org.apache package.
>   
no-can-do, this was discussed previously, I suggested org.apache.tomcat 
and that was turned down, see archives

Filip
> Mark
>
> Example stack trace:
>
> 27-Dec-2007 11:45:04 org.apache.catalina.loader.WebappClassLoader loadClass
> INFO: Illegal access: this web application instance has been stopped
> already.  Could not load org.apache.markt.bug40593.Listener.  The eventual
> following stack trace is caused by an error thrown for debugging purposes
> as well as to attempt
> to terminate the thread which caused the illegal access, and has no
> functional impact.
> java.lang.IllegalStateException
>         at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1245)
>         at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
>         at
> org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:345)
>         at
> org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:327)
>         at
> org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:115)
>         at
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3782)
>         at
> org.apache.catalina.core.StandardContext.start(StandardContext.java:4334)
>         at
> org.apache.catalina.core.StandardContext.reload(StandardContext.java:3096)
>         at
> org.apache.catalina.manager.ManagerServlet.reload(ManagerServlet.java:912)
>         at
> org.apache.catalina.manager.HTMLManagerServlet.reload(HTMLManagerServlet.java:529)
>         at
> org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:113)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>         at
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>         at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>         at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>         at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
>         at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>         at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
>         at
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>         at java.lang.Thread.run(Thread.java:619)
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
>
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r605000 [1/2] - in /tomcat/trunk/java/org/apache: ./ catalina/core/ catalina/deploy/ catalina/security/ catalina/startup/ catalina/util/ jasper/ jasper/compiler/ jasper/runtime/ jasper/servlet/

Posted by Mark Thomas <ma...@apache.org>.
fhanik@apache.org wrote:
> Author: fhanik
> Date: Mon Dec 17 12:55:56 2007
> New Revision: 605000
> 
> URL: http://svn.apache.org/viewvc?rev=605000&view=rev
> Log:
> port new annotation logic from previous trunk

-1.

With this patch in place I get a whole bunch of ISEs in the logs when I
restart a webapp. I have included an example at the end of this message.
For info, org.apache.markt.bug40593.Listener is the world's simplest
HttpSessionListener that just writes a short message to stdout on session
creation and destruction.

An unrelated minor point is org.apache.InstanceManager should be moved,
probably to org.apache.catalina.InstanceManager, as we don't have control
over the org.apache package.

Mark

Example stack trace:

27-Dec-2007 11:45:04 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped
already.  Could not load org.apache.markt.bug40593.Listener.  The eventual
following stack trace is caused by an error thrown for debugging purposes
as well as to attempt
to terminate the thread which caused the illegal access, and has no
functional impact.
java.lang.IllegalStateException
        at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1245)
        at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
        at
org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:345)
        at
org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:327)
        at
org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:115)
        at
org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3782)
        at
org.apache.catalina.core.StandardContext.start(StandardContext.java:4334)
        at
org.apache.catalina.core.StandardContext.reload(StandardContext.java:3096)
        at
org.apache.catalina.manager.ManagerServlet.reload(ManagerServlet.java:912)
        at
org.apache.catalina.manager.HTMLManagerServlet.reload(HTMLManagerServlet.java:529)
        at
org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:113)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org