KickJava   Java API By Example, From Geeks To Geeks.

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


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 JavaDoc;
19 import javax.servlet.http.HttpServletResponse JavaDoc;
20 import javax.servlet.http.HttpSession JavaDoc;
21 import java.util.Collection JavaDoc;
22 import java.util.HashMap JavaDoc;
23 import java.util.HashSet JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.Map JavaDoc;
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 JavaDoc request, HttpServletResponse JavaDoc response) throws Exception JavaDoc {
32         }
33         public void shutdown() {
34         }
35     };
36     private Runnable JavaDoc drainUpdatedViews = new Runnable JavaDoc() {
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 JavaDoc views = new HashMap JavaDoc();
47     private ViewQueue allUpdatedViews = new ViewQueue();
48     private Collection JavaDoc synchronouslyUpdatedViews = new HashSet JavaDoc();
49
50     private HttpSession JavaDoc session;
51     private String JavaDoc sessionID;
52
53     public MainSessionBoundServlet(HttpSession JavaDoc 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             //drain the updated views queue if in 'synchronous mode'
73
allUpdatedViews.onPut(drainUpdatedViews);
74             sendUpdatedViews = NOOPServlet;
75             sendUpdates = NOOPServlet;
76             receivePing = NOOPServlet;
77         } else {
78             //setup blocking connection server
79
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 JavaDoc request, HttpServletResponse JavaDoc response) throws Exception JavaDoc {
97         dispatcher.service(request, response);
98     }
99
100     public void shutdown() {
101         Iterator JavaDoc 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             //wait for the for the bridge to receive the 'session-expire' command
109
Thread.sleep(1000);
110         } catch (InterruptedException JavaDoc e) {
111             //do nothing
112
} finally {
113             dispatcher.shutdown();
114         }
115
116         Iterator JavaDoc viewIterator = views.values().iterator();
117         while (viewIterator.hasNext()) {
118             ServletView view = (ServletView) viewIterator.next();
119             view.dispose();
120         }
121     }
122
123     //Exposing queues for Tomcat 6 Ajax Push
124
public ViewQueue getAllUpdatedViews() {
125         return allUpdatedViews;
126     }
127
128     public Collection JavaDoc getSynchronouslyUpdatedViews() {
129         return synchronouslyUpdatedViews;
130     }
131 }
132
Popular Tags