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 volatile HttpChannelState _state;
37
38 public AsyncContextState(HttpChannelState state)
39 {
40 _state=state;
41 }
42
43 HttpChannelState state()
44 {
45 HttpChannelState state=_state;
46 if (state==null)
47 throw new IllegalStateException("AsyncContext completed");
48 return state;
49 }
50
51 @Override
52 public void addListener(final AsyncListener listener, final ServletRequest request, final ServletResponse response)
53 {
54 AsyncListener wrap = new AsyncListener()
55 {
56 @Override
57 public void onTimeout(AsyncEvent event) throws IOException
58 {
59 listener.onTimeout(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
60 }
61
62 @Override
63 public void onStartAsync(AsyncEvent event) throws IOException
64 {
65 listener.onStartAsync(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
66 }
67
68 @Override
69 public void onError(AsyncEvent event) throws IOException
70 {
71 listener.onComplete(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
72 }
73
74 @Override
75 public void onComplete(AsyncEvent event) throws IOException
76 {
77 listener.onComplete(new AsyncEvent(event.getAsyncContext(),request,response,event.getThrowable()));
78 }
79 };
80 state().addListener(wrap);
81 }
82
83 @Override
84 public void addListener(AsyncListener listener)
85 {
86 state().addListener(listener);
87 }
88
89 @Override
90 public void complete()
91 {
92 state().complete();
93 }
94
95 @Override
96 public <T extends AsyncListener> T createListener(Class<T> clazz) throws ServletException
97 {
98 ContextHandler contextHandler = state().getContextHandler();
99 if (contextHandler != null)
100 return contextHandler.getServletContext().createListener(clazz);
101 try
102 {
103 return clazz.newInstance();
104 }
105 catch (Exception e)
106 {
107 throw new ServletException(e);
108 }
109 }
110
111 @Override
112 public void dispatch()
113 {
114 state().dispatch(null,null);
115 }
116
117 @Override
118 public void dispatch(String path)
119 {
120 state().dispatch(null,path);
121 }
122
123 @Override
124 public void dispatch(ServletContext context, String path)
125 {
126 state().dispatch(context,path);
127 }
128
129 @Override
130 public ServletRequest getRequest()
131 {
132 return state().getAsyncContextEvent().getSuppliedRequest();
133 }
134
135 @Override
136 public ServletResponse getResponse()
137 {
138 return state().getAsyncContextEvent().getSuppliedResponse();
139 }
140
141 @Override
142 public long getTimeout()
143 {
144 return state().getTimeout();
145 }
146
147 @Override
148 public boolean hasOriginalRequestAndResponse()
149 {
150 HttpChannel<?> channel=state().getHttpChannel();
151 return channel.getRequest()==getRequest() && channel.getResponse()==getResponse();
152 }
153
154 @Override
155 public void setTimeout(long arg0)
156 {
157 state().setTimeout(arg0);
158 }
159
160 @Override
161 public void start(final Runnable task)
162 {
163 state().getHttpChannel().execute(new Runnable()
164 {
165 @Override
166 public void run()
167 {
168 state().getAsyncContextEvent().getContext().getContextHandler().handle(task);
169 }
170 });
171 }
172
173 public void reset()
174 {
175 _state=null;
176 }
177
178 public HttpChannelState getHttpChannelState()
179 {
180 return state();
181 }
182
183
184
185 }