Author: markt Date: Fri Jul 8 18:01:30 2011 New Revision: 1144405 URL: http://svn.apache.org/viewvc?rev=1144405&view=rev Log: Pull up Handler.process
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java Modified: tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProcessor.java Fri Jul 8 18:01:30 2011 @@ -16,16 +16,19 @@ */ package org.apache.coyote; +import java.io.IOException; import java.util.concurrent.Executor; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; +import org.apache.tomcat.util.net.SocketStatus; +import org.apache.tomcat.util.net.SocketWrapper; /** * Provides functionality and attributes common to all supported protocols * (currently HTTP and AJP). */ -public abstract class AbstractProcessor implements ActionHook, Processor { +public abstract class AbstractProcessor<S> implements ActionHook, Processor { protected Adapter adapter; protected final AsyncStateMachine asyncStateMachine; @@ -100,4 +103,25 @@ public abstract class AbstractProcessor public SocketState asyncPostProcess() { return asyncStateMachine.asyncPostProcess(); } + + protected abstract boolean isComet(); + + /** + * Process HTTP requests. All requests are treated as HTTP requests to start + * with although they may change type during processing. + */ + public abstract SocketState process(SocketWrapper<S> socket) + throws IOException; + + + /** + * Process in-progress Comet requests. These will start as HTTP requests. + */ + public abstract SocketState event(SocketStatus status) throws IOException; + + /** + * Process in-progress Servlet 3.0 Async requests. These will start as HTTP + * requests. + */ + public abstract SocketState asyncDispatch(SocketStatus status); } Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Fri Jul 8 18:01:30 2011 @@ -17,6 +17,7 @@ package org.apache.coyote; import java.net.InetAddress; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; @@ -28,9 +29,12 @@ import javax.management.MalformedObjectN import javax.management.ObjectName; import org.apache.juli.logging.Log; +import org.apache.tomcat.util.ExceptionUtils; 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.net.SocketStatus; +import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; public abstract class AbstractProtocol implements ProtocolHandler, @@ -456,14 +460,22 @@ public abstract class AbstractProtocol i // ------------------------------------------- Connection handler base class - protected abstract static class AbstractConnectionHandler + protected abstract static class AbstractConnectionHandler<S,P extends AbstractProcessor<S>> implements AbstractEndpoint.Handler { + protected abstract Log getLog(); + protected RequestGroupInfo global = new RequestGroupInfo(); protected AtomicLong registerCount = new AtomicLong(0); + protected ConcurrentHashMap<SocketWrapper<S>,P> connections = + new ConcurrentHashMap<SocketWrapper<S>,P>(); + + protected RecycledProcessors<P,S> recycledProcessors = + new RecycledProcessors<P,S>(this); + + protected abstract AbstractProtocol getProtocol(); - protected abstract Log getLog(); @Override @@ -471,8 +483,88 @@ public abstract class AbstractProtocol i return global; } + @Override + public void recycle() { + recycledProcessors.clear(); + } + + + public SocketState process(SocketWrapper<S> socket, + SocketStatus status) { + P processor = connections.remove(socket); + + socket.setAsync(false); + + try { + if (processor == null) { + processor = recycledProcessors.poll(); + } + if (processor == null) { + processor = createProcessor(); + } + + initSsl(socket, processor); + + SocketState state = SocketState.CLOSED; + do { + if (processor.isAsync() || state == SocketState.ASYNC_END) { + state = processor.asyncDispatch(status); + } else if (processor.isComet()) { + state = processor.event(status); + } else { + state = processor.process(socket); + } + + if (state != SocketState.CLOSED && processor.isAsync()) { + state = processor.asyncPostProcess(); + } + } while (state == SocketState.ASYNC_END); + + if (state == SocketState.LONG) { + // In the middle of processing a request/response. Keep the + // socket associated with the processor. Exact requirements + // depend on type of long poll + longPoll(socket, processor); + } else if (state == SocketState.OPEN){ + // In keep-alive but between requests. OK to recycle + // processor. Continue to poll for the next request. + release(socket, processor, false, true); + } else { + // Connection closed. OK to recycle the processor. + release(socket, processor, true, false); + } + return state; + } catch(java.net.SocketException e) { + // SocketExceptions are normal + getLog().debug(sm.getString( + "ajpprotocol.proto.socketexception.debug"), e); + } catch (java.io.IOException e) { + // IOExceptions are normal + getLog().debug(sm.getString( + "ajpprotocol.proto.ioexception.debug"), e); + } + // Future developers: if you discover any other + // rare-but-nonfatal exceptions, catch them here, and log as + // above. + catch (Throwable e) { + ExceptionUtils.handleThrowable(e); + // any other exception or error is odd. Here we log it + // with "ERROR" level, so it will show up even on + // less-than-verbose logs. + getLog().error(sm.getString("ajpprotocol.proto.error"), e); + } + release(socket, processor, true, false); + return SocketState.CLOSED; + } + + protected abstract P createProcessor(); + protected abstract void initSsl(SocketWrapper<S> socket, P processor); + protected abstract void longPoll(SocketWrapper<S> socket, P processor); + protected abstract void release(SocketWrapper<S> socket, P processor, + boolean socketClosing, boolean addToPoller); + - protected void register(AbstractProcessor processor) { + protected void register(AbstractProcessor<S> processor) { if (getProtocol().getDomain() != null) { synchronized (this) { try { @@ -499,7 +591,7 @@ public abstract class AbstractProtocol i } } - protected void unregister(AbstractProcessor processor) { + protected void unregister(AbstractProcessor<S> processor) { if (getProtocol().getDomain() != null) { synchronized (this) { try { @@ -521,14 +613,14 @@ public abstract class AbstractProtocol i } } - protected static class RecycledProcessors<P extends AbstractProcessor> + protected static class RecycledProcessors<P extends AbstractProcessor<S>, S> extends ConcurrentLinkedQueue<P> { private static final long serialVersionUID = 1L; - private AbstractConnectionHandler handler; + private transient AbstractConnectionHandler<S,P> handler; protected AtomicInteger size = new AtomicInteger(0); - public RecycledProcessors(AbstractConnectionHandler handler) { + public RecycledProcessors(AbstractConnectionHandler<S,P> handler) { this.handler = handler; } Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Fri Jul 8 18:01:30 2011 @@ -42,13 +42,12 @@ import org.apache.tomcat.util.net.Abstra import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.SocketStatus; -import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; /** * Base class for AJP Processor implementations. */ -public abstract class AbstractAjpProcessor<S> extends AbstractProcessor { +public abstract class AbstractAjpProcessor<S> extends AbstractProcessor<S> { protected abstract Log getLog(); @@ -213,11 +212,6 @@ public abstract class AbstractAjpProcess protected long byteCount = 0; - /** - * AJP does not support comet - */ - protected final boolean comet = false; - // ------------------------------------------------------------ Constructor public AbstractAjpProcessor(int packetSize, AbstractEndpoint endpoint) { @@ -459,9 +453,7 @@ public abstract class AbstractAjpProcess protected abstract void finish() throws IOException; - public abstract SocketState process(SocketWrapper<S> socket) - throws IOException; - + @Override public SocketState asyncDispatch(SocketStatus status) { RequestInfo rp = request.getRequestProcessor(); @@ -502,7 +494,13 @@ public abstract class AbstractAjpProcess } - @SuppressWarnings("unused") + @Override + protected final boolean isComet() { + // AJP does not support Comet + return false; + } + + @Override public SocketState event(SocketStatus status) throws IOException { // Should never reach this code but in case we do... throw new IOException( Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProtocol.java Fri Jul 8 18:01:30 2011 @@ -16,11 +16,7 @@ */ package org.apache.coyote.ajp; -import java.util.concurrent.ConcurrentHashMap; - import org.apache.coyote.AbstractProtocol; -import org.apache.tomcat.util.ExceptionUtils; -import org.apache.tomcat.util.net.SocketStatus; import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; @@ -77,99 +73,18 @@ public abstract class AbstractAjpProtoco } protected abstract static class AbstractAjpConnectionHandler<S,P extends AbstractAjpProcessor<S>> - extends AbstractConnectionHandler { - - protected ConcurrentHashMap<SocketWrapper<S>,P> connections = - new ConcurrentHashMap<SocketWrapper<S>,P>(); + extends AbstractConnectionHandler<S, P> { - protected RecycledProcessors<P> recycledProcessors = - new RecycledProcessors<P>(this); - @Override - public void recycle() { - recycledProcessors.clear(); - } - - public SocketState process(SocketWrapper<S> socket, - SocketStatus status) { - P processor = connections.remove(socket); - - socket.setAsync(false); - - try { - if (processor == null) { - processor = recycledProcessors.poll(); - } - if (processor == null) { - processor = createProcessor(); - } - - initSsl(socket, processor); - - SocketState state = SocketState.CLOSED; - do { - if (processor.isAsync() || state == SocketState.ASYNC_END) { - state = processor.asyncDispatch(status); - } else if (processor.comet) { - state = processor.event(status); - } else { - state = processor.process(socket); - } - - if (state != SocketState.CLOSED && processor.isAsync()) { - state = processor.asyncPostProcess(); - } - } while (state == SocketState.ASYNC_END); - - if (state == SocketState.LONG) { - // In the middle of processing a request/response. Keep the - // socket associated with the processor. Exact requirements - // depend on type of long poll - longPoll(socket, processor); - } else if (state == SocketState.OPEN){ - // In keep-alive but between requests. OK to recycle - // processor. Continue to poll for the next request. - release(socket, processor, false, true); - } else { - // Connection closed. OK to recycle the processor. - release(socket, processor, true, false); - } - return state; - } catch(java.net.SocketException e) { - // SocketExceptions are normal - getLog().debug(sm.getString( - "ajpprotocol.proto.socketexception.debug"), e); - } catch (java.io.IOException e) { - // IOExceptions are normal - getLog().debug(sm.getString( - "ajpprotocol.proto.ioexception.debug"), e); - } - // Future developers: if you discover any other - // rare-but-nonfatal exceptions, catch them here, and log as - // above. - catch (Throwable e) { - ExceptionUtils.handleThrowable(e); - // any other exception or error is odd. Here we log it - // with "ERROR" level, so it will show up even on - // less-than-verbose logs. - getLog().error(sm.getString("ajpprotocol.proto.error"), e); - } - release(socket, processor, true, false); - return SocketState.CLOSED; - } - - protected abstract P createProcessor(); - @SuppressWarnings("unused") protected void initSsl(SocketWrapper<S> socket, P processor) { // NOOP for AJP } + + @Override protected void longPoll(SocketWrapper<S> socket, P processor) { // Same requirements for all AJP connectors connections.put(socket, processor); socket.setAsync(true); - } - protected abstract void release(SocketWrapper<S> socket, P processor, - boolean socketClosing, boolean addToPoller); } } Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Fri Jul 8 18:01:30 2011 @@ -47,10 +47,9 @@ import org.apache.tomcat.util.http.MimeH import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SocketStatus; -import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; -public abstract class AbstractHttp11Processor<S> extends AbstractProcessor { +public abstract class AbstractHttp11Processor<S> extends AbstractProcessor<S> { protected abstract Log getLog(); @@ -1212,9 +1211,7 @@ public abstract class AbstractHttp11Proc } - public abstract SocketState process(SocketWrapper<S> socket) - throws IOException; - + @Override public SocketState asyncDispatch(SocketStatus status) { RequestInfo rp = request.getRequestProcessor(); @@ -1252,7 +1249,10 @@ public abstract class AbstractHttp11Proc } - public abstract SocketState event(SocketStatus status) throws IOException; + @Override + public boolean isComet() { + return comet; + } /** Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Protocol.java Fri Jul 8 18:01:30 2011 @@ -16,12 +16,8 @@ */ package org.apache.coyote.http11; -import java.util.concurrent.ConcurrentHashMap; import org.apache.coyote.AbstractProtocol; -import org.apache.tomcat.util.ExceptionUtils; -import org.apache.tomcat.util.net.SocketStatus; -import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; public abstract class AbstractHttp11Protocol extends AbstractProtocol { @@ -187,94 +183,4 @@ public abstract class AbstractHttp11Prot public void setMaxKeepAliveRequests(int mkar) { endpoint.setMaxKeepAliveRequests(mkar); } - - - protected abstract static class AbstractHttp11ConnectionHandler<S,P extends AbstractHttp11Processor<S>> - extends AbstractConnectionHandler { - - protected ConcurrentHashMap<SocketWrapper<S>,P> connections = - new ConcurrentHashMap<SocketWrapper<S>,P>(); - - protected RecycledProcessors<P> recycledProcessors = - new RecycledProcessors<P>(this); - - @Override - public void recycle() { - recycledProcessors.clear(); - } - - public SocketState process(SocketWrapper<S> socket, - SocketStatus status) { - P processor = connections.remove(socket); - - socket.setAsync(false); //no longer check for timeout - - try { - if (processor == null) { - processor = recycledProcessors.poll(); - } - if (processor == null) { - processor = createProcessor(); - } - - initSsl(socket, processor); - - SocketState state = SocketState.CLOSED; - do { - if (processor.isAsync() || state == SocketState.ASYNC_END) { - state = processor.asyncDispatch(status); - } else if (processor.comet) { - state = processor.event(status); - } else { - state = processor.process(socket); - } - - if (state != SocketState.CLOSED && processor.isAsync()) { - state = processor.asyncPostProcess(); - } - } while (state == SocketState.ASYNC_END); - - if (state == SocketState.LONG) { - // In the middle of processing a request/response. Keep the - // socket associated with the processor. Exact requirements - // depend on type of long poll - longPoll(socket, processor); - } else if (state == SocketState.OPEN){ - // In keep-alive but between requests. OK to recycle - // processor. Continue to poll for the next request. - release(socket, processor, false, true); - } else { - // Connection closed. OK to recycle the processor. - release(socket, processor, true, false); - } - return state; - } catch(java.net.SocketException e) { - // SocketExceptions are normal - getLog().debug(sm.getString( - "http11protocol.proto.socketexception.debug"), e); - } catch (java.io.IOException e) { - // IOExceptions are normal - getLog().debug(sm.getString( - "http11protocol.proto.ioexception.debug"), e); - } - // Future developers: if you discover any other - // rare-but-nonfatal exceptions, catch them here, and log as - // above. - catch (Throwable e) { - ExceptionUtils.handleThrowable(e); - // any other exception or error is odd. Here we log it - // with "ERROR" level, so it will show up even on - // less-than-verbose logs. - getLog().error(sm.getString("http11protocol.proto.error"), e); - } - release(socket, processor, true, false); - return SocketState.CLOSED; - } - - protected abstract P createProcessor(); - protected abstract void initSsl(SocketWrapper<S> socket, P processor); - protected abstract void longPoll(SocketWrapper<S> socket, P processor); - protected abstract void release(SocketWrapper<S> socket, P processor, - boolean socketClosing, boolean addToPoller); - } } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Fri Jul 8 18:01:30 2011 @@ -177,7 +177,7 @@ public class Http11AprProtocol extends A // -------------------- Connection handler -------------------- protected static class Http11ConnectionHandler - extends AbstractHttp11ConnectionHandler<Long,Http11AprProcessor> implements Handler { + extends AbstractConnectionHandler<Long,Http11AprProcessor> implements Handler { protected Http11AprProtocol proto; Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Fri Jul 8 18:01:30 2011 @@ -148,7 +148,7 @@ public class Http11NioProtocol extends A // -------------------- Connection handler -------------------- protected static class Http11ConnectionHandler - extends AbstractHttp11ConnectionHandler<NioChannel,Http11NioProcessor> + extends AbstractConnectionHandler<NioChannel,Http11NioProcessor> implements Handler { protected Http11NioProtocol proto; Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java?rev=1144405&r1=1144404&r2=1144405&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java Fri Jul 8 18:01:30 2011 @@ -97,7 +97,7 @@ public class Http11Protocol extends Abst // ----------------------------------- Http11ConnectionHandler Inner Class protected static class Http11ConnectionHandler - extends AbstractHttp11ConnectionHandler<Socket, Http11Processor> implements Handler { + extends AbstractConnectionHandler<Socket, Http11Processor> implements Handler { protected Http11Protocol proto; --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org