]> WPIA git - gigi.git/blob - lib/jetty/org/eclipse/jetty/server/AsyncContextState.java
Importing upstream Jetty jetty-9.2.1.v20140609
[gigi.git] / lib / jetty / org / eclipse / jetty / server / AsyncContextState.java
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 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 }