remm        01/06/20 20:42:35

  Modified:    catalina/src/share/org/apache/catalina/startup Catalina.java
  Log:
  - Whenever a Loader element was specified in a Context, a StandardLoader
    was created, regardless on whether or not a className attribute was specified.
    This is now fixed, and the className attribute now works correctly.
  - The class implementing the loader interface must have a constructor accepting
    as parameter the parent class loader of the loader.
  - If no class name is specified, it will create a WebappLoader.
  - Thanks to Jon and his patience for helping me locate and fix that bug :)
  
  Revision  Changes    Path
  1.24      +51 -13    
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java
  
  Index: Catalina.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- Catalina.java     2001/06/16 20:23:19     1.23
  +++ Catalina.java     2001/06/21 03:42:35     1.24
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java,v
 1.23 2001/06/16 20:23:19 remm Exp $
  - * $Revision: 1.23 $
  - * $Date: 2001/06/16 20:23:19 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/startup/Catalina.java,v
 1.24 2001/06/21 03:42:35 remm Exp $
  + * $Revision: 1.24 $
  + * $Date: 2001/06/21 03:42:35 $
    *
    * ====================================================================
    *
  @@ -69,6 +69,7 @@
   import java.io.IOException;
   import java.io.OutputStream;
   import java.lang.reflect.InvocationTargetException;
  +import java.lang.reflect.Constructor;
   import java.net.Socket;
   import java.security.Security;
   import java.util.Stack;
  @@ -77,7 +78,7 @@
   import org.apache.catalina.LifecycleException;
   import org.apache.catalina.LifecycleListener;
   import org.apache.catalina.Server;
  -import org.apache.catalina.loader.StandardLoader;
  +import org.apache.catalina.Loader;
   import org.apache.catalina.util.xml.SaxContext;
   import org.apache.catalina.util.xml.XmlAction;
   import org.apache.catalina.util.xml.XmlMapper;
  @@ -97,7 +98,7 @@
    * </u>
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.23 $ $Date: 2001/06/16 20:23:19 $
  + * @version $Revision: 1.24 $ $Date: 2001/06/21 03:42:35 $
    */
   
   public class Catalina {
  @@ -358,12 +359,12 @@
           mapper.addRule("Server/Service/Engine/Host/Cluster",
                          mapper.setProperties());
           mapper.addRule("Server/Service/Engine/Host/Cluster",
  -                       mapper.addChild("setCluster", 
"org.apache.catalina.Cluster"));
  +                       mapper.addChild("setCluster", 
  +                                       "org.apache.catalina.Cluster"));
           
           createStartMapperContext("Server/Service/Engine/Host/Context", mapper);
  -        createStartMapperDefaultContext(
  -                                        "Server/Service/Engine/Host/DefaultContext",
  -                                        mapper);
  +        createStartMapperDefaultContext
  +            ("Server/Service/Engine/Host/DefaultContext", mapper);
           
           mapper.addRule("Server/Service/Engine/Host/Context/Manager/Store",
                          mapper.objectCreate(null, "className"));
  @@ -536,8 +537,8 @@
                       ("addLifecycleListener",
                        "org.apache.catalina.LifecycleListener"));
   
  -        mapper.addRule(prefix + "/Loader",
  -                       new CreateLoaderAction());
  +        mapper.addRule(prefix + "/Loader", new CreateLoaderAction
  +            ("org.apache.catalina.WebappLoader", "className"));
        mapper.addRule(prefix + "/Loader",
                       mapper.setProperties());
        mapper.addRule(prefix + "/Loader", mapper.addChild
  @@ -863,12 +864,38 @@
       /**
        * Construct a new action.
        */
  -    public CreateLoaderAction() {
  +    public CreateLoaderAction(String loaderClass) {
  +
  +        this(loaderClass, null);
  +
  +    }
  +
  +
  +    /**
  +     * Construct a new action.
  +     */
  +    public CreateLoaderAction(String loaderClass, String attributeName) {
  +
           super();
  +        this.loaderClass = loaderClass;
  +        this.attributeName = attributeName;
  +
       }
   
   
       /**
  +     * Classname of the loader.
  +     */
  +    protected String loaderClass;
  +
  +
  +    /**
  +     * The attribute name of the optional override class (if any).
  +     */
  +    protected String attributeName;
  +
  +
  +    /**
        * Add the requested Loader implemenation.
        */
       public void start(SaxContext context) throws Exception {
  @@ -879,7 +906,18 @@
           ClassLoader parentClassLoader = container.getParentClassLoader();
   
           // Instantiate a new Loader implementation object
  -        StandardLoader loader = new StandardLoader(parentClassLoader);
  +     String className = loaderClass;
  +     if (attributeName != null) {
  +         int top = context.getTagCount() - 1;
  +         AttributeList attributes = context.getAttributeList(top);
  +         if (attributes.getValue(attributeName) != null)
  +             className = attributes.getValue(attributeName);
  +     }
  +     Class clazz = Class.forName(className);
  +        Class[] paramTypes = { ClassLoader.class };
  +        Object[] arguments = { parentClassLoader };
  +        Constructor constructor = clazz.getDeclaredConstructor(paramTypes);
  +        Loader loader = (Loader) constructor.newInstance(arguments);
   
           // Push the new loader onto the stack
           stack.push(loader);
  
  
  

Reply via email to