Author: markt Date: Wed Apr 16 14:11:13 2014 New Revision: 1587911 URL: http://svn.apache.org/r1587911 Log: Improve implementation of Lifecycle for WebappClassLoader. State is now correctly reported rather than always reporting as NEW.
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardHost.java tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/core/StandardHost.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardHost.java?rev=1587911&r1=1587910&r2=1587911&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardHost.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardHost.java Wed Apr 16 14:11:13 2014 @@ -733,7 +733,7 @@ public class StandardHost extends Contai childClassLoaders.entrySet()) { ClassLoader cl = entry.getKey(); if (cl instanceof WebappClassLoader) { - if (!((WebappClassLoader) cl).isStarted()) { + if (!((WebappClassLoader) cl).getState().isAvailable()) { result.add(entry.getValue()); } } 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=1587911&r1=1587910&r2=1587911&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Wed Apr 16 14:11:13 2014 @@ -345,12 +345,6 @@ public class WebappClassLoader extends U /** - * Has this component been started? - */ - protected boolean started = false; - - - /** * need conversion for properties files */ protected boolean needConvert = false; @@ -426,6 +420,9 @@ public class WebappClassLoader extends U */ private boolean hasExternalRepositories = false; + private volatile LifecycleState state = LifecycleState.NEW; + + // ------------------------------------------------------------- Properties /** @@ -714,7 +711,7 @@ public class WebappClassLoader extends U result.resources = this.resources; result.delegate = this.delegate; - result.started = this.started; + result.state = this.state; result.needConvert = this.needConvert; result.clearReferencesStatic = this.clearReferencesStatic; result.clearReferencesStopThreads = this.clearReferencesStopThreads; @@ -848,7 +845,7 @@ public class WebappClassLoader extends U log.debug(" findClass(" + name + ")"); // Cannot load anything from local repositories if class loader is stopped - if (!started) { + if (!state.isAvailable()) { throw new ClassNotFoundException(name); } @@ -1211,7 +1208,7 @@ public class WebappClassLoader extends U Class<?> clazz = null; // Log access to stopped classloader - if (!started) { + if (!state.isAvailable()) { try { throw new IllegalStateException(); } catch (IllegalStateException e) { @@ -1419,7 +1416,7 @@ public class WebappClassLoader extends U */ @Override public LifecycleState getState() { - return LifecycleState.NEW; + return state; } @@ -1434,7 +1431,7 @@ public class WebappClassLoader extends U @Override public void init() { - // NOOP + state = LifecycleState.INITIALIZED; } @@ -1446,6 +1443,8 @@ public class WebappClassLoader extends U @Override public void start() throws LifecycleException { + state = LifecycleState.STARTING_PREP; + WebResource classes = resources.getResource("/WEB-INF/classes"); if (classes.isDirectory() && classes.canRead()) { addURL(classes.getURL()); @@ -1459,7 +1458,8 @@ public class WebappClassLoader extends U } } - started = true; + state = LifecycleState.STARTING; + String encoding = null; try { encoding = System.getProperty("file.encoding"); @@ -1470,13 +1470,10 @@ public class WebappClassLoader extends U needConvert = true; } + state = LifecycleState.STARTED; } - public boolean isStarted() { - return started; - } - /** * Stop the class loader. * @@ -1485,11 +1482,13 @@ public class WebappClassLoader extends U @Override public void stop() throws LifecycleException { + state = LifecycleState.STOPPING_PREP; + // Clearing references should be done before setting started to // false, due to possible side effects clearReferences(); - started = false; + state = LifecycleState.STOPPING; resourceEntries.clear(); jarModificationTimes.clear(); @@ -1497,12 +1496,14 @@ public class WebappClassLoader extends U permissionList.clear(); loaderPC.clear(); + + state = LifecycleState.STOPPED; } @Override public void destroy() { - // NOOP + state = LifecycleState.DESTROYED; } @@ -2512,7 +2513,7 @@ public class WebappClassLoader extends U */ protected ResourceEntry findResourceInternal(final String name, final String path) { - if (!started) { + if (!state.isAvailable()) { log.info(sm.getString("webappClassLoader.stopped", name)); return null; } Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java?rev=1587911&r1=1587910&r2=1587911&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java Wed Apr 16 14:11:13 2014 @@ -444,7 +444,8 @@ public class WebappLoader extends Lifecy // Throw away our current class loader if (classLoader != null) { - ((Lifecycle) classLoader).stop(); + classLoader.stop(); + classLoader.destroy(); } try { Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1587911&r1=1587910&r2=1587911&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Wed Apr 16 14:11:13 2014 @@ -97,6 +97,11 @@ reverts all the operations performed when adding an MBean notification listener. (markt) </fix> + <scode> + Improve implementation of <code>Lifecycle</code> for + <code>WebappClassLoader</code>. State is now correctly reported rather + than always reporting as <code>NEW</code>. (markt) + </scode> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org