Mercurial Hosting > luan
changeset 829:dfa742c663f9
remove ContinuationFilter and FauxContinuation
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 15 Sep 2016 18:16:25 -0600 |
parents | 8579194add85 |
children | 7c737c376bc3 |
files | src/luan/modules/http/LuanHandler.java src/org/eclipse/jetty/continuation/ContinuationFilter.java src/org/eclipse/jetty/continuation/ContinuationSupport.java src/org/eclipse/jetty/continuation/FauxContinuation.java |
diffstat | 4 files changed, 20 insertions(+), 810 deletions(-) [+] |
line wrap: on
line diff
--- a/src/luan/modules/http/LuanHandler.java Thu Sep 15 16:47:49 2016 -0600 +++ b/src/luan/modules/http/LuanHandler.java Thu Sep 15 18:16:25 2016 -0600 @@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.continuation.ContinuationSupport; import luan.Luan; import luan.LuanState; import luan.LuanTable; @@ -52,6 +53,7 @@ @Override public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) throws IOException { +//System.out.println("getContinuation = "+ContinuationSupport.getContinuation(request)); if( target.endsWith("/") ) target += welcomeFile; Thread thread = Thread.currentThread();
--- a/src/org/eclipse/jetty/continuation/ContinuationFilter.java Thu Sep 15 16:47:49 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.continuation; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; - - - -/* ------------------------------------------------------------ */ -/** - * <p>ContinuationFilter must be applied to servlet paths that make use of - * the asynchronous features provided by {@link Continuation} APIs, but that - * are deployed in servlet containers that are neither Jetty (>= 7) nor a - * compliant Servlet 3.0 container.</p> - * <p>The following init parameters may be used to configure the filter (these are mostly for testing):</p> - * <dl> - * <dt>debug</dt><dd>Boolean controlling debug output</dd> - * <dt>jetty6</dt><dd>Boolean to force use of Jetty 6 continuations</dd> - * <dt>faux</dt><dd>Boolean to force use of faux continuations</dd> - * </dl> - * <p>If the servlet container is not Jetty (either 6 or 7) nor a Servlet 3 - * container, then "faux" continuations will be used.</p> - * <p>Faux continuations will just put the thread that called {@link Continuation#suspend()} - * in wait, and will notify that thread when {@link Continuation#resume()} or - * {@link Continuation#complete()} is called.</p> - * <p>Faux continuations are not threadless continuations (they are "faux" - fake - for this reason) - * and as such they will scale less than proper continuations.</p> - */ -public class ContinuationFilter implements Filter -{ - static boolean _initialized; - static boolean __debug; // shared debug status - private boolean _faux; - private boolean _jetty6; - private boolean _filtered; - ServletContext _context; - private boolean _debug; - - public void init(FilterConfig filterConfig) throws ServletException - { - boolean jetty_7_or_greater="org.eclipse.jetty.servlet".equals(filterConfig.getClass().getPackage().getName()); - _context = filterConfig.getServletContext(); - - String param=filterConfig.getInitParameter("debug"); - _debug=param!=null&&Boolean.parseBoolean(param); - if (_debug) - __debug=true; - - param=filterConfig.getInitParameter("jetty6"); - if (param==null) - param=filterConfig.getInitParameter("partial"); - if (param!=null) - _jetty6=Boolean.parseBoolean(param); - else - _jetty6=ContinuationSupport.__jetty6 && !jetty_7_or_greater; - - param=filterConfig.getInitParameter("faux"); - if (param!=null) - _faux=Boolean.parseBoolean(param); - else - _faux=!(jetty_7_or_greater || _jetty6 || _context.getMajorVersion()>=3); - - _filtered=_faux||_jetty6; - if (_debug) - _context.log("ContinuationFilter "+ - " jetty="+jetty_7_or_greater+ - " jetty6="+_jetty6+ - " faux="+_faux+ - " filtered="+_filtered+ - " servlet3="+ContinuationSupport.__servlet3); - _initialized=true; - } - - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException - { - if (_filtered) - { - 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 - { - if (fc==null || (fc).enter(response)) - chain.doFilter(request,response); - } - catch (ContinuationThrowable e) - { - debug("faux",e); - } - finally - { - if (fc==null) - fc = (FilteredContinuation) request.getAttribute(Continuation.ATTRIBUTE); - - complete=fc==null || (fc).exit(); - } - } - } - else - { - try - { - chain.doFilter(request,response); - } - catch (ContinuationThrowable e) - { - debug("caught",e); - } - } - } - - private void debug(String string) - { - if (_debug) - { - _context.log(string); - } - } - - private void debug(String string, Throwable th) - { - if (_debug) - { - if (th instanceof ContinuationThrowable) - _context.log(string+":"+th); - else - _context.log(string,th); - } - } - - public void destroy() - { - } - - public interface FilteredContinuation extends Continuation - { - boolean enter(ServletResponse response); - boolean exit(); - } -}
--- a/src/org/eclipse/jetty/continuation/ContinuationSupport.java Thu Sep 15 16:47:49 2016 -0600 +++ b/src/org/eclipse/jetty/continuation/ContinuationSupport.java Thu Sep 15 18:16:25 2016 -0600 @@ -32,133 +32,23 @@ */ 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 - { - boolean servlet3Support=false; - Constructor<? extends Continuation>s3cc=null; - try - { - boolean servlet3=ServletRequest.class.getMethod("startAsync")!=null; - if (servlet3) - { - Class<? extends Continuation> s3c = ContinuationSupport.class.getClassLoader().loadClass("org.eclipse.jetty.continuation.Servlet3Continuation").asSubclass(Continuation.class); - s3cc=s3c.getConstructor(ServletRequest.class); - servlet3Support=true; - } - } - catch (Exception e) - {} - finally - { - __servlet3=servlet3Support; - __newServlet3Continuation=s3cc; - } - - boolean jetty6Support=false; - Constructor<? extends Continuation>j6cc=null; - try - { - Class<?> jetty6ContinuationClass = ContinuationSupport.class.getClassLoader().loadClass("org.mortbay.util.ajax.Continuation"); - boolean jetty6=jetty6ContinuationClass!=null; - if (jetty6) - { - Class<? extends Continuation> j6c = ContinuationSupport.class.getClassLoader().loadClass("org.eclipse.jetty.continuation.Jetty6Continuation").asSubclass(Continuation.class); - j6cc=j6c.getConstructor(ServletRequest.class, jetty6ContinuationClass); - jetty6Support=true; - } - } - catch (Exception e) - {} - finally - { - __jetty6=jetty6Support; - __newJetty6Continuation=j6cc; - } - - Class<?> waiting=null; - try - { - waiting=ContinuationSupport.class.getClassLoader().loadClass("org.mortbay.util.ajax.WaitingContinuation"); - } - catch (Exception e) - { - } - finally - { - __waitingContinuation=waiting; - } - } + /* ------------------------------------------------------------ */ + /** + * Get a Continuation. The type of the Continuation returned may + * vary depending on the container in which the application is + * deployed. It may be an implementation native to the container (eg + * org.eclipse.jetty.server.AsyncContinuation) or one of the utility + * implementations provided such as an internal <code>FauxContinuation</code> + * or a real implementation like {@link org.eclipse.jetty.continuation.Servlet3Continuation}. + * @param request The request + * @return a Continuation instance + */ + public static Continuation getContinuation(ServletRequest request) + { + Continuation continuation = (Continuation) request.getAttribute(Continuation.ATTRIBUTE); + if (continuation!=null) + return continuation; - /* ------------------------------------------------------------ */ - /** - * Get a Continuation. The type of the Continuation returned may - * vary depending on the container in which the application is - * deployed. It may be an implementation native to the container (eg - * org.eclipse.jetty.server.AsyncContinuation) or one of the utility - * implementations provided such as an internal <code>FauxContinuation</code> - * or a real implementation like {@link org.eclipse.jetty.continuation.Servlet3Continuation}. - * @param request The request - * @return a Continuation instance - */ - public static Continuation getContinuation(ServletRequest request) - { - Continuation continuation = (Continuation) request.getAttribute(Continuation.ATTRIBUTE); - if (continuation!=null) - return continuation; - - while (request instanceof ServletRequestWrapper) - request=((ServletRequestWrapper)request).getRequest(); - - if (__servlet3 ) - { - try - { - continuation=__newServlet3Continuation.newInstance(request); - request.setAttribute(Continuation.ATTRIBUTE,continuation); - return continuation; - } - catch(Exception e) - { - throw new RuntimeException(e); - } - } - - if (__jetty6) - { - Object c=request.getAttribute("org.mortbay.jetty.ajax.Continuation"); - try - { - 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; - } - catch(Exception e) - { - throw new RuntimeException(e); - } - } - - throw new IllegalStateException("!(Jetty || Servlet 3.0 || ContinuationFilter)"); - } - - /* ------------------------------------------------------------ */ - /** - * @param request the servlet request - * @param response the servlet response - * @deprecated use {@link #getContinuation(ServletRequest)} - * @return the continuation - */ - @Deprecated - public static Continuation getContinuation(final ServletRequest request, final ServletResponse response) - { - return getContinuation(request); - } + throw new IllegalStateException("!(Jetty || Servlet 3.0 || ContinuationFilter)"); + } }
--- a/src/org/eclipse/jetty/continuation/FauxContinuation.java Thu Sep 15 16:47:49 2016 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,508 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - - -package org.eclipse.jetty.continuation; - -import java.util.ArrayList; - -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.ServletResponseWrapper; - -import org.eclipse.jetty.continuation.ContinuationFilter.FilteredContinuation; - - -/* ------------------------------------------------------------ */ -/** - * A blocking implementation of Continuation. - * This implementation of Continuation is used by the {@link ContinuationFilter} - * when there are is no native or asynchronous continuation type available. - */ -class FauxContinuation implements FilteredContinuation -{ - // common exception used for all continuations. - // Turn on debug in ContinuationFilter to see real stack trace. - private final static ContinuationThrowable __exception = new ContinuationThrowable(); - - private static final int __HANDLING=1; // Request dispatched to filter/servlet - private static final int __SUSPENDING=2; // Suspend called, but not yet returned to container - private static final int __RESUMING=3; // resumed while suspending - private static final int __COMPLETING=4; // resumed while suspending or suspended - private static final int __SUSPENDED=5; // Suspended and parked - private static final int __UNSUSPENDING=6; - private static final int __COMPLETE=7; - - private final ServletRequest _request; - private ServletResponse _response; - - private int _state=__HANDLING; - private boolean _initial=true; - private boolean _resumed=false; - private boolean _timeout=false; - private boolean _responseWrapped=false; - private long _timeoutMs=30000; // TODO configure - - private ArrayList<ContinuationListener> _listeners; - - FauxContinuation(final ServletRequest request) - { - _request=request; - } - - /* ------------------------------------------------------------ */ - public void onComplete() - { - if (_listeners!=null) - for (ContinuationListener l:_listeners) - l.onComplete(this); - } - - /* ------------------------------------------------------------ */ - public void onTimeout() - { - if (_listeners!=null) - for (ContinuationListener l:_listeners) - l.onTimeout(this); - } - - /* ------------------------------------------------------------ */ - /** - * @see org.eclipse.jetty.continuation.Continuation#isResponseWrapped() - */ - public boolean isResponseWrapped() - { - return _responseWrapped; - } - - /* ------------------------------------------------------------ */ - public boolean isInitial() - { - synchronized(this) - { - return _initial; - } - } - - /* ------------------------------------------------------------ */ - public boolean isResumed() - { - synchronized(this) - { - return _resumed; - } - } - - /* ------------------------------------------------------------ */ - public boolean isSuspended() - { - synchronized(this) - { - switch(_state) - { - case __HANDLING: - return false; - case __SUSPENDING: - case __RESUMING: - case __COMPLETING: - case __SUSPENDED: - return true; - case __UNSUSPENDING: - default: - return false; - } - } - } - - /* ------------------------------------------------------------ */ - public boolean isExpired() - { - synchronized(this) - { - return _timeout; - } - } - - /* ------------------------------------------------------------ */ - public void setTimeout(long timeoutMs) - { - _timeoutMs = timeoutMs; - } - - /* ------------------------------------------------------------ */ - public void suspend(ServletResponse response) - { - _response=response; - _responseWrapped=response instanceof ServletResponseWrapper; - suspend(); - } - - /* ------------------------------------------------------------ */ - public void suspend() - { - synchronized (this) - { - switch(_state) - { - case __HANDLING: - _timeout=false; - _resumed=false; - _state=__SUSPENDING; - return; - - case __SUSPENDING: - case __RESUMING: - return; - - case __COMPLETING: - case __SUSPENDED: - case __UNSUSPENDING: - throw new IllegalStateException(this.getStatusString()); - - default: - throw new IllegalStateException(""+_state); - } - - } - } - - - /* ------------------------------------------------------------ */ - /* (non-Javadoc) - * @see org.mortbay.jetty.Suspendor#resume() - */ - public void resume() - { - synchronized (this) - { - switch(_state) - { - case __HANDLING: - _resumed=true; - return; - - case __SUSPENDING: - _resumed=true; - _state=__RESUMING; - return; - - case __RESUMING: - case __COMPLETING: - return; - - case __SUSPENDED: - fauxResume(); - _resumed=true; - _state=__UNSUSPENDING; - break; - - case __UNSUSPENDING: - _resumed=true; - return; - - default: - throw new IllegalStateException(this.getStatusString()); - } - } - - } - - - /* ------------------------------------------------------------ */ - public void complete() - { - // just like resume, except don't set _resumed=true; - synchronized (this) - { - switch(_state) - { - case __HANDLING: - throw new IllegalStateException(this.getStatusString()); - - case __SUSPENDING: - _state=__COMPLETING; - break; - - case __RESUMING: - break; - - case __COMPLETING: - return; - - case __SUSPENDED: - _state=__COMPLETING; - fauxResume(); - break; - - case __UNSUSPENDING: - return; - - default: - throw new IllegalStateException(this.getStatusString()); - } - } - } - - /* ------------------------------------------------------------ */ - /** - * @see org.eclipse.jetty.continuation.Continuation#getServletResponse() - */ - public boolean enter(ServletResponse response) - { - _response=response; - return true; - } - - /* ------------------------------------------------------------ */ - /** - * @see org.eclipse.jetty.continuation.Continuation#getServletResponse() - */ - public ServletResponse getServletResponse() - { - return _response; - } - - - /* ------------------------------------------------------------ */ - void handling() - { - synchronized (this) - { - _responseWrapped=false; - switch(_state) - { - case __HANDLING: - throw new IllegalStateException(this.getStatusString()); - - case __SUSPENDING: - case __RESUMING: - throw new IllegalStateException(this.getStatusString()); - - case __COMPLETING: - return; - - case __SUSPENDED: - fauxResume(); - case __UNSUSPENDING: - _state=__HANDLING; - return; - - default: - throw new IllegalStateException(""+_state); - } - - } - } - - /* ------------------------------------------------------------ */ - /** - * @return true if handling is complete - */ - public boolean exit() - { - synchronized (this) - { - switch(_state) - { - case __HANDLING: - _state=__COMPLETE; - onComplete(); - return true; - - case __SUSPENDING: - _initial=false; - _state=__SUSPENDED; - fauxSuspend(); // could block and change state. - if (_state==__SUSPENDED || _state==__COMPLETING) - { - onComplete(); - return true; - } - - _initial=false; - _state=__HANDLING; - return false; - - case __RESUMING: - _initial=false; - _state=__HANDLING; - return false; - - case __COMPLETING: - _initial=false; - _state=__COMPLETE; - onComplete(); - return true; - - case __SUSPENDED: - case __UNSUSPENDING: - default: - throw new IllegalStateException(this.getStatusString()); - } - } - } - - /* ------------------------------------------------------------ */ - protected void expire() - { - // just like resume, except don't set _resumed=true; - - synchronized (this) - { - _timeout=true; - } - - onTimeout(); - - synchronized (this) - { - switch(_state) - { - case __HANDLING: - return; - - case __SUSPENDING: - _timeout=true; - _state=__RESUMING; - fauxResume(); - return; - - case __RESUMING: - return; - - case __COMPLETING: - return; - - case __SUSPENDED: - _timeout=true; - _state=__UNSUSPENDING; - break; - - case __UNSUSPENDING: - _timeout=true; - return; - - default: - throw new IllegalStateException(this.getStatusString()); - } - } - } - - private void fauxSuspend() - { - long expire_at = System.currentTimeMillis()+_timeoutMs; - long wait=_timeoutMs; - while (_timeoutMs>0 && wait>0) - { - try - { - this.wait(wait); - } - catch (InterruptedException e) - { - break; - } - wait=expire_at-System.currentTimeMillis(); - } - - if (_timeoutMs>0 && wait<=0) - expire(); - } - - private void fauxResume() - { - _timeoutMs=0; - this.notifyAll(); - } - - @Override - public String toString() - { - return getStatusString(); - } - - String getStatusString() - { - synchronized (this) - { - return - ((_state==__HANDLING)?"HANDLING": - (_state==__SUSPENDING)?"SUSPENDING": - (_state==__SUSPENDED)?"SUSPENDED": - (_state==__RESUMING)?"RESUMING": - (_state==__UNSUSPENDING)?"UNSUSPENDING": - (_state==__COMPLETING)?"COMPLETING": - ("???"+_state))+ - (_initial?",initial":"")+ - (_resumed?",resumed":"")+ - (_timeout?",timeout":""); - } - } - - - public void addContinuationListener(ContinuationListener listener) - { - if (_listeners==null) - _listeners=new ArrayList<ContinuationListener>(); - _listeners.add(listener); - - } - - /* ------------------------------------------------------------ */ - /** - * @see org.eclipse.jetty.continuation.Continuation#getAttribute(java.lang.String) - */ - public Object getAttribute(String name) - { - return _request.getAttribute(name); - } - - /* ------------------------------------------------------------ */ - /** - * @see org.eclipse.jetty.continuation.Continuation#removeAttribute(java.lang.String) - */ - public void removeAttribute(String name) - { - _request.removeAttribute(name); - } - - /* ------------------------------------------------------------ */ - /** - * @see org.eclipse.jetty.continuation.Continuation#setAttribute(java.lang.String, java.lang.Object) - */ - public void setAttribute(String name, Object attribute) - { - _request.setAttribute(name,attribute); - } - - /* ------------------------------------------------------------ */ - /** - * @see org.eclipse.jetty.continuation.Continuation#undispatch() - */ - public void undispatch() - { - if (isSuspended()) - { - if (ContinuationFilter.__debug) - throw new ContinuationThrowable(); - throw __exception; - } - throw new IllegalStateException("!suspended"); - - } -}