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);