You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/04/16 16:11:13 UTC

svn commit: r1587911 - in /tomcat/trunk: java/org/apache/catalina/core/StandardHost.java java/org/apache/catalina/loader/WebappClassLoader.java java/org/apache/catalina/loader/WebappLoader.java webapps/docs/changelog.xml

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org