You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/11/03 19:39:12 UTC

svn commit: r1030602 - in /tomcat/tc6.0.x/trunk: STATUS.txt java/org/apache/catalina/startup/LifecycleListenerRule.java

Author: markt
Date: Wed Nov  3 18:39:11 2010
New Revision: 1030602

URL: http://svn.apache.org/viewvc?rev=1030602&view=rev
Log:
Make sure Contexts defined in server.xml pick up any configClass setting from the parent Host.

Modified:
    tomcat/tc6.0.x/trunk/STATUS.txt
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/LifecycleListenerRule.java

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1030602&r1=1030601&r2=1030602&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Wed Nov  3 18:39:11 2010
@@ -102,18 +102,6 @@ PATCHES PROPOSED TO BACKPORT:
    but from debugging it looks that it is called by Tomcat code only
    (JspServlet).
 
-* Make sure Contexts defined in server.xml pick up any configClass setting from
-  the parent Host.
-  http://people.apache.org/~markt/patches/2010-09-11-configClass.patch
-  +1: markt, kkolinko, kfujino
-  -1:
-   kkolinko: Though 1) I do not see any documentation on configClass attribute in
-    the docs at all. Though it is in JavaDoc for StandardHost.
-    2) It looks, formally, the patch does more than is announced. It applies to any
-    LifecycleListenerRule. Actually, though, for Engine's engineConfigClass attribute
-    and Host's hostConfigClass attribute it does not change their behaviour,
-    because their containers do not have those attributes.
-
 * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49497
   Stop accepting new requests (inc keep-alive) once the BIO connector is paused
   and the current request has finished processing

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/LifecycleListenerRule.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/LifecycleListenerRule.java?rev=1030602&r1=1030601&r2=1030602&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/LifecycleListenerRule.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/LifecycleListenerRule.java Wed Nov  3 18:39:11 2010
@@ -19,18 +19,28 @@
 package org.apache.catalina.startup;
 
 
+import org.apache.catalina.Container;
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleListener;
+import org.apache.tomcat.util.IntrospectionUtils;
 import org.apache.tomcat.util.digester.Rule;
 import org.xml.sax.Attributes;
 
 
 /**
- * <p>Rule that creates a new <code>LifecycleListener</code> instance,
- * and associates it with the top object on the stack (which must
- * implement <code>LifecycleListener</code>).</p>
+ * Rule that creates a new {@link LifecycleListener} and associates it with the
+ * top object on the stack which must implement {@link Container} and
+ * {@link Lifecycle}. The implementation class to be used is determined by:
+ * <ol>
+ * <li>Does the top element on the stack specify an implementation class using
+ *     the attribute specified when this rule was created?</li>
+ * <li>Does the parent {@link Container} of the {@link Container} on the top of
+ *     the stack specify an implementation class using the attribute specified
+ *     when this rule was created?</li>
+ * <li>Use the default implementation class specified when this rule was
+ *     created.</li>
+ * </ol>
  */
-
 public class LifecycleListenerRule extends Rule {
 
 
@@ -82,21 +92,43 @@ public class LifecycleListenerRule exten
     public void begin(String namespace, String name, Attributes attributes)
         throws Exception {
 
-        // Instantiate a new LifecyleListener implementation object
-        String className = listenerClass;
+        Container c = (Container) digester.peek();
+        Container p = null;
+        Object obj = digester.peek(1);
+        if (obj instanceof Container) {
+            p = (Container) obj;
+        }
+
+        String className = null;
+        
+        // Check the container for the specified attribute
         if (attributeName != null) {
             String value = attributes.getValue(attributeName);
             if (value != null)
                 className = value;
         }
-        Class clazz = Class.forName(className);
+
+        // Check the container's parent for the specified attribute
+        if (p != null && className == null) {
+            String configClass =
+                (String) IntrospectionUtils.getProperty(p, attributeName);
+            if (configClass != null && configClass.length() > 0) {
+                className = configClass;
+            }
+        }
+        
+        // Use the default
+        if (className == null) {
+            className = listenerClass;
+        }
+        
+        // Instantiate a new LifecyleListener implementation object
+        Class<?> clazz = Class.forName(className);
         LifecycleListener listener =
             (LifecycleListener) clazz.newInstance();
 
         // Add this LifecycleListener to our associated component
-        Lifecycle lifecycle = (Lifecycle) digester.peek();
-        lifecycle.addLifecycleListener(listener);
-
+        ((Lifecycle) c).addLifecycleListener(listener);
     }
 
 



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