remm        01/06/23 14:56:38

  Modified:    catalina/src/share/org/apache/catalina/core
                        StandardWrapper.java
  Log:
  - Make sure the old CL is bound after loading the servlet class. If there was
    an exception, the new CL could remain bound.
  
  Revision  Changes    Path
  1.25      +40 -13    
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java
  
  Index: StandardWrapper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- StandardWrapper.java      2001/05/14 04:51:19     1.24
  +++ StandardWrapper.java      2001/06/23 21:56:38     1.25
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v
 1.24 2001/05/14 04:51:19 craigmcc Exp $
  - * $Revision: 1.24 $
  - * $Date: 2001/05/14 04:51:19 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/StandardWrapper.java,v
 1.25 2001/06/23 21:56:38 remm Exp $
  + * $Revision: 1.25 $
  + * $Date: 2001/06/23 21:56:38 $
    *
    * ====================================================================
    *
  @@ -105,7 +105,7 @@
    * make them efficient are counter-productive.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.24 $ $Date: 2001/05/14 04:51:19 $
  + * @version $Revision: 1.25 $ $Date: 2001/06/23 21:56:38 $
    */
   
   public final class StandardWrapper
  @@ -785,24 +785,39 @@
               log(sm.getString("standardWrapper.jasperLoader", getName()));
           }
   
  +        // Set the context class loader
  +        if (classLoader != null) {
  +            Thread.currentThread().setContextClassLoader(classLoader);
  +        }
  +
        // Load the specified servlet class from the appropriate class loader
        Class classClass = null;
        try {
  -         if (classLoader != null)
  +         if (classLoader != null) {
                classClass = classLoader.loadClass(actualClass);
  -         else
  +         } else {
                classClass = Class.forName(actualClass);
  +            }
        } catch (ClassNotFoundException e) {
            unavailable(null);
  +            // Restore the context ClassLoader
  +         if (classLoader != null) {
  +                Thread.currentThread().setContextClassLoader
  +                    (oldCtxClassLoader);
  +            }
            throw new ServletException
                (sm.getString("standardWrapper.missingClass", actualClass),
                 e);
        }
        if (classClass == null) {
  -         unavailable(null);
  -         throw new ServletException
  -             (sm.getString("standardWrapper.missingClass", actualClass));
  -     }
  +            unavailable(null);
  +            if (classLoader != null) {
  +                Thread.currentThread().setContextClassLoader
  +                    (oldCtxClassLoader);
  +            }
  +            throw new ServletException
  +                (sm.getString("standardWrapper.missingClass", actualClass));
  +        }
   
        // Instantiate and initialize an instance of the servlet class itself
        Servlet servlet = null;
  @@ -810,10 +825,20 @@
            servlet = (Servlet) classClass.newInstance();
        } catch (ClassCastException e) {
            unavailable(null);
  +            // Restore the context ClassLoader
  +         if (classLoader != null) {
  +                Thread.currentThread().setContextClassLoader
  +                    (oldCtxClassLoader);
  +            }
            throw new ServletException
                (sm.getString("standardWrapper.notServlet", actualClass), e);
        } catch (Throwable e) {
            unavailable(null);
  +            // Restore the context ClassLoader
  +         if (classLoader != null) {
  +                Thread.currentThread().setContextClassLoader
  +                    (oldCtxClassLoader);
  +            }
            throw new ServletException
                (sm.getString("standardWrapper.instantiate", actualClass), e);
        }
  @@ -829,7 +854,6 @@
        try {
            instanceSupport.fireInstanceEvent(InstanceEvent.BEFORE_INIT_EVENT,
                                              servlet);
  -            Thread.currentThread().setContextClassLoader(classLoader);
            servlet.init(facade);
            instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,
                                              servlet);
  @@ -852,8 +876,11 @@
            throw new ServletException
                (sm.getString("standardWrapper.initException", getName()), f);
        } finally {
  -            // restore the context ClassLoader
  -            Thread.currentThread().setContextClassLoader(oldCtxClassLoader);
  +            // Restore the context ClassLoader
  +            if (classLoader != null) {
  +                Thread.currentThread().setContextClassLoader
  +                    (oldCtxClassLoader);
  +            }
           }
   
        // Register our newly initialized instance
  
  
  

Reply via email to