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