craigmcc 02/03/09 17:23:30
Modified: src/share/org/apache/struts/action ActionServlet.java
DynaActionFormClass.java RequestProcessor.java
src/share/org/apache/struts/config ApplicationConfig.java
ConfigRuleSet.java
src/share/org/apache/struts/util GenericDataSource.java
MessageResourcesFactory.java RequestUtils.java
Log:
Update all cases where instances of application classes are dynamically
instantiated to use the context class loader for the current thread, if it
has been set. Servlet 2.3 containers are required to set the context class
loader to the class loader for this webapp, although nearly all Servlet 2.2
containers seem to provide it also.
The effect of this change is that, on a container that supports the thread
context class loader, you will be able to place a single copy of struts.jar
in a shared repository (such as the "lib" directory for Tomcat 4.0) and
still be able to access action, form bean, and other classes from inside
each web application correctly -- a highly requested enhancement.
Revision Changes Path
1.96 +7 -6
jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java
Index: ActionServlet.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -r1.95 -r1.96
--- ActionServlet.java 9 Mar 2002 22:26:35 -0000 1.95
+++ ActionServlet.java 10 Mar 2002 01:23:29 -0000 1.96
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 1.95
2002/03/09 22:26:35 craigmcc Exp $
- * $Revision: 1.95 $
- * $Date: 2002/03/09 22:26:35 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 1.96
2002/03/10 01:23:29 craigmcc Exp $
+ * $Revision: 1.96 $
+ * $Date: 2002/03/10 01:23:29 $
*
* ====================================================================
*
@@ -269,7 +269,7 @@
*
* @author Craig R. McClanahan
* @author Ted Husted
- * @version $Revision: 1.95 $ $Date: 2002/03/09 22:26:35 $
+ * @version $Revision: 1.96 $ $Date: 2002/03/10 01:23:29 $
*/
public class ActionServlet
@@ -837,8 +837,8 @@
}
DataSource ds = null;
try {
- Class clazz = Class.forName(dscs[i].getType());
- ds = (DataSource) clazz.newInstance();
+ ds = (DataSource)
+ RequestUtils.applicationInstance(dscs[i].getType());
BeanUtils.populate(ds, dscs[i].getProperties());
ds.setLogWriter(scw);
if (ds instanceof GenericDataSource) {
@@ -952,6 +952,7 @@
configDigester.setDebug(detail);
configDigester.setNamespaceAware(true);
configDigester.setValidating(validating);
+ configDigester.setUseContextClassLoader(true);
configDigester.addRuleSet(new ConfigRuleSet());
for (int i = 0; i < registrations.length; i += 2) {
URL url = this.getClass().getResource(registrations[i+1]);
1.3 +6 -6
jakarta-struts/src/share/org/apache/struts/action/DynaActionFormClass.java
Index: DynaActionFormClass.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/DynaActionFormClass.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DynaActionFormClass.java 17 Jan 2002 21:26:18 -0000 1.2
+++ DynaActionFormClass.java 10 Mar 2002 01:23:29 -0000 1.3
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/DynaActionFormClass.java,v
1.2 2002/01/17 21:26:18 craigmcc Exp $
- * $Revision: 1.2 $
- * $Date: 2002/01/17 21:26:18 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/DynaActionFormClass.java,v
1.3 2002/03/10 01:23:29 craigmcc Exp $
+ * $Revision: 1.3 $
+ * $Date: 2002/03/10 01:23:29 $
*
* ====================================================================
*
@@ -71,6 +71,7 @@
import org.apache.commons.beanutils.DynaProperty;
import org.apache.struts.config.FormBeanConfig;
import org.apache.struts.config.FormPropertyConfig;
+import org.apache.struts.util.RequestUtils;
/**
@@ -82,7 +83,7 @@
* to consult this documentation.</p>
*
* @author Craig McClanahan
- * @version $Revision: 1.2 $ $Date: 2002/01/17 21:26:18 $
+ * @version $Revision: 1.3 $ $Date: 2002/03/10 01:23:29 $
* @since Struts 1.1
*/
@@ -316,8 +317,7 @@
// Validate the ActionFormBean implementation class
try {
- // FIXME - Use thread context loader?
- beanClass = Class.forName(config.getType());
+ beanClass = RequestUtils.applicationClass(config.getType());
} catch (Throwable t) {
throw new IllegalArgumentException
("Cannot instantiate ActionFormBean class '" +
1.7 +7 -8
jakarta-struts/src/share/org/apache/struts/action/RequestProcessor.java
Index: RequestProcessor.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/RequestProcessor.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- RequestProcessor.java 10 Mar 2002 00:37:17 -0000 1.6
+++ RequestProcessor.java 10 Mar 2002 01:23:29 -0000 1.7
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/RequestProcessor.java,v
1.6 2002/03/10 00:37:17 craigmcc Exp $
- * $Revision: 1.6 $
- * $Date: 2002/03/10 00:37:17 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/RequestProcessor.java,v
1.7 2002/03/10 01:23:29 craigmcc Exp $
+ * $Revision: 1.7 $
+ * $Date: 2002/03/10 01:23:29 $
*
* ====================================================================
*
@@ -94,7 +94,7 @@
* interested in changing.</p>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.6 $ $Date: 2002/03/10 00:37:17 $
+ * @version $Revision: 1.7 $ $Date: 2002/03/10 01:23:29 $
* @since Struts 1.1
*/
@@ -312,8 +312,8 @@
}
synchronized (actions) {
try {
- Class clazz = Class.forName(className);
- instance = (Action) clazz.newInstance();
+ instance = (Action)
+ RequestUtils.applicationInstance(className);
instance.setServlet(this.servlet);
actions.put(className, instance);
} catch (Throwable t) {
@@ -499,9 +499,8 @@
// Use the configured exception handling
try {
- Class handlerClass = Class.forName(config.getHandler());
ExceptionHandler handler = (ExceptionHandler)
- handlerClass.newInstance();
+ RequestUtils.applicationInstance(config.getHandler());
return (handler.execute(exception, config, mapping, form,
request, response));
} catch (Exception e) {
1.12 +8 -7
jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java
Index: ApplicationConfig.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ApplicationConfig.java 4 Mar 2002 05:38:23 -0000 1.11
+++ ApplicationConfig.java 10 Mar 2002 01:23:30 -0000 1.12
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java,v
1.11 2002/03/04 05:38:23 martinc Exp $
- * $Revision: 1.11 $
- * $Date: 2002/03/04 05:38:23 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java,v
1.12 2002/03/10 01:23:30 craigmcc Exp $
+ * $Revision: 1.12 $
+ * $Date: 2002/03/10 01:23:30 $
*
* ====================================================================
*
@@ -71,6 +71,7 @@
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.action.RequestProcessor;
+import org.apache.struts.util.RequestUtils;
@@ -84,7 +85,7 @@
* previous Struts behavior that only supported one application.</p>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.11 $ $Date: 2002/03/04 05:38:23 $
+ * @version $Revision: 1.12 $ $Date: 2002/03/10 01:23:30 $
* @since Struts 1.1
*/
@@ -221,9 +222,9 @@
if (processor == null) {
try {
- Class clazz =
- Class.forName(getControllerConfig().getProcessorClass());
- processor = (RequestProcessor) clazz.newInstance();
+ processor = (RequestProcessor)
+ RequestUtils.applicationInstance
+ (getControllerConfig().getProcessorClass());
processor.init(servlet, this);
} catch (Throwable t) {
throw new UnavailableException
1.10 +7 -6
jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java
Index: ConfigRuleSet.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ConfigRuleSet.java 4 Mar 2002 05:38:23 -0000 1.9
+++ ConfigRuleSet.java 10 Mar 2002 01:23:30 -0000 1.10
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java,v 1.9
2002/03/04 05:38:23 martinc Exp $
- * $Revision: 1.9 $
- * $Date: 2002/03/04 05:38:23 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java,v 1.10
2002/03/10 01:23:30 craigmcc Exp $
+ * $Revision: 1.10 $
+ * $Date: 2002/03/10 01:23:30 $
*
* ====================================================================
*
@@ -67,6 +67,7 @@
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.Rule;
import org.apache.commons.digester.RuleSetBase;
+import org.apache.struts.util.RequestUtils;
import org.xml.sax.Attributes;
@@ -75,7 +76,7 @@
* configuration file (<code>struts-config.xml</code>).</p>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.9 $ $Date: 2002/03/04 05:38:23 $
+ * @version $Revision: 1.10 $ $Date: 2002/03/10 01:23:30 $
* @since Struts 1.1
*/
@@ -338,8 +339,8 @@
// Instantiate the new object and return it
Object actionMapping = null;
try {
- Class clazz = digester.getClassLoader().loadClass(className);
- actionMapping = clazz.newInstance();
+ actionMapping =
+ RequestUtils.applicationInstance(className);
} catch (Exception e) {
digester.log("ActionMappingFactory.createObject: ", e);
}
1.11 +5 -6
jakarta-struts/src/share/org/apache/struts/util/GenericDataSource.java
Index: GenericDataSource.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/GenericDataSource.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- GenericDataSource.java 9 Mar 2002 22:26:35 -0000 1.10
+++ GenericDataSource.java 10 Mar 2002 01:23:30 -0000 1.11
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/GenericDataSource.java,v
1.10 2002/03/09 22:26:35 craigmcc Exp $
- * $Revision: 1.10 $
- * $Date: 2002/03/09 22:26:35 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/GenericDataSource.java,v
1.11 2002/03/10 01:23:30 craigmcc Exp $
+ * $Revision: 1.11 $
+ * $Date: 2002/03/10 01:23:30 $
*
* ====================================================================
*
@@ -180,7 +180,7 @@
*
* @author Craig R. McClanahan
* @author Ted Husted
- * @version $Revision: 1.10 $ $Date: 2002/03/09 22:26:35 $
+ * @version $Revision: 1.11 $ $Date: 2002/03/10 01:23:30 $
*/
public class GenericDataSource implements DataSource {
@@ -677,8 +677,7 @@
// Instantiate our database driver
try {
- Class clazz = Class.forName(driverClass);
- driver = (Driver) clazz.newInstance();
+ driver = (Driver) RequestUtils.applicationInstance(driverClass);
} catch (Throwable t) {
throw new SQLException("open: " + t);
}
1.7 +5 -5
jakarta-struts/src/share/org/apache/struts/util/MessageResourcesFactory.java
Index: MessageResourcesFactory.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/MessageResourcesFactory.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- MessageResourcesFactory.java 9 Mar 2002 22:26:35 -0000 1.6
+++ MessageResourcesFactory.java 10 Mar 2002 01:23:30 -0000 1.7
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/MessageResourcesFactory.java,v
1.6 2002/03/09 22:26:35 craigmcc Exp $
- * $Revision: 1.6 $
- * $Date: 2002/03/09 22:26:35 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/MessageResourcesFactory.java,v
1.7 2002/03/10 01:23:30 craigmcc Exp $
+ * $Revision: 1.7 $
+ * $Date: 2002/03/10 01:23:30 $
*
* ====================================================================
*
@@ -83,7 +83,7 @@
* </ul>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.6 $ $Date: 2002/03/09 22:26:35 $
+ * @version $Revision: 1.7 $ $Date: 2002/03/10 01:23:30 $
*/
public abstract class MessageResourcesFactory implements Serializable {
@@ -166,7 +166,7 @@
// Construct a new instance of the specified factory class
try {
if (clazz == null)
- clazz = Class.forName(factoryClass);
+ clazz = RequestUtils.applicationClass(factoryClass);
MessageResourcesFactory factory =
(MessageResourcesFactory) clazz.newInstance();
return (factory);
1.33 +57 -9
jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java
Index: RequestUtils.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- RequestUtils.java 9 Mar 2002 22:26:35 -0000 1.32
+++ RequestUtils.java 10 Mar 2002 01:23:30 -0000 1.33
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java,v 1.32
2002/03/09 22:26:35 craigmcc Exp $
- * $Revision: 1.32 $
- * $Date: 2002/03/09 22:26:35 $
+ * $Header:
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java,v 1.33
2002/03/10 01:23:30 craigmcc Exp $
+ * $Revision: 1.33 $
+ * $Date: 2002/03/10 01:23:30 $
*
* ====================================================================
*
@@ -110,7 +110,7 @@
*
* @author Craig R. McClanahan
* @author Ted Husted
- * @version $Revision: 1.32 $ $Date: 2002/03/09 22:26:35 $
+ * @version $Revision: 1.33 $ $Date: 2002/03/10 01:23:30 $
*/
public class RequestUtils {
@@ -169,6 +169,56 @@
/**
+ * Return the <code>Class</code> object for the specified fully qualified
+ * class name, from this web application's class loader.
+ *
+ * @param className Fully qualified class name to be loaded
+ *
+ * @exception ClassNotFoundException if the class cannot be found
+ */
+ public static Class applicationClass(String className)
+ throws ClassNotFoundException {
+
+ // Look up the class loader to be used
+ ClassLoader classLoader =
+ Thread.currentThread().getContextClassLoader();
+ if (classLoader == null) {
+ classLoader = RequestUtils.class.getClassLoader();
+ }
+
+ // Attempt to load the specified class
+ return (classLoader.loadClass(className));
+
+ }
+
+
+ /**
+ * Return a new instance of the specified fully qualified class name,
+ * after loading the class from this web application's class loader.
+ * The specified class <strong>MUST</strong> have a public zero-arguments
+ * constructor.
+ *
+ * @param className Fully qualified class name to use
+ *
+ * @exception ClassNotFoundException if the class cannot be found
+ * @exception IllegalAccessException if the class or its constructor
+ * is not accessible
+ * @exception InstantiationException if this class represents an
+ * abstract class, an interface, an array class, a primitive type,
+ * or void
+ * @exception InstantiationException if this class has no
+ * zero-arguments constructor
+ */
+ public static Object applicationInstance(String className)
+ throws ClassNotFoundException, IllegalAccessException,
+ InstantiationException {
+
+ return (applicationClass(className).newInstance());
+
+ }
+
+
+ /**
* Compute a set of query parameters that will be dynamically added to
* a generated URL. The returned Map is keyed by parameter name, and the
* values are either null (no value specified), a String (single value
@@ -557,9 +607,7 @@
}
} else {
try {
- // FIXME - thread context class loader?
- Class clazz = Class.forName(config.getType());
- instance = (ActionForm) clazz.newInstance();
+ instance = (ActionForm) applicationInstance(config.getType());
} catch (Throwable t) {
LOG.error(servlet.getInternal().getMessage
("formBean", config.getType()), t);
@@ -938,7 +986,7 @@
if (multipartClass != null) {
try {
multipartHandler = (MultipartRequestHandler)
- Class.forName(multipartClass).newInstance();
+ applicationInstance(multipartClass);
}
catch (ClassNotFoundException cnfe) {
LOG.error("MultipartRequestHandler class \"" +
@@ -970,7 +1018,7 @@
if (multipartClass != null) {
try {
multipartHandler = (MultipartRequestHandler)
- Class.forName(multipartClass).newInstance();
+ applicationInstance(multipartClass);
}
catch (ClassNotFoundException cnfe) {
throw new ServletException("Cannot find multipart class \"" +
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>