import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import com.objectspace.jgl.*; public class MDChatServlet extends HttpServlet { //Initialize global variables HashMap messageRepository; String user,message,invitemes; MDChatUserRepository usernames; static int count; String randid=""; String userid=""; String userarray[]=new String[50]; java.sql.Connection connect; java.sql.Statement st; java.sql.ResultSet rs; //Thread to clean the messageRepository RepositoryCleanerThread repCleaner; public void init(ServletConfig config) throws ServletException { super.init(config); try { // Properties props = getProperties(); Class.forName("postgresql.Driver"); // connect=java.sql.DriverManager.getConnection((String)props.get("DBConURL"), (String)props.get("UName"), (String)props.get("PWord")); connect=java.sql.DriverManager.getConnection("jdbc:postgresql://192.165.1.4/mdm", "postgres", "postgres"); // Class.forName("oracle.jdbc.driver.OracleDriver"); // connect=java.sql.DriverManager.getConnection("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST=128.12.12.70)))(CONNECT_DATA=(SID=ORCL)))", "mdm", "mdm"); System.out.println("Chat Servlet: Established connection"); st=connect.createStatement(); }catch (Exception e){ e.printStackTrace(); } usernames = MDChatUserRepository.getInstance(); messageRepository = new HashMap(true); RepositoryCleanerThread repCleaner = new RepositoryCleanerThread(); repCleaner.setPriority(Thread.MIN_PRIORITY); repCleaner.setDaemon(true); repCleaner.start(); } //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //This will be used to pick the messages String mode = request.getParameter("mode"); if(mode.equalsIgnoreCase("get")){ ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream()); try{ Vector result = new Vector(); String userName = request.getParameter("userName"); String randid = request.getParameter("randid"); Hashtable uservec = (Hashtable)usernames.get(randid); if(uservec != null){ uservec.put(userName, new Long(System.currentTimeMillis())); } System.out.println("MDChatServ: get: "+ userName + messageRepository); Enumeration e = messageRepository.values(userName); messageRepository.remove(userName); while(e.hasMoreElements()){ result.addElement((String)e.nextElement()); } oos.writeObject(result); System.out.println("MDChatServ: get result: "+ userName + result); result = null; e = null; } catch(Exception ex){ ex.printStackTrace(); } finally{ oos.close(); } } else if(mode.equalsIgnoreCase("post")){ //Process the post messages here //This will be used to put messages in hashmap try{ String sub=""; message = request.getParameter("message"); System.out.println("Chat servlet inside post " + message); if (message != null){ //This is a normal chat message if (message.charAt(0)=='$') { try { randid=message.substring(1,message.indexOf("*")); addMessageToRepository(message); } catch(Exception e){ e.printStackTrace(); } } // Acceptance of the invitation else if (message.charAt(0)=='^') { int ind=message.indexOf("*"); randid=(message.substring(1,ind)).trim(); userid=(message.substring(ind+1,message.length())).trim(); System.out.println("User accepted "+userid); System.out.println("Randid accepted "+randid); Hashtable uservec = (Hashtable)usernames.get(randid); System.out.println("Taking the uservec success"); message="#"+randid+"*"; System.out.println("MD Chat befor accept : " + uservec); if(uservec != null){ uservec.put(userid, new Long(System.currentTimeMillis())); System.out.println("MD Chat after accept : " + uservec); System.out.println("Putting the uservec success"); Enumeration enum = uservec.keys(); while (enum.hasMoreElements()){ message+=(String)enum.nextElement() + "*"; } addMessageToRepository(message); } } //Removing the user because of log off else if (message.charAt(0)=='~') { int ind=message.indexOf("*"); randid=message.substring(1,ind); userid=message.substring(ind+2,message.length()); Hashtable uservec = (Hashtable)usernames.get(randid); System.out.println("usernames: " + usernames); System.out.println("Before remove: " + uservec); messageRepository.remove(userid); if(uservec != null){ uservec.remove(userid); System.out.println("After remove: " + uservec); //Since this user has logged off, his //messages should be removed from the repository if (uservec.isEmpty()) { usernames.remove(randid); } else{ addMessageToRepository(message); } } } //This message is for rejection of invitation else if (message.charAt(0)=='|') { int ind=message.indexOf("*"); randid=message.substring(1,ind); String invitorName = randid.substring(0, randid.indexOf("&")); userid=message.substring(ind+1,message.length()); System.out.println("Inside reject button "+randid+userid); connectToDB(); addMessageToRepositoryForUser(message, invitorName); } //This message is for user busy else if (message.charAt(0)=='@') { randid=message.substring(1,message.indexOf("*")); addMessageToRepositoryForUser(message, randid); } //put the message into repository response.setStatus(response.SC_NO_CONTENT); } } catch(Exception ex){ ex.printStackTrace(); } //..........end of post............ } } //This method will add this message to the repository //It adds this message for each user private void addMessageToRepository(String p_message){ Hashtable uservec = (Hashtable)usernames.get(randid); if(uservec != null){ Enumeration e = uservec.keys(); System.out.println("adding message " + p_message + " for users " + uservec); while(e.hasMoreElements()){ messageRepository.add((String)e.nextElement(), message); } } } private void addMessageToRepositoryForUser(String p_message, String user){ messageRepository.add(user, message); } //This method is required to set the warning level //in case of rejection public void connectToDB() { try { String invitorName = randid.substring(0, randid.indexOf("&")); String getrecord="select warning_level from t_chat_user_buddy where user_id='" + invitorName + "' and buddy_id='"+userid+"'"; rs=st.executeQuery(getrecord); System.out.println("after result set"); if (rs.next()) { int warnlevel=rs.getInt(1)+10; if (warnlevel>=100) { String newtab="insert into t_block_users (user_id, buddy_id) values('" + invitorName + "','"+userid+"')"; String delrow="delete from t_chat_user_buddy where user_id='" + invitorName + "' and buddy_id='"+userid+"'"; int blackup=st.executeUpdate(newtab); int buddyup=st.executeUpdate(delrow); } String updaterecord="update t_chat_user_buddy set warning_level=" + warnlevel + " where user_id='" + invitorName + "' and buddy_id='"+userid+"'"; int en=st.executeUpdate(updaterecord); } else { String addrecord="insert into t_chat_user_buddy (user_id, buddy_id, warning_level) values('" + invitorName + "','"+userid+"',"+"'10')"; int en=st.executeUpdate(addrecord); } st.close(); rs.close(); } catch(Exception e) { System.out.println(e.getMessage()); } } //Servlet destroy method public void destroy(){ try{ messageRepository = null; connect.close(); connect = null; st = null; rs = null; //Thread to clean the messageRepository repCleaner.stopThread(); } catch(Exception ex){ ex.printStackTrace(); } } //Get Servlet information public String getServletInfo() { return "MDMChatServlet Information"; } private Properties getProperties(){ boolean found = true; Properties props=null; ObjectInputStream oin=null; FileInputStream in=null; try{ in=new FileInputStream("DBProperties.props"); } catch(FileNotFoundException ex){ System.out.println("File not found "+ ex.getMessage()); try{ in.close(); } catch(Exception subEx){ subEx.printStackTrace(); } found = false; } catch(SecurityException ex){System.out.println("Security exception-I "+ex.getMessage());} if(found){ try{ oin=new ObjectInputStream(in); } catch(StreamCorruptedException ex){ System.out.println("StreamCorruptedException-I "+ex.getMessage()); } catch(IOException ex){ System.out.println("IOException-I "+ex.getMessage()); } try{ props=(Properties)oin.readObject(); } catch(ClassNotFoundException ex){ System.out.println("ClassNotFoundException "+ex.getMessage()); } catch(InvalidClassException ex){ System.out.println("InvalidClassException "+ex.getMessage()); } catch(StreamCorruptedException ex){ System.out.println("StreamCorruptedException-II "+ex.getMessage()); } catch(OptionalDataException ex){ System.out.println("OPtionalDataException "+ex.getMessage()); } catch(IOException ex){ System.out.println("IOException-II "+ex.getMessage()); } } try{ oin.close(); } catch(Exception ex){ ex.printStackTrace(); } return props; } class RepositoryCleanerThread extends Thread{ private boolean isStopPending = false; RepositoryCleanerThread(){ super(); } public void stopThread(){ isStopPending = true; } public void run(){ while (!isStopPending){ //Go through all the users in order to confirm that //all users have been continuously accessing their //messages. In case this is not happening perform: //1. remove messages from repository //2. add remove message for the other users with this randid //3. remove user from usernames Enumeration randids = usernames.keys(); while(randids.hasMoreElements()){ String tempRandid = (String)randids.nextElement(); Hashtable uservec = (Hashtable)usernames.get(tempRandid); if(uservec == null){ usernames.remove(tempRandid); } else{ Enumeration chatRoomUsers = uservec.keys(); while(chatRoomUsers.hasMoreElements()){ String chatRoomUser = (String)chatRoomUsers.nextElement(); Long lastTimeAccessed = (Long)uservec.get(chatRoomUser); if((System.currentTimeMillis() - lastTimeAccessed.longValue()) > 100000){ System.out.println("Removing user: " + chatRoomUser + " from chat session."); uservec.remove(chatRoomUser); messageRepository.remove(chatRoomUser); } } } } try{ sleep(20000); } catch(Exception ex){ ex.printStackTrace(); } } } private void sendRemoveUserMessage(String randid){ } } }