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 ; 9 import javax.servlet.http.HttpServletResponse ; 10 import java.util.HashMap ; 11 import java.util.Map ; 12 13 public class ContinuationAdaptingServlet implements PseudoServlet { 14 private Map requests = new HashMap (); 15 private Server server; 16 17 public ContinuationAdaptingServlet(Server server) { 18 this.server = server; 19 } 20 21 public void service(final HttpServletRequest request, HttpServletResponse response) throws Exception { 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 request, HttpServletResponse response) { 41 super(request, response); 42 } 43 44 public synchronized void respondWith(ResponseHandler handler) throws Exception { 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 |