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