1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.server;
20
21 import java.io.IOException;
22
23 import javax.servlet.AsyncContext;
24 import javax.servlet.AsyncEvent;
25 import javax.servlet.AsyncListener;
26 import javax.servlet.ServletContext;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.ServletResponse;
30
31 import org.eclipse.jetty.server.handler.ContextHandler;
32
33
34 public class AsyncContextState implements AsyncContext
35 {
36 private final HttpChannel _channel;
37 volatile HttpChannelState _state;
38
39 public AsyncContextState(HttpChannelState state)
40 {
41 _state=state;
42 _channel=_state.getHttpChannel();
43 }
44
45 public HttpChannel getHttpChannel()
46 {
47 return _channel;
48 }
49
50 HttpChannelState state()
51 {
52 HttpChannelState state=_state;
53 if (state==null)
54 throw new IllegalStateException("AsyncContext completed");
55 return state;
56 }
57
58 @Override
59 public void addListener(final AsyncListener listener, final ServletRequest request, final ServletResponse response)
60 {
61 AsyncListener wrap = new AsyncListener()
62 {
63 @Override
64 public void onTimeout(AsyncEvent event) throws IOException
65 {
66 listener.onTimeout(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
67 }
68
69 @Override
70 public void onStartAsync(AsyncEvent event) throws IOException
71 {
72 listener.onStartAsync(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
73 }
74
75 @Override
76 public void onError(AsyncEvent event) throws IOException
77 {
78 listener.onError(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
79 }
80
81 @Override
82 public void onComplete(AsyncEvent event) throws IOException
83 {
84 listener.onComplete(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
85 }
86 };
87 state().addListener(wrap);
88 }
89
90 @Override
91 public void addListener(AsyncListener listener)
92 {
93 state().addListener(listener);
94 }
95
96 @Override
97 public void complete()
98 {
99 state().complete();
100 }
101
102 @Override
103 public <T extends AsyncListener> T createListener(Class<T> clazz) throws ServletException
104 {
105 ContextHandler contextHandler = state().getContextHandler();
106 if (contextHandler != null)
107 return contextHandler.getServletContext().createListener(clazz);
108 try
109 {
110 return clazz.newInstance();
111 }
112 catch (Exception e)
113 {
114 throw new ServletException(e);
115 }
116 }
117
118 @Override
119 public void dispatch()
120 {
121 state().dispatch(null,null);
122 }
123
124 @Override
125 public void dispatch(String path)
126 {
127 state().dispatch(null,path);
128 }
129
130 @Override
131 public void dispatch(ServletContext context, String path)
132 {
133 state().dispatch(context,path);
134 }
135
136 @Override
137 public ServletRequest getRequest()
138 {
139 return state().getAsyncContextEvent().getSuppliedRequest();
140 }
141
142 @Override
143 public ServletResponse getResponse()
144 {
145 return state().getAsyncContextEvent().getSuppliedResponse();
146 }
147
148 @Override
149 public long getTimeout()
150 {
151 return state().getTimeout();
152 }
153
154 @Override
155 public boolean hasOriginalRequestAndResponse()
156 {
157 HttpChannel channel=state().getHttpChannel();
158 return channel.getRequest()==getRequest() && channel.getResponse()==getResponse();
159 }
160
161 @Override
162 public void setTimeout(long arg0)
163 {
164 state().setTimeout(arg0);
165 }
166
167 @Override
168 public void start(final Runnable task)
169 {
170 final HttpChannel channel = state().getHttpChannel();
171 channel.execute(new Runnable()
172 {
173 @Override
174 public void run()
175 {
176 state().getAsyncContextEvent().getContext().getContextHandler().handle(channel.getRequest(),task);
177 }
178 });
179 }
180
181 public void reset()
182 {
183 _state=null;
184 }
185
186 public HttpChannelState getHttpChannelState()
187 {
188 return state();
189 }
190
191
192
193 }