comparison src/org/eclipse/jetty/continuation/FauxContinuation.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
20 package org.eclipse.jetty.continuation;
21
22 import java.util.ArrayList;
23
24 import javax.servlet.ServletRequest;
25 import javax.servlet.ServletResponse;
26 import javax.servlet.ServletResponseWrapper;
27
28 import org.eclipse.jetty.continuation.ContinuationFilter.FilteredContinuation;
29
30
31 /* ------------------------------------------------------------ */
32 /**
33 * A blocking implementation of Continuation.
34 * This implementation of Continuation is used by the {@link ContinuationFilter}
35 * when there are is no native or asynchronous continuation type available.
36 */
37 class FauxContinuation implements FilteredContinuation
38 {
39 // common exception used for all continuations.
40 // Turn on debug in ContinuationFilter to see real stack trace.
41 private final static ContinuationThrowable __exception = new ContinuationThrowable();
42
43 private static final int __HANDLING=1; // Request dispatched to filter/servlet
44 private static final int __SUSPENDING=2; // Suspend called, but not yet returned to container
45 private static final int __RESUMING=3; // resumed while suspending
46 private static final int __COMPLETING=4; // resumed while suspending or suspended
47 private static final int __SUSPENDED=5; // Suspended and parked
48 private static final int __UNSUSPENDING=6;
49 private static final int __COMPLETE=7;
50
51 private final ServletRequest _request;
52 private ServletResponse _response;
53
54 private int _state=__HANDLING;
55 private boolean _initial=true;
56 private boolean _resumed=false;
57 private boolean _timeout=false;
58 private boolean _responseWrapped=false;
59 private long _timeoutMs=30000; // TODO configure
60
61 private ArrayList<ContinuationListener> _listeners;
62
63 FauxContinuation(final ServletRequest request)
64 {
65 _request=request;
66 }
67
68 /* ------------------------------------------------------------ */
69 public void onComplete()
70 {
71 if (_listeners!=null)
72 for (ContinuationListener l:_listeners)
73 l.onComplete(this);
74 }
75
76 /* ------------------------------------------------------------ */
77 public void onTimeout()
78 {
79 if (_listeners!=null)
80 for (ContinuationListener l:_listeners)
81 l.onTimeout(this);
82 }
83
84 /* ------------------------------------------------------------ */
85 /**
86 * @see org.eclipse.jetty.continuation.Continuation#isResponseWrapped()
87 */
88 public boolean isResponseWrapped()
89 {
90 return _responseWrapped;
91 }
92
93 /* ------------------------------------------------------------ */
94 public boolean isInitial()
95 {
96 synchronized(this)
97 {
98 return _initial;
99 }
100 }
101
102 /* ------------------------------------------------------------ */
103 public boolean isResumed()
104 {
105 synchronized(this)
106 {
107 return _resumed;
108 }
109 }
110
111 /* ------------------------------------------------------------ */
112 public boolean isSuspended()
113 {
114 synchronized(this)
115 {
116 switch(_state)
117 {
118 case __HANDLING:
119 return false;
120 case __SUSPENDING:
121 case __RESUMING:
122 case __COMPLETING:
123 case __SUSPENDED:
124 return true;
125 case __UNSUSPENDING:
126 default:
127 return false;
128 }
129 }
130 }
131
132 /* ------------------------------------------------------------ */
133 public boolean isExpired()
134 {
135 synchronized(this)
136 {
137 return _timeout;
138 }
139 }
140
141 /* ------------------------------------------------------------ */
142 public void setTimeout(long timeoutMs)
143 {
144 _timeoutMs = timeoutMs;
145 }
146
147 /* ------------------------------------------------------------ */
148 public void suspend(ServletResponse response)
149 {
150 _response=response;
151 _responseWrapped=response instanceof ServletResponseWrapper;
152 suspend();
153 }
154
155 /* ------------------------------------------------------------ */
156 public void suspend()
157 {
158 synchronized (this)
159 {
160 switch(_state)
161 {
162 case __HANDLING:
163 _timeout=false;
164 _resumed=false;
165 _state=__SUSPENDING;
166 return;
167
168 case __SUSPENDING:
169 case __RESUMING:
170 return;
171
172 case __COMPLETING:
173 case __SUSPENDED:
174 case __UNSUSPENDING:
175 throw new IllegalStateException(this.getStatusString());
176
177 default:
178 throw new IllegalStateException(""+_state);
179 }
180
181 }
182 }
183
184
185 /* ------------------------------------------------------------ */
186 /* (non-Javadoc)
187 * @see org.mortbay.jetty.Suspendor#resume()
188 */
189 public void resume()
190 {
191 synchronized (this)
192 {
193 switch(_state)
194 {
195 case __HANDLING:
196 _resumed=true;
197 return;
198
199 case __SUSPENDING:
200 _resumed=true;
201 _state=__RESUMING;
202 return;
203
204 case __RESUMING:
205 case __COMPLETING:
206 return;
207
208 case __SUSPENDED:
209 fauxResume();
210 _resumed=true;
211 _state=__UNSUSPENDING;
212 break;
213
214 case __UNSUSPENDING:
215 _resumed=true;
216 return;
217
218 default:
219 throw new IllegalStateException(this.getStatusString());
220 }
221 }
222
223 }
224
225
226 /* ------------------------------------------------------------ */
227 public void complete()
228 {
229 // just like resume, except don't set _resumed=true;
230 synchronized (this)
231 {
232 switch(_state)
233 {
234 case __HANDLING:
235 throw new IllegalStateException(this.getStatusString());
236
237 case __SUSPENDING:
238 _state=__COMPLETING;
239 break;
240
241 case __RESUMING:
242 break;
243
244 case __COMPLETING:
245 return;
246
247 case __SUSPENDED:
248 _state=__COMPLETING;
249 fauxResume();
250 break;
251
252 case __UNSUSPENDING:
253 return;
254
255 default:
256 throw new IllegalStateException(this.getStatusString());
257 }
258 }
259 }
260
261 /* ------------------------------------------------------------ */
262 /**
263 * @see org.eclipse.jetty.continuation.Continuation#getServletResponse()
264 */
265 public boolean enter(ServletResponse response)
266 {
267 _response=response;
268 return true;
269 }
270
271 /* ------------------------------------------------------------ */
272 /**
273 * @see org.eclipse.jetty.continuation.Continuation#getServletResponse()
274 */
275 public ServletResponse getServletResponse()
276 {
277 return _response;
278 }
279
280
281 /* ------------------------------------------------------------ */
282 void handling()
283 {
284 synchronized (this)
285 {
286 _responseWrapped=false;
287 switch(_state)
288 {
289 case __HANDLING:
290 throw new IllegalStateException(this.getStatusString());
291
292 case __SUSPENDING:
293 case __RESUMING:
294 throw new IllegalStateException(this.getStatusString());
295
296 case __COMPLETING:
297 return;
298
299 case __SUSPENDED:
300 fauxResume();
301 case __UNSUSPENDING:
302 _state=__HANDLING;
303 return;
304
305 default:
306 throw new IllegalStateException(""+_state);
307 }
308
309 }
310 }
311
312 /* ------------------------------------------------------------ */
313 /**
314 * @return true if handling is complete
315 */
316 public boolean exit()
317 {
318 synchronized (this)
319 {
320 switch(_state)
321 {
322 case __HANDLING:
323 _state=__COMPLETE;
324 onComplete();
325 return true;
326
327 case __SUSPENDING:
328 _initial=false;
329 _state=__SUSPENDED;
330 fauxSuspend(); // could block and change state.
331 if (_state==__SUSPENDED || _state==__COMPLETING)
332 {
333 onComplete();
334 return true;
335 }
336
337 _initial=false;
338 _state=__HANDLING;
339 return false;
340
341 case __RESUMING:
342 _initial=false;
343 _state=__HANDLING;
344 return false;
345
346 case __COMPLETING:
347 _initial=false;
348 _state=__COMPLETE;
349 onComplete();
350 return true;
351
352 case __SUSPENDED:
353 case __UNSUSPENDING:
354 default:
355 throw new IllegalStateException(this.getStatusString());
356 }
357 }
358 }
359
360 /* ------------------------------------------------------------ */
361 protected void expire()
362 {
363 // just like resume, except don't set _resumed=true;
364
365 synchronized (this)
366 {
367 _timeout=true;
368 }
369
370 onTimeout();
371
372 synchronized (this)
373 {
374 switch(_state)
375 {
376 case __HANDLING:
377 return;
378
379 case __SUSPENDING:
380 _timeout=true;
381 _state=__RESUMING;
382 fauxResume();
383 return;
384
385 case __RESUMING:
386 return;
387
388 case __COMPLETING:
389 return;
390
391 case __SUSPENDED:
392 _timeout=true;
393 _state=__UNSUSPENDING;
394 break;
395
396 case __UNSUSPENDING:
397 _timeout=true;
398 return;
399
400 default:
401 throw new IllegalStateException(this.getStatusString());
402 }
403 }
404 }
405
406 private void fauxSuspend()
407 {
408 long expire_at = System.currentTimeMillis()+_timeoutMs;
409 long wait=_timeoutMs;
410 while (_timeoutMs>0 && wait>0)
411 {
412 try
413 {
414 this.wait(wait);
415 }
416 catch (InterruptedException e)
417 {
418 break;
419 }
420 wait=expire_at-System.currentTimeMillis();
421 }
422
423 if (_timeoutMs>0 && wait<=0)
424 expire();
425 }
426
427 private void fauxResume()
428 {
429 _timeoutMs=0;
430 this.notifyAll();
431 }
432
433 @Override
434 public String toString()
435 {
436 return getStatusString();
437 }
438
439 String getStatusString()
440 {
441 synchronized (this)
442 {
443 return
444 ((_state==__HANDLING)?"HANDLING":
445 (_state==__SUSPENDING)?"SUSPENDING":
446 (_state==__SUSPENDED)?"SUSPENDED":
447 (_state==__RESUMING)?"RESUMING":
448 (_state==__UNSUSPENDING)?"UNSUSPENDING":
449 (_state==__COMPLETING)?"COMPLETING":
450 ("???"+_state))+
451 (_initial?",initial":"")+
452 (_resumed?",resumed":"")+
453 (_timeout?",timeout":"");
454 }
455 }
456
457
458 public void addContinuationListener(ContinuationListener listener)
459 {
460 if (_listeners==null)
461 _listeners=new ArrayList<ContinuationListener>();
462 _listeners.add(listener);
463
464 }
465
466 /* ------------------------------------------------------------ */
467 /**
468 * @see org.eclipse.jetty.continuation.Continuation#getAttribute(java.lang.String)
469 */
470 public Object getAttribute(String name)
471 {
472 return _request.getAttribute(name);
473 }
474
475 /* ------------------------------------------------------------ */
476 /**
477 * @see org.eclipse.jetty.continuation.Continuation#removeAttribute(java.lang.String)
478 */
479 public void removeAttribute(String name)
480 {
481 _request.removeAttribute(name);
482 }
483
484 /* ------------------------------------------------------------ */
485 /**
486 * @see org.eclipse.jetty.continuation.Continuation#setAttribute(java.lang.String, java.lang.Object)
487 */
488 public void setAttribute(String name, Object attribute)
489 {
490 _request.setAttribute(name,attribute);
491 }
492
493 /* ------------------------------------------------------------ */
494 /**
495 * @see org.eclipse.jetty.continuation.Continuation#undispatch()
496 */
497 public void undispatch()
498 {
499 if (isSuspended())
500 {
501 if (ContinuationFilter.__debug)
502 throw new ContinuationThrowable();
503 throw __exception;
504 }
505 throw new IllegalStateException("!suspended");
506
507 }
508 }