1 package com.icesoft.faces.webapp.http.servlet; 2 3 import com.icesoft.faces.util.event.servlet.ContextEventRepeater; 4 import com.icesoft.faces.webapp.command.CommandQueue; 5 import com.icesoft.faces.webapp.command.SessionExpired; 6 import com.icesoft.faces.webapp.http.common.Configuration; 7 import com.icesoft.faces.webapp.http.core.DisposeViews; 8 import com.icesoft.faces.webapp.http.core.IDVerifier; 9 import com.icesoft.faces.webapp.http.core.ReceivePing; 10 import com.icesoft.faces.webapp.http.core.ReceiveSendUpdates; 11 import com.icesoft.faces.webapp.http.core.SendUpdatedViews; 12 import com.icesoft.faces.webapp.http.core.SendUpdates; 13 import com.icesoft.faces.webapp.http.core.ViewQueue; 14 import com.icesoft.util.IdGenerator; 15 import org.apache.commons.logging.Log; 16 import org.apache.commons.logging.LogFactory; 17 18 import javax.servlet.http.HttpServletRequest ; 19 import javax.servlet.http.HttpServletResponse ; 20 import javax.servlet.http.HttpSession ; 21 import java.util.Collection ; 22 import java.util.HashMap ; 23 import java.util.HashSet ; 24 import java.util.Iterator ; 25 import java.util.Map ; 26 27 public class MainSessionBoundServlet implements PseudoServlet { 28 private static final Log Log = LogFactory.getLog(MainSessionBoundServlet.class); 29 private static final SessionExpired SessionExpired = new SessionExpired(); 30 private static final PseudoServlet NOOPServlet = new PseudoServlet() { 31 public void service(HttpServletRequest request, HttpServletResponse response) throws Exception { 32 } 33 public void shutdown() { 34 } 35 }; 36 private Runnable drainUpdatedViews = new Runnable () { 37 public void run() { 38 allUpdatedViews.removeAll(synchronouslyUpdatedViews); 39 if (!allUpdatedViews.isEmpty()) { 40 Log.warn(allUpdatedViews + " views have accumulated updates"); 41 } 42 allUpdatedViews.clear(); 43 } 44 }; 45 private PathDispatcher dispatcher = new PathDispatcher(); 46 private Map views = new HashMap (); 47 private ViewQueue allUpdatedViews = new ViewQueue(); 48 private Collection synchronouslyUpdatedViews = new HashSet (); 49 50 private HttpSession session; 51 private String sessionID; 52 53 public MainSessionBoundServlet(HttpSession session, SessionDispatcher.Listener.Monitor sessionMonitor, IdGenerator idGenerator, Configuration configuration) { 54 this.session = session; 55 sessionID = idGenerator.newIdentifier(); 56 ContextEventRepeater.iceFacesIdRetrieved(this.session, sessionID); 57 58 final PseudoServlet viewServlet; 59 final PseudoServlet disposeViews; 60 if (configuration.getAttributeAsBoolean("concurrentDOMViews", false)) { 61 viewServlet = new MultiViewServlet(this.session, sessionID, sessionMonitor, views, allUpdatedViews, configuration); 62 disposeViews = new BasicAdaptingServlet(new IDVerifier(sessionID, new DisposeViews(views))); 63 } else { 64 viewServlet = new SingleViewServlet(this.session, sessionID, sessionMonitor, views, allUpdatedViews, configuration); 65 disposeViews = NOOPServlet; 66 } 67 68 final PseudoServlet sendUpdatedViews; 69 final PseudoServlet sendUpdates; 70 final PseudoServlet receivePing; 71 if (configuration.getAttributeAsBoolean("synchronousUpdate", false)) { 72 allUpdatedViews.onPut(drainUpdatedViews); 74 sendUpdatedViews = NOOPServlet; 75 sendUpdates = NOOPServlet; 76 receivePing = NOOPServlet; 77 } else { 78 sendUpdatedViews = new EnvironmentAdaptingServlet(new IDVerifier(sessionID, new SendUpdatedViews(synchronouslyUpdatedViews, allUpdatedViews)), configuration, sessionID, synchronouslyUpdatedViews, allUpdatedViews, this.session.getServletContext()); 80 sendUpdates = new BasicAdaptingServlet(new IDVerifier(sessionID, new SendUpdates(views))); 81 receivePing = new BasicAdaptingServlet(new IDVerifier(sessionID, new ReceivePing(views))); 82 } 83 84 PseudoServlet upload = new UploadServlet(views, configuration, this.session.getServletContext()); 85 PseudoServlet receiveSendUpdates = new ViewBoundAdaptingServlet(new IDVerifier(sessionID, new ReceiveSendUpdates(views, synchronouslyUpdatedViews)), sessionMonitor, views); 86 87 dispatcher.dispatchOn(".*block\\/send\\-receive\\-updates$", receiveSendUpdates); 88 dispatcher.dispatchOn(".*block\\/receive\\-updated\\-views$", sendUpdatedViews); 89 dispatcher.dispatchOn(".*block\\/receive\\-updates$", sendUpdates); 90 dispatcher.dispatchOn(".*block\\/ping$", receivePing); 91 dispatcher.dispatchOn(".*block\\/dispose\\-views$", disposeViews); 92 dispatcher.dispatchOn(".*uploadHtml", upload); 93 dispatcher.dispatchOn(".*", viewServlet); 94 } 95 96 public void service(HttpServletRequest request, HttpServletResponse response) throws Exception { 97 dispatcher.service(request, response); 98 } 99 100 public void shutdown() { 101 Iterator i = views.values().iterator(); 102 while (i.hasNext()) { 103 CommandQueue commandQueue = (CommandQueue) i.next(); 104 commandQueue.put(SessionExpired); 105 } 106 ContextEventRepeater.iceFacesIdDisposed(session, sessionID); 107 try { 108 Thread.sleep(1000); 110 } catch (InterruptedException e) { 111 } finally { 113 dispatcher.shutdown(); 114 } 115 116 Iterator viewIterator = views.values().iterator(); 117 while (viewIterator.hasNext()) { 118 ServletView view = (ServletView) viewIterator.next(); 119 view.dispose(); 120 } 121 } 122 123 public ViewQueue getAllUpdatedViews() { 125 return allUpdatedViews; 126 } 127 128 public Collection getSynchronouslyUpdatedViews() { 129 return synchronouslyUpdatedViews; 130 } 131 } 132 | Popular Tags |