Author: markt
Date: Fri Jun  1 10:16:50 2012
New Revision: 1345039

URL: http://svn.apache.org/viewvc?rev=1345039&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=53301
Prevent double initialisation of servlets when using existing servlet instances 
with embedded Tomcat

Modified:
    tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java
    tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java

Modified: tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java?rev=1345039&r1=1345038&r2=1345039&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/Tomcat.java Fri Jun  1 
10:16:50 2012
@@ -797,7 +797,6 @@ public class Tomcat {
      */
     public static class ExistingStandardWrapper extends StandardWrapper {
         private final Servlet existing;
-        boolean init = false;
 
         @SuppressWarnings("deprecation")
         public ExistingStandardWrapper( Servlet existing ) {
@@ -821,9 +820,9 @@ public class Tomcat {
                 instance.init(facade);
                 return instance;
             } else {
-                if (!init) {
+                if (!instanceInitialized) {
                     existing.init(facade);
-                    init = true;
+                    instanceInitialized = true;
                 }
                 return existing;
             }

Modified: tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java?rev=1345039&r1=1345038&r2=1345039&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java (original)
+++ tomcat/trunk/test/org/apache/catalina/startup/TestTomcat.java Fri Jun  1 
10:16:50 2012
@@ -28,10 +28,12 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -159,6 +161,34 @@ public class TestTomcat extends TomcatBa
     }
 
     /**
+     * Simple servlet to test initialization of servlet instances.
+     */
+    private static class InitCount extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        private AtomicInteger callCount = new AtomicInteger(0);
+
+        @Override
+        public void init() throws ServletException {
+            super.init();
+            callCount.incrementAndGet();
+        }
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            resp.setContentType("text/plain");
+            resp.getWriter().print("OK");
+        }
+
+        public int getCallCount() {
+            return callCount.intValue();
+        }
+    }
+
+
+    /**
      * Simple Realm that uses a configurable {@link Map} to link user names and
      * passwords.
      */
@@ -397,4 +427,24 @@ public class TestTomcat extends TomcatBa
         }
         assertNull(e);
     }
+
+    @Test
+    public void testBug53301() throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+
+        // Must have a real docBase - just use temp
+        org.apache.catalina.Context ctx =
+            tomcat.addContext("", System.getProperty("java.io.tmpdir"));
+
+        InitCount initCount = new InitCount();
+        Tomcat.addServlet(ctx, "initCount", initCount);
+        ctx.addServletMapping("/", "initCount");
+
+        tomcat.start();
+
+        ByteChunk res = getUrl("http://localhost:"; + getPort() + "/");
+        assertEquals("OK", res.toString());
+
+        assertEquals(1, initCount.getCallCount());
+    }
 }



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

Reply via email to