package example; import java.io.*; import java.util.*; import java.util.concurrent.*; import javax.servlet.*; import javax.servlet.http.*; import javax.inject.Inject; public class TestCometServlet extends GenericServlet { @Inject private TimerService _timerService; private ArrayList<CometState> _itemList = new ArrayList<CometState>(); @Override public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; if (req.getAttribute("comet") != null) { resume(request, response, req.getAsyncContext()); return; } req.setAttribute("comet", true); PrintWriter out = res.getWriter(); res.setHeader("Cache-Control", "no-cache, must-revalidate"); res.setHeader("Expires", "Mon, 27 Jul 1997 05:00:00 GMT"); res.setContentType("text/html"); out.println("<html><body>"); // Padding needed because Safari needs at least 1k data before // it will start progressive rendering. for (int i = 0; i < 100; i++) { out.println("<span></span>"); } out.println("<script type='text/javascript'>"); out.println("var comet_update = window.parent.comet_update;"); out.println("</script>"); AsyncContext async = request.startAsync(); CometState state = new CometState(request); // Add the comet state to the controller _timerService.addCometState(state); } private void resume(ServletRequest request, ServletResponse response, AsyncContext async) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; PrintWriter out = res.getWriter(); Object count = req.getAttribute("comet.count"); out.println("<script type='text/javascript'>"); out.println("comet_update(" + count + ");"); out.println("</script>"); Integer iCount = (Integer) count; if (iCount != null && iCount < 10) req.startAsync(); else req.setAttribute("comet.complete", true); } }