287632 FilterContinuations for blocking jetty6

git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@763 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
Greg Wilkins 2009-08-26 03:01:35 +00:00
parent 4ae850e9e5
commit a33c8cdf1a
6 changed files with 103 additions and 51 deletions

View File

@ -6,6 +6,7 @@ jetty-7.0.0-SNAPSHOT
+ JETTY-1086 Added UncheckedPrintWriter to avoid ignored EOFs
+ JETTY-1087 Chunked SSL non blocking input
+ 287496 Use start.ini always and added --exec
+ 287632 FilterContinuations for blocking jetty6
jetty-7.0.0.RC4 18 August 2009

View File

@ -20,7 +20,7 @@ import javax.servlet.ServletResponse;
* that is neither Jetty (>=6.1) nor a Servlet3.0 container.
* The following init parameters may be used to configure the filter (these are mostly for testing):<dl>
* <dt>debug</dt><dd>Boolean controlling debug output</dd>
* <dt>partial</dt><dd>Boolean to force support for partial continuation implementations (eg jetty 6)</dd>
* <dt>jetty6</dt><dd>Boolean to force support for jetty 6 continuations)</dd>
* <dt>faux</dt><dd>Boolean to force support for faux continuations</dd>
* </dl>
*/
@ -28,7 +28,8 @@ public class ContinuationFilter implements Filter
{
static boolean __debug; // shared debug status
private boolean _faux;
private boolean _partial;
private boolean _jetty6;
private boolean _filtered;
ServletContext _context;
private boolean _debug;
@ -42,41 +43,52 @@ public class ContinuationFilter implements Filter
if (_debug)
__debug=true;
param=filterConfig.getInitParameter("partial");
param=filterConfig.getInitParameter("jetty6");
if (param==null)
param=filterConfig.getInitParameter("partial");
if (param!=null)
_partial=Boolean.parseBoolean(param);
_jetty6=Boolean.parseBoolean(param);
else
_partial=ContinuationSupport.__jetty6 && !jetty_7_or_greater;
_jetty6=ContinuationSupport.__jetty6 && !jetty_7_or_greater;
param=filterConfig.getInitParameter("faux");
if (param!=null)
_faux=Boolean.parseBoolean(param);
else
_faux=!(jetty_7_or_greater || _partial || _context.getMajorVersion()>=3);
_faux=!(jetty_7_or_greater || _jetty6 || _context.getMajorVersion()>=3);
_filtered=_faux||_jetty6;
if (_debug)
_context.log("ContinuationFilter "+
" jetty="+jetty_7_or_greater+
" partial="+_partial+
" jetty6="+ContinuationSupport.__jetty6+
" jetty6="+_jetty6+
" faux="+_faux+
" filtered="+_filtered+
" servlet3="+ContinuationSupport.__servlet3);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
if (_faux)
if (_filtered)
{
final FauxContinuation fc = new FauxContinuation(request);
request.setAttribute(Continuation.ATTRIBUTE,fc);
Continuation c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
FilteredContinuation fc;
if (_faux && (c==null || !(c instanceof FauxContinuation)))
{
fc = new FauxContinuation(request);
request.setAttribute(Continuation.ATTRIBUTE,fc);
}
else
fc=(FilteredContinuation)c;
boolean complete=false;
while (!complete)
{
try
{
fc.setServletResponse(response);
chain.doFilter(request,response);
if (fc==null || ((FilteredContinuation)fc).enter(response))
chain.doFilter(request,response);
}
catch (ContinuationThrowable e)
{
@ -84,26 +96,12 @@ public class ContinuationFilter implements Filter
}
finally
{
complete=fc.handleSuspension();
if (fc==null)
fc = (FilteredContinuation) request.getAttribute(Continuation.ATTRIBUTE);
complete=fc==null || ((FilteredContinuation)fc).exit();
}
}
fc.onComplete();
}
else if (_partial)
{
Continuation c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
try
{
if (c==null || !(c instanceof PartialContinuation) || ((PartialContinuation)c).enter())
chain.doFilter(request,response);
}
finally
{
if (c==null)
c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
if (c!=null && c instanceof PartialContinuation)
((PartialContinuation)c).exit();
}
}
else
{
@ -141,9 +139,9 @@ public class ContinuationFilter implements Filter
{
}
public interface PartialContinuation extends Continuation
public interface FilteredContinuation extends Continuation
{
boolean enter();
void exit();
boolean enter(ServletResponse response);
boolean exit();
}
}

View File

@ -19,6 +19,8 @@ import javax.servlet.ServletRequestWrapper;
import javax.servlet.ServletResponse;
import javax.servlet.ServletResponseWrapper;
import org.mortbay.util.ajax.WaitingContinuation;
/* ------------------------------------------------------------ */
/** ContinuationSupport.
*
@ -30,6 +32,7 @@ public class ContinuationSupport
{
static final boolean __jetty6;
static final boolean __servlet3;
static final Class<?> __waitingContinuation;
static final Constructor<? extends Continuation> __newServlet3Continuation;
static final Constructor<? extends Continuation> __newJetty6Continuation;
static
@ -53,8 +56,7 @@ public class ContinuationSupport
__servlet3=servlet3Support;
__newServlet3Continuation=s3cc;
}
boolean jetty6Support=false;
Constructor<? extends Continuation>j6cc=null;
try
@ -75,6 +77,19 @@ public class ContinuationSupport
__jetty6=jetty6Support;
__newJetty6Continuation=j6cc;
}
Class<?> waiting=null;
try
{
waiting=ContinuationSupport.class.getClassLoader().loadClass("org.mortbay.util.ajax.WaitingContinuation");
}
catch (Exception e)
{
}
finally
{
__waitingContinuation=waiting;
}
}
/* ------------------------------------------------------------ */
@ -116,7 +131,10 @@ public class ContinuationSupport
Object c=request.getAttribute("org.mortbay.jetty.ajax.Continuation");
try
{
continuation= __newJetty6Continuation.newInstance(request,c);
if (c==null || __waitingContinuation==null || __waitingContinuation.isInstance(c))
continuation=new FauxContinuation(request);
else
continuation= __newJetty6Continuation.newInstance(request,c);
request.setAttribute(Continuation.ATTRIBUTE,continuation);
return continuation;
}

View File

@ -20,6 +20,8 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletResponseWrapper;
import org.eclipse.jetty.continuation.ContinuationFilter.FilteredContinuation;
/* ------------------------------------------------------------ */
/**
@ -27,7 +29,7 @@ import javax.servlet.ServletResponseWrapper;
* This implementation of Continuation is used by the {@link ContinuationFilter}
* when there are is no native or asynchronous continuation type available.
*/
class FauxContinuation implements Continuation
class FauxContinuation implements FilteredContinuation
{
// common exception used for all continuations.
// Turn on debug in ContinuationFilter to see real stack trace.
@ -255,9 +257,10 @@ class FauxContinuation implements Continuation
/**
* @see org.eclipse.jetty.continuation.Continuation#getServletResponse()
*/
void setServletResponse(ServletResponse response)
public boolean enter(ServletResponse response)
{
_response=response;
return true;
}
/* ------------------------------------------------------------ */
@ -305,7 +308,7 @@ class FauxContinuation implements Continuation
/**
* @return true if handling is complete
*/
public boolean handleSuspension()
public boolean exit()
{
synchronized (this)
{
@ -313,6 +316,7 @@ class FauxContinuation implements Continuation
{
case __HANDLING:
_state=__COMPLETE;
onComplete();
return true;
case __SUSPENDING:
@ -320,7 +324,10 @@ class FauxContinuation implements Continuation
_state=__SUSPENDED;
fauxSuspend(); // could block and change state.
if (_state==__SUSPENDED || _state==__COMPLETING)
{
onComplete();
return true;
}
_initial=false;
_state=__HANDLING;
@ -334,6 +341,7 @@ class FauxContinuation implements Continuation
case __COMPLETING:
_initial=false;
_state=__COMPLETE;
onComplete();
return true;
case __SUSPENDED:

View File

@ -14,7 +14,7 @@ import javax.servlet.ServletResponseWrapper;
* when it detects that the application is deployed in a jetty-6 server.
* This continuation requires the {@link ContinuationFilter} to be deployed.
*/
public class Jetty6Continuation implements ContinuationFilter.PartialContinuation
public class Jetty6Continuation implements ContinuationFilter.FilteredContinuation
{
// Exception reused for all continuations
// Turn on debug in ContinuationFilter to see real stack trace.
@ -195,8 +195,9 @@ public class Jetty6Continuation implements ContinuationFilter.PartialContinuatio
}
/* ------------------------------------------------------------ */
public boolean enter()
public boolean enter(ServletResponse response)
{
_response=response;
_expired=!_j6Continuation.isResumed();
if (_initial)
@ -218,7 +219,8 @@ public class Jetty6Continuation implements ContinuationFilter.PartialContinuatio
return true;
}
public void exit()
/* ------------------------------------------------------------ */
public boolean exit()
{
_initial=false;
@ -236,5 +238,7 @@ public class Jetty6Continuation implements ContinuationFilter.PartialContinuatio
for (ContinuationListener l: _listeners)
l.onComplete(this);
}
return true;
}
}

View File

@ -19,6 +19,7 @@ import java.io.InputStream;
import org.eclipse.jetty.continuation.test.ContinuationBase;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.FilterHolder;
@ -31,13 +32,15 @@ public class Jetty6ContinuationTest extends ContinuationBase
{
protected Server _server = new Server();
protected ServletHandler _servletHandler;
protected SelectChannelConnector _connector;
protected SelectChannelConnector _selectChannelConnector;
protected SocketConnector _socketConnector;
FilterHolder _filter;
protected void setUp() throws Exception
{
_connector = new SelectChannelConnector();
_server.setConnectors(new Connector[]{ _connector });
_selectChannelConnector = new SelectChannelConnector();
_socketConnector = new SocketConnector();
_server.setConnectors(new Connector[]{ _selectChannelConnector,_socketConnector });
Context servletContext = new Context(Context.NO_SECURITY|Context.NO_SESSIONS);
_server.setHandler(servletContext);
_servletHandler=servletContext.getServletHandler();
@ -51,23 +54,43 @@ public class Jetty6ContinuationTest extends ContinuationBase
_server.stop();
}
public void testJetty6() throws Exception
public void testJetty6Nio() throws Exception
{
_filter.setInitParameter("debug","true");
//_filter.setInitParameter("faux","false");
_server.start();
_port=_connector.getLocalPort();
_port=_selectChannelConnector.getLocalPort();
doit("Jetty6Continuation");
}
public void testFaux() throws Exception
public void testFauxNio() throws Exception
{
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","true");
_server.start();
_port=_connector.getLocalPort();
_port=_selectChannelConnector.getLocalPort();
doit("FauxContinuation");
}
public void testJetty6Bio() throws Exception
{
_filter.setInitParameter("debug","true");
//_filter.setInitParameter("faux","false");
_server.start();
_port=_socketConnector.getLocalPort();
doit("FauxContinuation");
}
public void testFauxBio() throws Exception
{
_filter.setInitParameter("debug","true");
_filter.setInitParameter("faux","true");
_server.start();
_port=_socketConnector.getLocalPort();
doit("FauxContinuation");
}