import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.net.*; import java.util.*; import com.objectspace.jgl.*; import com.oreilly.servlet.DaemonHttpServlet; public class ModChatServlet extends DaemonHttpServlet { //Initialize global variables HashMap msgHolder = new HashMap(); public void init(ServletConfig config) throws ServletException { super.init(config); } //Process the HTTP Get request public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); out.println(getNextMessage(req)); } //Process the HTTP Post request public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String message = req.getParameter("message"); if(message != null) broadcastMessage(message); res.setStatus(res.SC_NO_CONTENT); } //return the next new message public String getNextMessage(HttpServletRequest req){ ModMessageSink MSink= new ModMessageSink(); ModMessageSource source = new ModMessageSource(); Thread t1 = new Thread(source); t1.start(); return MSink.getNextMessage(source); } //inform all currently listening clients that there is a new message public void broadcastMessage(String message){ System.out.println("Adding new message..."); msgHolder.add("daljeet", message); // source.sendMessage(message); } public void handleClient(Socket client){ } //Get Servlet information public String getServletInfo() { return "MDM.ChatServlet Information"; } class ModMessageSource extends Observable implements Runnable{ public void run(){ while (msgHolder.count("daljeet")==0){ try{ Thread.sleep(5000000); System.out.println("Thread going to sleep:"); } catch(Exception e){;} } sendMessage((String)msgHolder.values("daljeet").nextElement()); msgHolder.remove("daljeet"); } public void sendMessage(String message){ setChanged(); notifyObservers(message); } } class ModMessageSink implements Observer{ String message = null; synchronized public void update(Observable o, Object arg){ message = (String) arg; notify(); } synchronized public String getNextMessage(ModMessageSource source){ source.addObserver(this); while (message == null){ try{wait();}catch(Exception ignored) {} } source.deleteObserver(this); String messageCopy = message; message = null; return messageCopy; } } }