KickJava   Java API By Example, From Geeks To Geeks.

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


1
2 package com.icesoft.faces.webapp.http.servlet;
3
4
5 import java.io.IOException JavaDoc;
6 import java.io.InputStream JavaDoc;
7 import java.io.Writer JavaDoc;
8 import java.io.PrintWriter JavaDoc;
9
10 import java.util.ArrayList JavaDoc;
11 import java.util.Collection JavaDoc;
12 import java.util.Set JavaDoc;
13 import java.util.HashSet JavaDoc;
14 import java.util.Iterator JavaDoc;
15
16 import org.apache.catalina.CometEvent;
17 import org.apache.catalina.CometProcessor;
18
19 import org.apache.commons.logging.Log;
20 import org.apache.commons.logging.LogFactory;
21
22 import javax.servlet.ServletException JavaDoc;
23 import javax.servlet.http.HttpServlet JavaDoc;
24 import javax.servlet.http.HttpServletRequest JavaDoc;
25 import javax.servlet.http.HttpServletResponse JavaDoc;
26
27 import com.icesoft.faces.webapp.http.core.SendUpdatedViews;
28 import com.icesoft.faces.webapp.http.core.ViewQueue;
29
30
31 public class TomcatPushServlet
32     extends HttpServlet JavaDoc implements CometProcessor {
33
34     private static Log log = LogFactory.getLog(TomcatPushServlet.class);
35
36     public void init() throws ServletException JavaDoc {
37     }
38
39     public void destroy() {
40     }
41
42     /**
43      * Process the given Comet event.
44      *
45      * @param event The Comet event that will be processed
46      * @throws IOException
47      * @throws ServletException
48      */

49     public void event(CometEvent event)
50         throws IOException JavaDoc, ServletException JavaDoc {
51
52         HttpServletRequest JavaDoc request = event.getHttpServletRequest();
53         HttpServletResponse JavaDoc response = event.getHttpServletResponse();
54         
55         if (event.getEventType() == CometEvent.EventType.BEGIN) {
56             begin(event, request, response);
57         } else if (event.getEventType() == CometEvent.EventType.ERROR) {
58             error(event, request, response);
59         } else if (event.getEventType() == CometEvent.EventType.END) {
60             end(event, request, response);
61         } else if (event.getEventType() == CometEvent.EventType.READ) {
62             read(event, request, response);
63         }
64     }
65
66     protected void begin(CometEvent event, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
67         throws IOException JavaDoc, ServletException JavaDoc {
68         //We need access to the CometEvent, but this is not passed down through
69
//our dispatcher chain, so we obtain the queues directly here
70
MainSessionBoundServlet mainBound = (MainSessionBoundServlet)
71                 SessionDispatcher.getSingletonSessionServlet(request.getSession());
72         ViewQueue allUpdatedViews = mainBound.getAllUpdatedViews();
73         Collection JavaDoc synchronouslyUpdatedViews =
74                 mainBound.getSynchronouslyUpdatedViews();
75         allUpdatedViews.onPut( new EventResponder(
76                 event, synchronouslyUpdatedViews, allUpdatedViews) );
77     }
78     
79     protected void end(CometEvent event, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
80         throws IOException JavaDoc, ServletException JavaDoc {
81         event.close();
82     }
83     
84     protected void error(CometEvent event, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
85         throws IOException JavaDoc, ServletException JavaDoc {
86     }
87     
88     protected void read(CometEvent event, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
89         throws IOException JavaDoc, ServletException JavaDoc {
90             InputStream JavaDoc is = request.getInputStream();
91             byte[] buf = new byte[512];
92             do {
93                 int n = is.read(buf); //can throw an IOException
94
if (n > 0) {
95                     if (log.isDebugEnabled()) {
96                         log.debug( "Read " + n + " bytes: "
97                                 + new String JavaDoc(buf, 0, n) + " for session: "
98                                 + request.getSession(true).getId() );
99                     }
100                 } else if (n < 0) {
101                     error(event, request, response);
102                     return;
103                 }
104             } while (is.available() > 0);
105     }
106
107     protected void service(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
108         throws IOException JavaDoc, ServletException JavaDoc {
109         // Not used by Tomcat6
110
throw new ServletException JavaDoc("service() not supported by TomcatPushServlet");
111     }
112     
113
114 }
115
116
117 class EventResponder implements Runnable JavaDoc {
118     ViewQueue allUpdatedViews;
119     Collection JavaDoc synchronouslyUpdatedViews;
120     CometEvent event;
121     Writer JavaDoc writer;
122
123     public EventResponder(CometEvent event,
124             Collection JavaDoc synchronouslyUpdatedViews,
125             ViewQueue allUpdatedViews) {
126         this.event = event;
127         this.synchronouslyUpdatedViews = synchronouslyUpdatedViews;
128         this.allUpdatedViews = allUpdatedViews;
129         try {
130             HttpServletResponse JavaDoc response = event.getHttpServletResponse();
131             writer = response.getWriter();
132             response.setContentType("text/xml;charset=UTF-8");
133         } catch (IOException JavaDoc e) {
134             e.printStackTrace();
135         }
136     }
137
138     public void run() {
139         try {
140             allUpdatedViews.removeAll(synchronouslyUpdatedViews);
141             synchronouslyUpdatedViews.clear();
142             Set JavaDoc viewIdentifiers = new HashSet JavaDoc(allUpdatedViews);
143             if (!viewIdentifiers.isEmpty()) {
144                 Iterator JavaDoc identifiers = viewIdentifiers.iterator();
145                 writer.write("<updated-views>");
146                 while (identifiers.hasNext()) {
147                     writer.write(identifiers.next().toString());
148                     writer.write(' ');
149                 }
150                 writer.write("</updated-views>");
151                 event.close();
152             }
153         } catch (Throwable JavaDoc e) {
154             e.printStackTrace();
155         }
156     }
157     
158 }
159
Popular Tags