Mercurial Hosting > luan
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 } |