1 2 package com.icesoft.faces.webapp.http.servlet; 3 4 5 import java.io.IOException ; 6 import java.io.InputStream ; 7 import java.io.Writer ; 8 import java.io.PrintWriter ; 9 10 import java.util.ArrayList ; 11 import java.util.Collection ; 12 import java.util.Set ; 13 import java.util.HashSet ; 14 import java.util.Iterator ; 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 ; 23 import javax.servlet.http.HttpServlet ; 24 import javax.servlet.http.HttpServletRequest ; 25 import javax.servlet.http.HttpServletResponse ; 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 implements CometProcessor { 33 34 private static Log log = LogFactory.getLog(TomcatPushServlet.class); 35 36 public void init() throws ServletException { 37 } 38 39 public void destroy() { 40 } 41 42 49 public void event(CometEvent event) 50 throws IOException , ServletException { 51 52 HttpServletRequest request = event.getHttpServletRequest(); 53 HttpServletResponse 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 request, HttpServletResponse response) 67 throws IOException , ServletException { 68 MainSessionBoundServlet mainBound = (MainSessionBoundServlet) 71 SessionDispatcher.getSingletonSessionServlet(request.getSession()); 72 ViewQueue allUpdatedViews = mainBound.getAllUpdatedViews(); 73 Collection synchronouslyUpdatedViews = 74 mainBound.getSynchronouslyUpdatedViews(); 75 allUpdatedViews.onPut( new EventResponder( 76 event, synchronouslyUpdatedViews, allUpdatedViews) ); 77 } 78 79 protected void end(CometEvent event, HttpServletRequest request, HttpServletResponse response) 80 throws IOException , ServletException { 81 event.close(); 82 } 83 84 protected void error(CometEvent event, HttpServletRequest request, HttpServletResponse response) 85 throws IOException , ServletException { 86 } 87 88 protected void read(CometEvent event, HttpServletRequest request, HttpServletResponse response) 89 throws IOException , ServletException { 90 InputStream is = request.getInputStream(); 91 byte[] buf = new byte[512]; 92 do { 93 int n = is.read(buf); if (n > 0) { 95 if (log.isDebugEnabled()) { 96 log.debug( "Read " + n + " bytes: " 97 + new String (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 request, HttpServletResponse response) 108 throws IOException , ServletException { 109 throw new ServletException ("service() not supported by TomcatPushServlet"); 111 } 112 113 114 } 115 116 117 class EventResponder implements Runnable { 118 ViewQueue allUpdatedViews; 119 Collection synchronouslyUpdatedViews; 120 CometEvent event; 121 Writer writer; 122 123 public EventResponder(CometEvent event, 124 Collection synchronouslyUpdatedViews, 125 ViewQueue allUpdatedViews) { 126 this.event = event; 127 this.synchronouslyUpdatedViews = synchronouslyUpdatedViews; 128 this.allUpdatedViews = allUpdatedViews; 129 try { 130 HttpServletResponse response = event.getHttpServletResponse(); 131 writer = response.getWriter(); 132 response.setContentType("text/xml;charset=UTF-8"); 133 } catch (IOException e) { 134 e.printStackTrace(); 135 } 136 } 137 138 public void run() { 139 try { 140 allUpdatedViews.removeAll(synchronouslyUpdatedViews); 141 synchronouslyUpdatedViews.clear(); 142 Set viewIdentifiers = new HashSet (allUpdatedViews); 143 if (!viewIdentifiers.isEmpty()) { 144 Iterator 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 e) { 154 e.printStackTrace(); 155 } 156 } 157 158 } 159 | Popular Tags |