Re-factoring in support of https://issues.apache.org/bugzilla/show_bug.cgi?id=50360
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 7 Dec 2010 00:08:38 +0000 (00:08 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 7 Dec 2010 00:08:38 +0000 (00:08 +0000)
Pull up the concrete destroy() method - required a fair bit of refactoring
Pull up the abstract init() method()

git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1042873 13f79535-47bb-0310-9956-ffa450edef68

14 files changed:
java/org/apache/coyote/AbstractProtocolHandler.java
java/org/apache/coyote/LocalStrings.properties
java/org/apache/coyote/ajp/AbstractAjpProtocol.java
java/org/apache/coyote/ajp/AjpAprProtocol.java
java/org/apache/coyote/ajp/AjpProtocol.java
java/org/apache/coyote/ajp/LocalStrings.properties
java/org/apache/coyote/http11/AbstractHttp11Protocol.java
java/org/apache/coyote/http11/Http11AprProtocol.java
java/org/apache/coyote/http11/Http11NioProtocol.java
java/org/apache/coyote/http11/Http11Protocol.java
java/org/apache/tomcat/util/net/AbstractEndpoint.java
java/org/apache/tomcat/util/net/AprEndpoint.java
java/org/apache/tomcat/util/net/JIoEndpoint.java
java/org/apache/tomcat/util/net/NioEndpoint.java

index 4b3d33b..39c4315 100644 (file)
@@ -26,6 +26,7 @@ import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
 import org.apache.juli.logging.Log;
+import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomcat.util.net.AbstractEndpoint;
 import org.apache.tomcat.util.net.AbstractEndpoint.Handler;
 import org.apache.tomcat.util.res.StringManager;
@@ -332,4 +333,33 @@ public abstract class AbstractProtocolHandler implements ProtocolHandler,
     public void postDeregister() {
         // NOOP
     }
+
+
+    // ------------------------------------------------------- Lifecycle methods
+
+    // TODO Keep current state and check for invalid transitions
+
+    @Override
+    public abstract void init() throws Exception;
+
+
+    @Override
+    public final void destroy() {
+        if(getLog().isInfoEnabled()) {
+            getLog().info(sm.getString("abstractProtocolHandler.destroy",
+                    getName()));
+        }
+        try {
+            endpoint.destroy();
+        } catch (Exception e) {
+            getLog().error(sm.getString(
+                    "abstractProtocolHandler.endPointDestroyError", getName()),
+                    e);
+        }
+        
+        if( tpOname!=null )
+            Registry.getRegistry(null, null).unregisterComponent(tpOname);
+        if( rgOname != null )
+            Registry.getRegistry(null, null).unregisterComponent(rgOname);
+    }
 }
index 891b5e0..32fe65e 100644 (file)
@@ -15,5 +15,7 @@
 
 abstractProtocolHandler.getAttribute=Get attribute [{0}] with value [{1}]
 abstractProtocolHandler.setAttribute=Set attribute [{0}] with value [{1}]
+abstractProtocolHandler.endPointDestroyError=Failed to destroy end point associated with ProtocolHandler [{0}]
+abstractProtocolHandler.destroy=Destroying ProtocolHandler [{0}]
 
 asyncStateMachine.invalidAsyncState=Calling [{0}] is not valid for a request with Async state [{1}]
index cb666b3..3a71517 100644 (file)
@@ -17,7 +17,6 @@
 package org.apache.coyote.ajp;
 
 import org.apache.coyote.AbstractProtocolHandler;
-import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomcat.util.res.StringManager;
 
 public abstract class AbstractAjpProtocol extends AbstractProtocolHandler {
@@ -114,16 +113,4 @@ public abstract class AbstractAjpProtocol extends AbstractProtocolHandler {
         if (getLog().isInfoEnabled())
             getLog().info(sm.getString("ajpprotocol.stop", getName()));
     }
-
-
-    @Override
-    public void destroy() throws Exception {
-        if (getLog().isInfoEnabled())
-            getLog().info(sm.getString("ajpprotocol.destroy", getName()));
-        endpoint.destroy();
-        if (tpOname!=null)
-            Registry.getRegistry(null, null).unregisterComponent(tpOname);
-        if (rgOname != null)
-            Registry.getRegistry(null, null).unregisterComponent(rgOname);
-    }
 }
index 348aeb2..241a50d 100644 (file)
@@ -151,10 +151,6 @@ public class AjpAprProtocol extends AbstractAjpProtocol {
         protected AjpAprProtocol proto;
         protected AtomicLong registerCount = new AtomicLong(0);
         protected RequestGroupInfo global = new RequestGroupInfo();
-        @Override
-        public RequestGroupInfo getGlobal() {
-            return global;
-        }
 
         protected ConcurrentHashMap<SocketWrapper<Long>, AjpAprProcessor> connections =
             new ConcurrentHashMap<SocketWrapper<Long>, AjpAprProcessor>();
@@ -203,6 +199,16 @@ public class AjpAprProtocol extends AbstractAjpProtocol {
             this.proto = proto;
         }
 
+        @Override
+        public RequestGroupInfo getGlobal() {
+            return global;
+        }
+
+        @Override
+        public void recycle() {
+            recycledProcessors.clear();
+        }
+        
         // FIXME: Support for this could be added in AJP as well
         @Override
         public SocketState event(SocketWrapper<Long> socket, SocketStatus status) {
index 1d06516..da8a3dc 100644 (file)
@@ -140,10 +140,6 @@ public class AjpProtocol extends AbstractAjpProtocol {
         protected AjpProtocol proto;
         protected AtomicLong registerCount = new AtomicLong(0);
         protected RequestGroupInfo global = new RequestGroupInfo();
-        @Override
-        public RequestGroupInfo getGlobal() {
-            return global;
-        }
 
         protected ConcurrentHashMap<SocketWrapper<Socket>, AjpProcessor> connections =
             new ConcurrentHashMap<SocketWrapper<Socket>, AjpProcessor>();
@@ -193,6 +189,16 @@ public class AjpProtocol extends AbstractAjpProtocol {
         }
         
         @Override
+        public RequestGroupInfo getGlobal() {
+            return global;
+        }
+
+        @Override
+        public void recycle() {
+            recycledProcessors.clear();
+        }
+        
+        @Override
         public SocketState process(SocketWrapper<Socket> socket) {
             return process(socket,SocketStatus.OPEN);
         }
index 5432223..edbefe1 100644 (file)
@@ -23,7 +23,6 @@
 # AjpAprProtocol
 #
 
-ajpprotocol.destroy=Destroying Coyote AJP/1.3 on {0}
 ajpprotocol.endpoint.initerror=Error initializing endpoint
 ajpprotocol.endpoint.starterror=Error starting endpoint
 ajpprotocol.endpoint.stoperror=Error stopping endpoint
index 81b2ed4..84f2327 100644 (file)
@@ -17,7 +17,6 @@
 package org.apache.coyote.http11;
 
 import org.apache.coyote.AbstractProtocolHandler;
-import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomcat.util.res.StringManager;
 
 public abstract class AbstractHttp11Protocol extends AbstractProtocolHandler {
@@ -195,9 +194,6 @@ public abstract class AbstractHttp11Protocol extends AbstractProtocolHandler {
     // ------------------------------------------------------- Lifecycle methods
     
     @Override
-    public abstract void init() throws Exception;
-
-    @Override
     public void pause() throws Exception {
         try {
             endpoint.pause();
@@ -235,17 +231,4 @@ public abstract class AbstractHttp11Protocol extends AbstractProtocolHandler {
         if(getLog().isInfoEnabled())
             getLog().info(sm.getString("http11protocol.stop", getName()));
     }
-
-    @Override
-    public void destroy() throws Exception {
-        if(getLog().isInfoEnabled())
-            getLog().info(sm.getString("http11protocol.destroy", getName()));
-        endpoint.destroy();
-        if( tpOname!=null )
-            Registry.getRegistry(null, null).unregisterComponent(tpOname);
-        if( rgOname != null )
-            Registry.getRegistry(null, null).unregisterComponent(rgOname);
-    }
-    
-
 }
index 1c2e2c9..4e477f8 100644 (file)
@@ -123,12 +123,6 @@ public class Http11AprProtocol extends AbstractHttp11Protocol {
             log.info(sm.getString("http11protocol.start", getName()));
     }
 
-    @Override
-    public void destroy() throws Exception {
-        cHandler.recycledProcessors.clear();
-        super.destroy();
-    }
-
     private Http11ConnectionHandler cHandler;
 
     public boolean getUseSendfile() { return ((AprEndpoint)endpoint).getUseSendfile(); }
@@ -245,13 +239,10 @@ public class Http11AprProtocol extends AbstractHttp11Protocol {
         protected Http11AprProtocol proto;
         protected AtomicLong registerCount = new AtomicLong(0);
         protected RequestGroupInfo global = new RequestGroupInfo();
-        @Override
-        public RequestGroupInfo getGlobal() {
-            return global;
-        }
         
         protected ConcurrentHashMap<SocketWrapper<Long>, Http11AprProcessor> connections =
             new ConcurrentHashMap<SocketWrapper<Long>, Http11AprProcessor>();
+
         protected ConcurrentLinkedQueue<Http11AprProcessor> recycledProcessors = 
             new ConcurrentLinkedQueue<Http11AprProcessor>() {
             private static final long serialVersionUID = 1L;
@@ -298,6 +289,16 @@ public class Http11AprProtocol extends AbstractHttp11Protocol {
         }
 
         @Override
+        public RequestGroupInfo getGlobal() {
+            return global;
+        }
+        
+        @Override
+        public void recycle() {
+            recycledProcessors.clear();
+        }
+        
+        @Override
         public SocketState event(SocketWrapper<Long> socket, SocketStatus status) {
             Http11AprProcessor processor = connections.get(socket);
             
index bd90372..92ea015 100644 (file)
@@ -207,13 +207,10 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol {
         protected Http11NioProtocol proto;
         protected static int count = 0;
         protected RequestGroupInfo global = new RequestGroupInfo();
-        @Override
-        public RequestGroupInfo getGlobal() {
-            return global;
-        }
 
         protected ConcurrentHashMap<NioChannel, Http11NioProcessor> connections =
             new ConcurrentHashMap<NioChannel, Http11NioProcessor>();
+
         protected ConcurrentLinkedQueue<Http11NioProcessor> recycledProcessors = new ConcurrentLinkedQueue<Http11NioProcessor>() {
             private static final long serialVersionUID = 1L;
             protected AtomicInteger size = new AtomicInteger(0);
@@ -258,7 +255,12 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol {
         }
         
         @Override
-        public void releaseCaches() {
+        public RequestGroupInfo getGlobal() {
+            return global;
+        }
+
+        @Override
+        public void recycle() {
             recycledProcessors.clear();
         }
         
index d19249f..36ae00e 100644 (file)
@@ -159,14 +159,8 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol {
     }
 
 
-    @Override
-    public void destroy() throws Exception {
-        cHandler.recycledProcessors.clear();
-        super.destroy();
-    }
     // ------------------------------------------------------------- Properties
 
-
     /**
      * Name of the socket factory.
      */
@@ -191,10 +185,6 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol {
         protected Http11Protocol proto;
         protected AtomicLong registerCount = new AtomicLong(0);
         protected RequestGroupInfo global = new RequestGroupInfo();
-        @Override
-        public RequestGroupInfo getGlobal() {
-            return global;
-        }
             
         protected ConcurrentHashMap<SocketWrapper<Socket>, Http11Processor> connections =
             new ConcurrentHashMap<SocketWrapper<Socket>, Http11Processor>();
@@ -244,6 +234,16 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol {
         }
 
         @Override
+        public RequestGroupInfo getGlobal() {
+            return global;
+        }
+
+        @Override
+        public void recycle() {
+            recycledProcessors.clear();
+        }
+
+        @Override
         public SocketState process(SocketWrapper<Socket> socket) {
             return process(socket,SocketStatus.OPEN);
         }
index 1dc6f6e..070ae7d 100644 (file)
@@ -76,7 +76,7 @@ public abstract class AbstractEndpoint {
 
     public static interface Handler {
         /**
-         * Different types of socket states to react upon
+         * Different types of socket states to react upon.
          */
         public enum SocketState {
             OPEN, CLOSED, LONG, ASYNC_END
@@ -84,9 +84,15 @@ public abstract class AbstractEndpoint {
         
 
         /**
-         * Obtain the GlobalRequestProcessor associated with the handler
+         * Obtain the GlobalRequestProcessor associated with the handler.
          */
         public RequestGroupInfo getGlobal();
+        
+        
+        /**
+         * Recycle resources associated with the handler.
+         */
+        public void recycle();
     }
 
     // Standard SSL Configuration attributes
index 1fda4e7..994cc88 100644 (file)
@@ -690,6 +690,8 @@ public class AprEndpoint extends AbstractEndpoint {
             rootPool = 0;
         }
 
+        handler.recycle();
+
         initialized = false;
     }
 
index c49719f..24c5e18 100644 (file)
@@ -466,6 +466,7 @@ public class JIoEndpoint extends AbstractEndpoint {
             }
             serverSocket = null;
         }
+        handler.recycle();
         initialized = false ;
     }
 
index de91ba1..5c9a3a7 100644 (file)
@@ -427,7 +427,7 @@ public class NioEndpoint extends AbstractEndpoint {
         this.keyCache.clear();
         this.nioChannels.clear();
         this.processorCache.clear();
-        if ( handler != null ) handler.releaseCaches();
+        if ( handler != null ) handler.recycle();
         
     }
     
@@ -1478,7 +1478,6 @@ public class NioEndpoint extends AbstractEndpoint {
     public interface Handler extends AbstractEndpoint.Handler {
         public SocketState process(NioChannel socket);
         public SocketState event(NioChannel socket, SocketStatus status);
-        public void releaseCaches();
         public void release(NioChannel socket);
         public void release(SocketChannel socket);
     }