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

Reply via email to