comparison src/org/eclipse/jetty/continuation/ContinuationFilter.java @ 802:3428c60d7cfc

replace jetty jars with source
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 07 Sep 2016 21:15:48 -0600
parents
children
comparison
equal deleted inserted replaced
801:6a21393191c1 802:3428c60d7cfc
1 //
2 // ========================================================================
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19 package org.eclipse.jetty.continuation;
20
21 import java.io.IOException;
22
23 import javax.servlet.Filter;
24 import javax.servlet.FilterChain;
25 import javax.servlet.FilterConfig;
26 import javax.servlet.ServletContext;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.ServletResponse;
30
31
32
33 /* ------------------------------------------------------------ */
34 /**
35 * <p>ContinuationFilter must be applied to servlet paths that make use of
36 * the asynchronous features provided by {@link Continuation} APIs, but that
37 * are deployed in servlet containers that are neither Jetty (>= 7) nor a
38 * compliant Servlet 3.0 container.</p>
39 * <p>The following init parameters may be used to configure the filter (these are mostly for testing):</p>
40 * <dl>
41 * <dt>debug</dt><dd>Boolean controlling debug output</dd>
42 * <dt>jetty6</dt><dd>Boolean to force use of Jetty 6 continuations</dd>
43 * <dt>faux</dt><dd>Boolean to force use of faux continuations</dd>
44 * </dl>
45 * <p>If the servlet container is not Jetty (either 6 or 7) nor a Servlet 3
46 * container, then "faux" continuations will be used.</p>
47 * <p>Faux continuations will just put the thread that called {@link Continuation#suspend()}
48 * in wait, and will notify that thread when {@link Continuation#resume()} or
49 * {@link Continuation#complete()} is called.</p>
50 * <p>Faux continuations are not threadless continuations (they are "faux" - fake - for this reason)
51 * and as such they will scale less than proper continuations.</p>
52 */
53 public class ContinuationFilter implements Filter
54 {
55 static boolean _initialized;
56 static boolean __debug; // shared debug status
57 private boolean _faux;
58 private boolean _jetty6;
59 private boolean _filtered;
60 ServletContext _context;
61 private boolean _debug;
62
63 public void init(FilterConfig filterConfig) throws ServletException
64 {
65 boolean jetty_7_or_greater="org.eclipse.jetty.servlet".equals(filterConfig.getClass().getPackage().getName());
66 _context = filterConfig.getServletContext();
67
68 String param=filterConfig.getInitParameter("debug");
69 _debug=param!=null&&Boolean.parseBoolean(param);
70 if (_debug)
71 __debug=true;
72
73 param=filterConfig.getInitParameter("jetty6");
74 if (param==null)
75 param=filterConfig.getInitParameter("partial");
76 if (param!=null)
77 _jetty6=Boolean.parseBoolean(param);
78 else
79 _jetty6=ContinuationSupport.__jetty6 && !jetty_7_or_greater;
80
81 param=filterConfig.getInitParameter("faux");
82 if (param!=null)
83 _faux=Boolean.parseBoolean(param);
84 else
85 _faux=!(jetty_7_or_greater || _jetty6 || _context.getMajorVersion()>=3);
86
87 _filtered=_faux||_jetty6;
88 if (_debug)
89 _context.log("ContinuationFilter "+
90 " jetty="+jetty_7_or_greater+
91 " jetty6="+_jetty6+
92 " faux="+_faux+
93 " filtered="+_filtered+
94 " servlet3="+ContinuationSupport.__servlet3);
95 _initialized=true;
96 }
97
98 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
99 {
100 if (_filtered)
101 {
102 Continuation c = (Continuation) request.getAttribute(Continuation.ATTRIBUTE);
103 FilteredContinuation fc;
104 if (_faux && (c==null || !(c instanceof FauxContinuation)))
105 {
106 fc = new FauxContinuation(request);
107 request.setAttribute(Continuation.ATTRIBUTE,fc);
108 }
109 else
110 fc=(FilteredContinuation)c;
111
112 boolean complete=false;
113 while (!complete)
114 {
115 try
116 {
117 if (fc==null || (fc).enter(response))
118 chain.doFilter(request,response);
119 }
120 catch (ContinuationThrowable e)
121 {
122 debug("faux",e);
123 }
124 finally
125 {
126 if (fc==null)
127 fc = (FilteredContinuation) request.getAttribute(Continuation.ATTRIBUTE);
128
129 complete=fc==null || (fc).exit();
130 }
131 }
132 }
133 else
134 {
135 try
136 {
137 chain.doFilter(request,response);
138 }
139 catch (ContinuationThrowable e)
140 {
141 debug("caught",e);
142 }
143 }
144 }
145
146 private void debug(String string)
147 {
148 if (_debug)
149 {
150 _context.log(string);
151 }
152 }
153
154 private void debug(String string, Throwable th)
155 {
156 if (_debug)
157 {
158 if (th instanceof ContinuationThrowable)
159 _context.log(string+":"+th);
160 else
161 _context.log(string,th);
162 }
163 }
164
165 public void destroy()
166 {
167 }
168
169 public interface FilteredContinuation extends Continuation
170 {
171 boolean enter(ServletResponse response);
172 boolean exit();
173 }
174 }