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]>