package com.sun.grizzly.samples;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.sun.grizzly.comet.CometContext;
import com.sun.grizzly.comet.CometEngine;
import com.sun.grizzly.comet.CometEvent;
import com.sun.grizzly.comet.CometHandler;

import java.util.concurrent.atomic.AtomicInteger;

public class CometCount extends HttpServlet {

    
    private final AtomicInteger counter = new AtomicInteger();
    
    
    private class CounterHandler implements CometHandler<HttpServletResponse> {
        
        private HttpServletResponse response;
        
        public void onEvent(CometEvent event) throws IOException {
            if (CometEvent.NOTIFY == event.getType()) {
                int count = counter.get();
                PrintWriter writer = response.getWriter();
                writer.write("<script type='text/javascript'>parent.updateCount('" + count + "')</script>\n");
                writer.flush();
                //event.getCometContext().resumeCometHandler(this);
            }
        }
        
        public void onInitialize(CometEvent event) throws IOException {
        }
        
        public void onInterrupt(CometEvent event) throws IOException {
            removeThisFromContext();
        }
        
        public void onTerminate(CometEvent event) throws IOException {
            removeThisFromContext();
        }
        
        public void attach(HttpServletResponse attachment) {
            this.response = attachment;
        }

        private void removeThisFromContext() throws IOException {
            response.getWriter().close();
            CometContext context =
                    CometEngine.getEngine().getCometContext(contextPath);
            context.removeCometHandler(this);
        }
    }
    
    private static final long serialVersionUID = 1L;
    
    private String contextPath = null;
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        ServletContext context = config.getServletContext();
        contextPath = context.getContextPath() + "/MyComet";
        
        CometEngine engine = CometEngine.getEngine();
        CometContext cometContext = engine.register(contextPath);
        cometContext.setExpirationDelay(120 * 1000);
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        
        CounterHandler handler = new CounterHandler();
        handler.attach(res);
        
        CometEngine engine = CometEngine.getEngine();
        CometContext context = engine.getCometContext(contextPath);
        
        context.addCometHandler(handler);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        counter.incrementAndGet();
        
        CometEngine engine = CometEngine.getEngine();
        CometContext<?> context = engine.getCometContext(contextPath);
        context.notify(null);
    }
}