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 2011/06/15 22:32:15 UTC

svn commit: r1136179 - in /tomcat/trunk: java/org/apache/catalina/core/StandardWrapper.java test/org/apache/catalina/core/TestStandardContext.java

Author: markt
Date: Wed Jun 15 20:32:14 2011
New Revision: 1136179

URL: http://svn.apache.org/viewvc?rev=1136179&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51376
Complete fix. Ensure Servlet.destroy() is only called if Servlet.init() was called.

Modified:
    tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
    tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java?rev=1136179&r1=1136178&r2=1136179&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java Wed Jun 15 20:32:14 2011
@@ -1375,53 +1375,55 @@ public class StandardWrapper extends Con
             }
         }
 
-        PrintStream out = System.out;
-        if (swallowOutput) {
-            SystemLogHandler.startCapture();
-        }
-
-        // Call the servlet destroy() method
-        try {
-            instanceSupport.fireInstanceEvent
-              (InstanceEvent.BEFORE_DESTROY_EVENT, instance);
-
-            if( Globals.IS_SECURITY_ENABLED) {
-                SecurityUtil.doAsPrivilege("destroy",
-                                           instance);
-                SecurityUtil.remove(instance);                           
-            } else {
-                instance.destroy();
-            }
-            
-            instanceSupport.fireInstanceEvent
-              (InstanceEvent.AFTER_DESTROY_EVENT, instance);
-
-            // Annotation processing
-            if (!((Context) getParent()).getIgnoreAnnotations()) {
-               ((StandardContext)getParent()).getInstanceManager().destroyInstance(instance);
-            }
-
-        } catch (Throwable t) {
-            ExceptionUtils.handleThrowable(t);
-            instanceSupport.fireInstanceEvent
-              (InstanceEvent.AFTER_DESTROY_EVENT, instance, t);
-            instance = null;
-            instancePool = null;
-            nInstances = 0;
-            fireContainerEvent("unload", this);
-            unloading = false;
-            throw new ServletException
-                (sm.getString("standardWrapper.destroyException", getName()),
-                 t);
-        } finally {
-            // Write captured output
+        if (instanceInitialized) {
+            PrintStream out = System.out;
             if (swallowOutput) {
-                String log = SystemLogHandler.stopCapture();
-                if (log != null && log.length() > 0) {
-                    if (getServletContext() != null) {
-                        getServletContext().log(log);
-                    } else {
-                        out.println(log);
+                SystemLogHandler.startCapture();
+            }
+    
+            // Call the servlet destroy() method
+            try {
+                instanceSupport.fireInstanceEvent
+                  (InstanceEvent.BEFORE_DESTROY_EVENT, instance);
+    
+                if( Globals.IS_SECURITY_ENABLED) {
+                    SecurityUtil.doAsPrivilege("destroy",
+                                               instance);
+                    SecurityUtil.remove(instance);                           
+                } else {
+                    instance.destroy();
+                }
+                
+                instanceSupport.fireInstanceEvent
+                  (InstanceEvent.AFTER_DESTROY_EVENT, instance);
+    
+                // Annotation processing
+                if (!((Context) getParent()).getIgnoreAnnotations()) {
+                   ((StandardContext)getParent()).getInstanceManager().destroyInstance(instance);
+                }
+    
+            } catch (Throwable t) {
+                ExceptionUtils.handleThrowable(t);
+                instanceSupport.fireInstanceEvent
+                  (InstanceEvent.AFTER_DESTROY_EVENT, instance, t);
+                instance = null;
+                instancePool = null;
+                nInstances = 0;
+                fireContainerEvent("unload", this);
+                unloading = false;
+                throw new ServletException
+                    (sm.getString("standardWrapper.destroyException", getName()),
+                     t);
+            } finally {
+                // Write captured output
+                if (swallowOutput) {
+                    String log = SystemLogHandler.stopCapture();
+                    if (log != null && log.length() > 0) {
+                        if (getServletContext() != null) {
+                            getServletContext().log(log);
+                        } else {
+                            out.println(log);
+                        }
                     }
                 }
             }

Modified: tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java?rev=1136179&r1=1136178&r2=1136179&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestStandardContext.java Wed Jun 15 20:32:14 2011
@@ -321,7 +321,16 @@ public class TestStandardContext extends
         
     }
 
-    public void testBug51376() throws Exception {
+    public void testBug51376a() throws Exception {
+        doTestBug51376(false);
+    }
+
+    public void testBug51376b() throws Exception {
+        doTestBug51376(true);
+    }
+
+    private void doTestBug51376(boolean loadOnStartUp) throws Exception {
+
         // Set up a container
         Tomcat tomcat = getTomcatInstance();
 
@@ -330,7 +339,7 @@ public class TestStandardContext extends
         Context ctx = tomcat.addContext("", docBase.getAbsolutePath());
 
         // Add ServletContainerInitializer
-        Bug51376SCI sci = new Bug51376SCI();
+        Bug51376SCI sci = new Bug51376SCI(loadOnStartUp);
         ctx.addServletContainerInitializer(sci, null);
         
         // Start the context
@@ -347,6 +356,11 @@ public class TestStandardContext extends
             implements ServletContainerInitializer {
 
         private Bug51376Servlet s = null;
+        private boolean loadOnStartUp;
+
+        public Bug51376SCI(boolean loadOnStartUp) {
+            this.loadOnStartUp = loadOnStartUp;
+        }
 
         private Bug51376Servlet getServlet() {
             return s;
@@ -359,7 +373,9 @@ public class TestStandardContext extends
             s = new Bug51376Servlet();
             ServletRegistration.Dynamic sr = ctx.addServlet("bug51376", s);
             sr.addMapping("/bug51376");
-            sr.setLoadOnStartup(1);
+            if (loadOnStartUp) {
+                sr.setLoadOnStartup(1);
+            }
         }
     }
     
@@ -399,6 +415,8 @@ public class TestStandardContext extends
             if (initOk != null && initOk.booleanValue() && destoryOk != null &&
                     destoryOk.booleanValue()) {
                 return true;
+            } else if (initOk == null && destoryOk == null) {
+                return true;
             } else {
                 return false;
             }



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