package sd.web.controllers; import java.io.*; import java.net.InetSocketAddress; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import javax.naming.*; import javax.rmi.*; import java.util.Hashtable; import org.json.*; import com.alcidesfonseca.mvc.RoutedServlet; import sd.web.models.*; import sd.web.templates.JSONMessage; public class ChatServlet extends RoutedServlet { static String prefix = "/chat"; private Hashtable<String,ChatConnection> conns; public ChatServlet() throws NamingException { super(); } public void init() { conns = new Hashtable<String,ChatConnection>(); Thread wd = new WatchDog(conns); wd.start(); } public void route(String method, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { HttpSession s = request.getSession(true); ChatConnection conn = conns.get(s.getId()); if ( conn == null ) { conn = new ChatConnection(); conns.put(s.getId(), conn); } conn.ping(); response.setContentType("application/x-json"); PrintWriter out = response.getWriter(); String req = getPath(request,prefix); if ( req.equals("login") ) { if (method.equals("post")) view_post_login(request,out,conn); else view_get_login(request,out,conn); } else if ( req.equals("messages")) { if (method.equals("put")) { view_put_messages(request,out,conn); } else { view_get_messages(request,out,conn); } } else if ( req.equals("status") && method.equals("post")) { view_post_status(request,out,conn); } else if ( req.equals("roster")) { if (method.equals("get")) { view_get_roster(request,out,conn); } else if ( method.equals("put")) { view_put_roster(request,out,conn); } else if ( method.equals("delete")) { view_delete_roster(request,out,conn); } else if ( method.equals("post")) { view_post_roster(request,out,conn); } } else if ( req.equals("updates") && method.equals("get")) { view_get_updates(request,out,conn); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND,"Page not found."); } } private void view_post_login(HttpServletRequest request, PrintWriter out, ChatConnection con) { HttpSession s = request.getSession(true); boolean r; String u = request.getParameter("user"); String p = request.getParameter("pwd"); String serv = request.getParameter("server"); if ( u.length() + p.length() > 0 ) { try { if ( serv.equals("") ) { r = con.connect(u,p); } else { r = con.connect(u,p,new InetSocketAddress("jabber.org",5222)); } if (r) { out.println(new JSONMessage("ok","Connection started")); } else { out.println(new JSONMessage("error","Error in connection")); } } catch (sd.ns.NoServerAvailableException e) { out.println(new JSONMessage("error","No Server Available")); } catch (java.rmi.RemoteException e) { out.println(new JSONMessage("error","Error in Connection")); } } else { out.println(new JSONMessage("error","Data cannot be blank")); } } public void view_put_messages(HttpServletRequest request, PrintWriter out, ChatConnection con) { String to = request.getParameter("to"); String what = request.getParameter("content"); if ( to != null && what != null) { con.sendMessage(to,what); out.println(new JSONMessage("ok","Message Sent")); } else { out.println(new JSONMessage("error","Can't be blank.")); } } public void view_post_status(HttpServletRequest request, PrintWriter out, ChatConnection con) { String sta = request.getParameter("presence"); if (sta != null) { con.sendPresence(sta); out.println(new JSONMessage("ok","Status updated")); } else { out.println(new JSONMessage("error","Can't be blank.")); } } public void view_put_roster(HttpServletRequest request, PrintWriter out, ChatConnection con) { String jid = request.getParameter("jid"); if ( jid != null) { con.rosterAdd(jid); out.println(new JSONMessage("ok","Request Sent")); } else { out.println(new JSONMessage("error","Can't be blank.")); } } public void view_post_roster(HttpServletRequest request, PrintWriter out, ChatConnection con) { String acc = request.getParameter("accepted"); String jid = request.getParameter("jid"); if ( acc != null && jid != null) { con.rosterAccept(jid, acc.equals("true") ); out.println(new JSONMessage("ok","Request accepted")); } else { out.println(new JSONMessage("error","Can't be blank.")); } } public void view_delete_roster(HttpServletRequest request, PrintWriter out, ChatConnection con) { String jid = request.getParameter("jid"); if ( jid != null) { con.rosterDel(jid); out.println(new JSONMessage("ok","Request Sent")); } else { out.println(new JSONMessage("error","Can't be blank.")); } } public void view_get_messages(HttpServletRequest request, PrintWriter out, ChatConnection con) { try { JSONObject j = new JSONObject(); j.put("status","ok"); j.put("messages",con.retrieveMessages()); out.println(j); } catch (JSONException e) { out.println(new JSONMessage("error","Weird error.")); } } public void view_get_roster(HttpServletRequest request, PrintWriter out, ChatConnection con) { try { JSONObject j = new JSONObject(); j.put("status","ok"); j.put("roster",con.retrieveRoster()); j.put("myJid",con.getJid()); out.println(j); } catch (JSONException e) { out.println(new JSONMessage("error","Weird error.")); } } public void view_get_login(HttpServletRequest request, PrintWriter out, ChatConnection con) { int i = con.checkLogin(); if ( i == 0) out.println(new JSONMessage("wait","Please wait")); if ( i < 0) out.println(new JSONMessage("fail","Wrong Login")); if ( i > 0) out.println(new JSONMessage("ok","logged")); } public void view_get_updates(HttpServletRequest request, PrintWriter out, ChatConnection con) { try { JSONObject j = new JSONObject(); j.put("status","ok"); j.put("messages",con.retrieveMessages()); j.put("roster",con.retrieveRoster()); j.put("requests",con.retrieveRequests()); j.put("myJid",con.getJid()); out.println(j); } catch (JSONException e) { out.println(new JSONMessage("error","Weird error.")); } } }