package org.jboss.errai.bus.server.servlet; import com.google.inject.Singleton; import com.sun.grizzly.arp.AsyncExecutor; import com.sun.grizzly.arp.AsyncFilter; import com.sun.grizzly.arp.AsyncHandler; import com.sun.grizzly.arp.AsyncTask; import com.sun.grizzly.comet.*; import com.sun.grizzly.http.ProcessorTask; import org.jboss.errai.bus.client.api.Message; import org.jboss.errai.bus.client.framework.MarshalledMessage; import org.jboss.errai.bus.server.MessageQueue; import org.mvel2.util.StringAppender; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.OutputStream; import java.nio.CharBuffer; import java.util.Iterator; import java.util.List; import static org.jboss.errai.bus.server.io.MessageFactory.createCommandMessage; /** * The GrizzlyCometServlet provides the HTTP-protocol gateway between the server bus and the client buses, * using Glassfish. */ @Singleton public class GrizzlyCometServlet extends AbstractErraiServlet { private String contextPath = null; public void init(ServletConfig config) throws ServletException { super.init(config); System.out.println("init !!!!!!!!!!!!"); ServletContext context = config.getServletContext(); contextPath = context.getContextPath() + "/in.erraiBus"; CometEngine engine = CometEngine.getEngine(); CometContext cometContext = engine.register(contextPath); cometContext.setExpirationDelay(120 * 1000); } @Override protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { System.out.println("doGet !!!!!!!!!!!!"); GrizzlyCometHandler handler = new GrizzlyCometHandler(); handler.attach(httpServletResponse); CometEngine engine = CometEngine.getEngine(); CometContext context = engine.getCometContext(contextPath); context.addCometHandler(handler); // try { // final MessageQueue queue = service.getBus().getQueue(httpServletRequest.getSession().getId()); // // if (queue == null) // sendDisconnectWithReason(httpServletResponse.getOutputStream(), // "There is no queue associated with this session."); // // synchronized (queue) { // pollQueue(queue, httpServletRequest, httpServletResponse); // } // } // catch (final Throwable t) { // t.printStackTrace(); // // httpServletResponse.setHeader("Cache-Control", "no-cache"); // httpServletResponse.addHeader("Payload-Size", "1"); // httpServletResponse.setContentType("application/json"); // OutputStream stream = httpServletResponse.getOutputStream(); // // stream.write('['); // // writeToOutputStream(stream, new MarshalledMessage() { // public String getSubject() { // return "ClientBusErrors"; // } // // public Object getMessage() { // StringBuilder b = new StringBuilder("{ErrorMessage:\"").append(t.getMessage()).append("\",AdditionalDetails:\""); // for (StackTraceElement e : t.getStackTrace()) { // b.append(e.toString()).append("
"); // } // // return b.append("\"}").toString(); // } // }); // // stream.write(']'); // } } @Override protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { System.out.println("doPost !!!!!!!!!!!!"); CometEngine engine = CometEngine.getEngine(); CometContext context = engine.getCometContext(contextPath); context.notify(null); // BufferedReader reader = httpServletRequest.getReader(); // StringAppender sb = new StringAppender(httpServletRequest.getContentLength()); // CharBuffer buffer = CharBuffer.allocate(10); // // int read; // while ((read = reader.read(buffer)) > 0) { // buffer.rewind(); // for (; read > 0; read--) { // sb.append(buffer.get()); // } // buffer.rewind(); // } // // for (Message msg : createCommandMessage(sessionProvider.getSession(httpServletRequest.getSession()), sb.toString())) { // service.store(msg); // } // // pollQueue(service.getBus().getQueue(httpServletRequest.getSession().getId()), httpServletRequest, httpServletResponse); } private static void pollQueue(MessageQueue queue, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { // queue.heartBeat(); // // List messages = queue.poll(false).getMessages(); // // httpServletResponse.setHeader("Cache-Control", "no-cache"); // // httpServletResponse.addHeader("Payload-Size", String.valueOf(messages.size())); // httpServletResponse.setContentType("application/json"); // OutputStream stream = httpServletResponse.getOutputStream(); // // Iterator iter = messages.iterator(); // // stream.write('['); // while (iter.hasNext()) { // writeToOutputStream(stream, iter.next()); // if (iter.hasNext()) { // stream.write(','); // } // } // stream.write(']'); // stream.flush(); } private class GrizzlyCometHandler implements CometHandler { private HttpServletResponse response; public void onInitialize(CometEvent event) throws IOException { System.out.println("onInitialize !!!!!!!!!!!!"); } public void onInterrupt(CometEvent event) throws IOException { System.out.println("onInterr !!!!!!!!!!!!"); } public void onTerminate(CometEvent event) throws IOException { System.out.println("onTerm !!!!!!!!!!!!"); } public void attach(HttpServletResponse attachment) { System.out.println("attach !!!!!!!!!!!!"); this.response = attachment; } public void onEvent(CometEvent event) throws IOException { System.out.println("onEvent !!!!!!!!!!!!"); // if (CometEvent.NOTIFY == event.getType()) { // int count = 5; // PrintWriter writer = response.getWriter(); // writer.write("\n"); // writer.flush(); // event.getCometContext().resumeCometHandler(this); // } } } }