KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > icesoft > faces > webapp > http > servlet > ContinuationAdaptingServlet


1 package com.icesoft.faces.webapp.http.servlet;
2
3 import com.icesoft.faces.webapp.http.common.ResponseHandler;
4 import com.icesoft.faces.webapp.http.common.Server;
5 import org.mortbay.util.ajax.Continuation;
6 import org.mortbay.util.ajax.ContinuationSupport;
7
8 import javax.servlet.http.HttpServletRequest JavaDoc;
9 import javax.servlet.http.HttpServletResponse JavaDoc;
10 import java.util.HashMap JavaDoc;
11 import java.util.Map JavaDoc;
12
13 public class ContinuationAdaptingServlet implements PseudoServlet {
14     private Map JavaDoc requests = new HashMap JavaDoc();
15     private Server server;
16
17     public ContinuationAdaptingServlet(Server server) {
18         this.server = server;
19     }
20
21     public void service(final HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws Exception JavaDoc {
22         if (requests.containsKey(request)) {
23             ResponseHandler handler = (ResponseHandler) requests.remove(request);
24             handler.respond(new ServletRequestResponse(request, response));
25         } else {
26             ContinuationRequestResponse requestResponse = new ContinuationRequestResponse(request, response);
27             server.service(requestResponse);
28             requestResponse.captureContinuation();
29         }
30     }
31
32     public void shutdown() {
33         server.shutdown();
34     }
35
36     private class ContinuationRequestResponse extends ServletRequestResponse {
37         private boolean captureContinuation = true;
38         private Continuation continuation;
39
40         public ContinuationRequestResponse(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) {
41             super(request, response);
42         }
43
44         public synchronized void respondWith(ResponseHandler handler) throws Exception JavaDoc {
45             if (continuation == null) {
46                 captureContinuation = false;
47                 super.respondWith(handler);
48             } else {
49                 continuation.resume();
50                 requests.put(request, handler);
51             }
52         }
53
54         public synchronized void captureContinuation() {
55             if (captureContinuation) {
56                 continuation = ContinuationSupport.getContinuation(request, this);
57                 continuation.suspend(request.getSession().getMaxInactiveInterval() * 1000);
58             }
59         }
60     }
61 }
62
Popular Tags