KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > nl > justobjects > pushlet > servlet > Pushlet


1 // Copyright (c) 2000 Just Objects B.V. <just@justobjects.nl>
2
// Distributable under LGPL license. See terms of license at gnu.org.
3

4 package nl.justobjects.pushlet.servlet;
5
6 import nl.justobjects.pushlet.core.*;
7 import nl.justobjects.pushlet.util.Log;
8 import nl.justobjects.pushlet.util.Servlets;
9 import nl.justobjects.pushlet.util.PushletException;
10 import nl.justobjects.pushlet.Version;
11
12 import javax.servlet.ServletException JavaDoc;
13 import javax.servlet.http.HttpServlet JavaDoc;
14 import javax.servlet.http.HttpServletRequest JavaDoc;
15 import javax.servlet.http.HttpServletResponse JavaDoc;
16 import java.io.IOException JavaDoc;
17 import java.io.InputStreamReader JavaDoc;
18 import java.util.Enumeration JavaDoc;
19
20 /**
21  * Servlet runs a Subscriber per request.
22  *
23  * @version $Id: Pushlet.java,v 1.18 2005/02/28 15:58:05 justb Exp $
24  * @author Just van den Broecke - Just Objects &copy;
25  */

26 public class Pushlet extends HttpServlet JavaDoc implements Protocol {
27
28     public void init() throws ServletException JavaDoc {
29         // Start
30
Log.info("init() Pushlet Webapp - version=" + Version.SOFTWARE_VERSION + " built=" + Version.BUILD_DATE);
31
32         // Load configuration
33
Config.load();
34
35         // Set log level
36
Log.setLevel(Config.getIntProperty(Config.LOG_LEVEL));
37
38         // Start session manager
39
SessionManager.getInstance().start();
40
41         // Start event Dispatcher
42
Dispatcher.getInstance().start();
43
44
45         if (Config.getBoolProperty(Config.SOURCES_ACTIVATE)) {
46             EventSourceManager.start();
47         } else {
48             Log.info("Not starting local event sources");
49         }
50         // Log.setDebug(true);
51
}
52
53     public void destroy() {
54         Log.info("destroy(): Exit Pushlet webapp");
55
56         if (Config.getBoolProperty(Config.SOURCES_ACTIVATE)) {
57             // Stop local event sources
58
EventSourceManager.stop();
59         } else {
60             Log.info("No local event sources to stop");
61         }
62
63         // Should abort all subscribers
64
Dispatcher.getInstance().stop();
65
66         // Should stop all sessions
67
SessionManager.getInstance().stop();
68     }
69
70     /** Servlet GET request: handles event requests. */
71     public void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws ServletException JavaDoc, IOException JavaDoc {
72         Event event = null;
73
74         try {
75             // Event parm identifies event type from the client
76
String JavaDoc eventType = Servlets.getParameter(request, P_EVENT);
77
78             // Always must have an event type
79
if (eventType == null) {
80                 Log.warn("Pushlet.doGet(): bad request, no event specified");
81                 response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No eventType specified");
82                 return;
83             }
84
85             // Create Event and set attributes from parameters
86
event = new Event(eventType);
87             for (Enumeration JavaDoc e = request.getParameterNames(); e.hasMoreElements();) {
88                 String JavaDoc nextAttribute = (String JavaDoc) e.nextElement();
89                 event.setField(nextAttribute, request.getParameter(nextAttribute));
90             }
91
92
93         } catch (Throwable JavaDoc t) {
94             // Error creating event
95
Log.warn("Pushlet: Error creating event in doGet(): ", t);
96             response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
97             return;
98         }
99
100         // Handle parsed request
101
doRequest(event, request, response);
102
103     }
104
105     /** Servlet POST request: extracts event data from body. */
106     public void doPost(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws ServletException JavaDoc, IOException JavaDoc {
107         Event event = null;
108         try {
109             // Create Event by parsing XML from input stream.
110
event = EventParser.parse(new InputStreamReader JavaDoc(request.getInputStream()));
111
112             // Always must have an event type
113
if (event.getEventType() == null) {
114                 Log.warn("Pushlet.doPost(): bad request, no event specified");
115                 response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No eventType specified");
116                 return;
117             }
118
119
120         } catch (Throwable JavaDoc t) {
121             // Error creating event
122
Log.warn("Pushlet: Error creating event in doPost(): ", t);
123             response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
124             return;
125         }
126
127         // Handle parsed request
128
doRequest(event, request, response);
129
130     }
131
132     /** Generic request handler (GET+POST). */
133     protected void doRequest(Event anEvent, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) {
134         // Must have valid event type.
135
String JavaDoc eventType = anEvent.getEventType();
136         try {
137
138             // Get Session: either by creating (on Join eventType)
139
// or by id (any other eventType, since client is supposed to have joined).
140
Session session = null;
141             if (eventType.startsWith(Protocol.E_JOIN)) {
142                 // Join request: create new subscriber
143
session = SessionManager.getInstance().createSession(anEvent);
144
145                 String JavaDoc userAgent = request.getHeader("User-Agent");
146                 if (userAgent != null) {
147                     userAgent = userAgent.toLowerCase();
148                 } else {
149                     userAgent = "unknown";
150                 }
151                 session.setUserAgent(userAgent);
152
153             } else {
154                 // Must be a request for existing Session
155

156                 // Get id
157
String JavaDoc id = anEvent.getField(P_ID);
158
159                 // We must have an id value
160
if (id == null) {
161                     response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No id specified");
162                     Log.warn("Pushlet: bad request, no id specified event=" + eventType);
163                     return;
164                 }
165
166                 // We have an id: get the session object
167
session = SessionManager.getInstance().getSession(id);
168
169                 // Check for invalid id
170
if (session == null) {
171                     response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid or expired id");
172                     Log.warn("Pushlet: bad request, no session found id=" + id + " event=" + eventType);
173                     return;
174                 }
175             }
176
177             // ASSERTION: we have a valid Subscriber
178

179             // Let Controller handle request further
180
// including exceptions
181
Command command = Command.create(session, anEvent, request, response);
182             session.getController().doCommand(command);
183         } catch (Throwable JavaDoc t) {
184             // Hmm we should never ever get here
185
Log.warn("Pushlet: Exception in doRequest() event=" + eventType, t);
186             t.printStackTrace();
187             response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
188             return;
189         }
190
191     }
192 }
193
194
195 /*
196  * $Log: Pushlet.java,v $
197  * Revision 1.18 2005/02/28 15:58:05 justb
198  * added SimpleListener example
199  *
200  * Revision 1.17 2005/02/28 13:06:01 justb
201  * introduced join-listen protocol service
202  *
203  * Revision 1.16 2005/02/28 12:45:59 justb
204  * introduced Command class
205  *
206  * Revision 1.15 2005/02/28 09:14:56 justb
207  * sessmgr/dispatcher factory/singleton support
208  *
209  * Revision 1.14 2005/02/25 15:13:04 justb
210  * session id generation more robust
211  *
212  * Revision 1.13 2005/02/21 17:19:21 justb
213  * move init()/destroy() to Pushlet servlet
214  *
215  * Revision 1.12 2005/02/21 16:59:17 justb
216  * SessionManager and session lease introduced
217  *
218  * Revision 1.11 2005/02/21 11:50:47 justb
219  * ohase1 of refactoring Subscriber into Session/Controller/Subscriber
220  *
221  * Revision 1.10 2005/02/20 13:05:32 justb
222  * removed the Postlet (integrated in Pushlet protocol)
223  *
224  * Revision 1.9 2005/02/18 10:07:23 justb
225  * many renamings of classes (make names compact)
226  *
227  * Revision 1.8 2005/01/13 14:47:15 justb
228  * control evt: send response on same (control) connection
229  *
230  * Revision 1.7 2004/10/24 12:58:18 justb
231  * revised client and test classes for new protocol
232  *
233  * Revision 1.6 2004/09/26 21:39:44 justb
234  * allow multiple subscriptions and out-of-band requests
235  *
236  * Revision 1.5 2004/09/20 22:01:40 justb
237  * more changes for new protocol
238  *
239  * Revision 1.4 2004/09/03 22:35:37 justb
240  * Almost complete rewrite, just checking in now
241  *
242  * Revision 1.3 2004/08/13 23:36:06 justb
243  * rewrite of Pullet into Pushlet "pull" mode
244  *
245  * Revision 1.2 2003/08/15 08:37:40 justb
246  * fix/add Copyright+LGPL file headers and footers
247  *
248  * Revision 1.1 2003/08/13 13:26:57 justb
249  * moved all servlets to servlet package
250  *
251  * Revision 1.2 2003/05/18 16:15:08 justb
252  * support for XML encoded Events
253  *
254  * Revision 1.1.1.1 2002/09/24 21:02:32 justb
255  * import to sourceforge
256  *
257  * Revision 1.1.1.1 2002/09/20 22:48:18 justb
258  * import to SF
259  *
260  * Revision 1.1.1.1 2002/09/20 14:19:04 justb
261  * first import into SF
262  *
263  * Revision 1.3 2002/04/15 20:42:41 just
264  * reformatting and renaming GuardedQueue to EventQueue
265  *
266  * Revision 1.2 2000/08/21 20:48:29 just
267  * added CVS log and id tags plus copyrights
268  *
269  *
270  */

271
272
Popular Tags