View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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 }