Author: markt
Date: Mon May 19 19:38:13 2014
New Revision: 1596004

URL: http://svn.apache.org/r1596004
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56387
Refactor handling of class loading attempts after web application stop.

Modified:
    tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=1596004&r1=1596003&r2=1596004&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Mon May 
19 19:38:13 2014
@@ -852,10 +852,7 @@ public class WebappClassLoader extends U
         if (log.isDebugEnabled())
             log.debug("    findClass(" + name + ")");
 
-        // Cannot load anything from local repositories if class loader is 
stopped
-        if (!state.isAvailable()) {
-            throw new ClassNotFoundException(name);
-        }
+        checkStateForClassLoading(name);
 
         // (1) Permission to define this class when using a SecurityManager
         if (securityManager != null) {
@@ -1215,14 +1212,8 @@ public class WebappClassLoader extends U
             log.debug("loadClass(" + name + ", " + resolve + ")");
         Class<?> clazz = null;
 
-        // Log access to stopped classloader
-        if (!state.isAvailable()) {
-            try {
-                throw new IllegalStateException();
-            } catch (IllegalStateException e) {
-                log.info(sm.getString("webappClassLoader.stopped", name), e);
-            }
-        }
+        // Log access to stopped class loader
+        checkStateForClassLoading(name);
 
         // (0) Check our previously loaded local class cache
         clazz = findLoadedClass0(name);
@@ -1331,7 +1322,19 @@ public class WebappClassLoader extends U
         }
 
         throw new ClassNotFoundException(name);
+    }
+
 
+    protected void checkStateForClassLoading(String className) {
+        // It is not permitted to load new classes once the web application has
+        // been stopped.
+        if (!state.isAvailable()) {
+            String msg = sm.getString("webappClassLoader.stopped", className);
+            IllegalStateException cause = new IllegalStateException(msg);
+            ClassNotFoundException cnfe = new ClassNotFoundException();
+            cnfe.initCause(cause);
+            log.info(msg, cnfe);
+        }
     }
 
 

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1596004&r1=1596003&r2=1596004&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon May 19 19:38:13 2014
@@ -47,6 +47,12 @@
 <section name="Tomcat 8.0.9 (markt)">
   <subsection name="Catalina">
     <changelog>
+     <scode>
+       <bug>56387</bug>: Improve the code that handles an attempt to load a
+       class after a web application has been stopped. Use common code to 
handle
+       this case regardless of the access path and don't throw an exception
+       purely to log a stack trace. (markt)
+     </scode>
       <scode>
         <bug>56399</bug>: Improve implementation of 
CoyoteAdapter.checkRecycled()
         to do not use an exception for flow control. (kkolinko)



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to