package cn.jcenterhome.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;
import cn.jcenterhome.util.Common;
import cn.jcenterhome.util.JavaCenterHome;
public class CometServlet extends HttpServlet implements CometProcessor {
private static final long serialVersionUID = 1L;
private final int TIMEOUT = Integer.MAX_VALUE;
private PostHandler postHandler = null;
public void init() throws ServletException {
postHandler = PostHandler.getInstance();
Thread postHandlerThread = new Thread(postHandler, "postHandler[only]");
postHandlerThread.setDaemon(true);
postHandlerThread.start();
}
public void destroy() {
postHandler.getConnections().clear();
postHandler.stop();
postHandler = null;
}
public void event(CometEvent event) throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
Map<Integer, HttpServletResponse> connections = postHandler.getConnections();
int currUserId = 0;
try {
currUserId = Integer.parseInt(request.getParameter("supe_uid"));
} catch(NumberFormatException e) {
//Ignore
}
if(currUserId > 0) {
if (event.getEventType() == CometEvent.EventType.BEGIN) {
event.setTimeout(TIMEOUT);
response.setCharacterEncoding(JavaCenterHome.JCH_CHARSET);
PrintWriter out = response.getWriter();
out.println("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
out.println("<head>");
out.println(" <title>Comet php backend</title>");
out.println(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
out.println("</head>");
out.println("<body>");
out.println(" <script type=\"text/javascript\">");
out.println(" var is_khtml = navigator.appName.match(\"Konqueror\") || navigator.appVersion.match(\"KHTML\");");
out.println(" if(is_khtml) {");
out.println(" var prototypejs = document.createElement('script');");
out.println(" prototypejs.setAttribute('type','text/javascript');");
out.println(" prototypejs.setAttribute('src', '"+Common.getSiteUrl(request)/*request.get*/+"source/prototype.js');");
out.println(" var head = document.getElementsByTagName('head');");
out.println(" head[0].appendChild(prototypejs);");
out.println(" }");
out.println(" var comet = window.parent.comet;");
out.println(" </script>");
synchronized(connections) {
connections.put(currUserId, response);
}
} else if (event.getEventType() == CometEvent.EventType.ERROR) {
synchronized (connections) {
connections.remove(currUserId);
}
response.getWriter().close();
event.close();
} else if (event.getEventType() == CometEvent.EventType.END) {
synchronized (connections) {
connections.remove(currUserId);
}
event.close();
} else if (event.getEventType() == CometEvent.EventType.READ) {
//Ignore
}
}
}
}