1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.forgerock.http.servlet;
18
19 import java.io.IOException;
20
21 import jakarta.servlet.AsyncContext;
22 import jakarta.servlet.AsyncEvent;
23 import jakarta.servlet.AsyncListener;
24 import jakarta.servlet.http.HttpServletRequest;
25 import jakarta.servlet.http.HttpServletResponse;
26
27 import org.forgerock.http.servlet.Servlet2Adapter.Servlet2Synchronizer;
28
29
30
31
32 final class Servlet3Adapter implements ServletVersionAdapter {
33
34
35
36
37
38 private final static class Servlet3Synchronizer implements ServletSynchronizer {
39 private final AsyncContext asyncContext;
40
41 private Servlet3Synchronizer(HttpServletRequest httpRequest) {
42 if (httpRequest.isAsyncStarted()) {
43 this.asyncContext = httpRequest.getAsyncContext();
44 } else {
45 this.asyncContext = httpRequest.startAsync();
46
47 asyncContext.setTimeout(0);
48 }
49 }
50
51 @Override
52 public void setAsyncListener(final Runnable runnable) {
53 asyncContext.addListener(new AsyncListener() {
54
55 @Override
56 public void onComplete(AsyncEvent event) throws IOException {
57 runnable.run();
58 }
59
60 @Override
61 public void onError(AsyncEvent event) throws IOException {
62 runnable.run();
63 }
64
65 @Override
66 public void onStartAsync(AsyncEvent event) throws IOException {
67
68 event.getAsyncContext().addListener(this);
69 }
70
71 @Override
72 public void onTimeout(AsyncEvent event) throws IOException {
73 runnable.run();
74 }
75 });
76 }
77
78 @Override
79 public void awaitIfNeeded() throws InterruptedException {
80
81 }
82
83 @Override
84 public void signalAndComplete() {
85 asyncContext.complete();
86 }
87 }
88
89 Servlet3Adapter() {
90
91 }
92
93 @Override
94 public ServletSynchronizer createServletSynchronizer(HttpServletRequest httpRequest,
95 HttpServletResponse httpResponse) {
96 if (httpRequest.isAsyncSupported()) {
97 return new Servlet3Synchronizer(httpRequest);
98 } else {
99
100 return new Servlet2Synchronizer();
101 }
102 }
103 }