package com.idega.block.messenger.business; import java.sql.SQLException; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import com.idega.block.messenger.data.Packet; import com.idega.block.messenger.data.Property; import com.idega.core.user.data.User; /** * Title: com.idega.block.messenger.business * Description: idega classes * Copyright: Copyright (c) 2001 * Company: Idega Software * @author <a href="mailto:eiki@idega.is">Eirikur S. Hrafnsson</a> * @version 1.0 */ public class ClientManager implements PacketManager{ private static Hashtable clients = new Hashtable(); private static Hashtable reverseClients = new Hashtable();//for double loggin check private static String SESSION_ID = "session_id"; private static String USER_ID = "user_id"; private static String USER_LIST = "user_list"; private static String USER_LIST_VERSION = "user_list_version"; private static String LOG_OUT = "log_out"; private static String PREFIX = "v."; private int version = 0; public void clientCheckIn(String sessionId, String userId){ try{ User user = ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).findByPrimaryKeyLegacy(Integer.parseInt(userId)); ClientManager.clients.put(sessionId,user); removeDoubleRegistry(sessionId,userId); ClientManager.reverseClients.put(userId,sessionId); this.version++; } catch(SQLException e){ e.printStackTrace(System.err); System.err.println("ClientManager : ((com.idega.core.user.data.UserHome)com.idega.data.IDOLookup.getHomeLegacy(User.class)).createLegacy() failed!"); } } public void clientCheckOut(String sessionId){//debug here is the place if you want to store offline messages System.out.println("ClientManager:LOGGIN OFF USER : "+ClientManager.getClientName(sessionId)+" sessionid "+sessionId); try{ User user = (User) ClientManager.clients.get(sessionId); ClientManager.reverseClients.remove(Integer.toString(user.getID())); ClientManager.clients.remove(sessionId); user = null; } catch(Exception e){ e.printStackTrace(); } this.version++; } public synchronized static String getClientName(String sessionId){ User user = (User) ClientManager.clients.get(sessionId); if( user!=null ){ return user.getName(); } else { return null; } } public synchronized void processPacket(Packet packet){ // System.out.println("ClientManager : process packet"); String sessionId = null; String userId = null; String packetUserListVersion = null; if( packet!=null ){ Vector props = packet.getProperties(); if( props!=null ){ int length = props.size(); //System.out.println("ClientManager : PropSize is: "+length); for (int i = 0; i < length; i++) { Property prop = (Property) props.elementAt(i); String key = prop.getKey(); if( key.equalsIgnoreCase(SESSION_ID) ){ sessionId = (String) prop.getValue(); //System.out.println("ClientManager: session id "+sessionId); } else if( key.equalsIgnoreCase(USER_ID) ){ userId = (String) prop.getValue(); //System.out.println("ClientManager: user id "+userId); } else if( key.equalsIgnoreCase(USER_LIST_VERSION) ){ packetUserListVersion = (String) prop.getValue(); //System.out.println("ClientManager: user list version "+packetUserListVersion); } else if( key.equalsIgnoreCase(LOG_OUT) ){ clientCheckOut((String) prop.getValue()); } } } if( sessionId!=null ){ User user = (User) ClientManager.clients.get(sessionId);//already logged on if( user == null ){ clientCheckIn(sessionId,userId);//register this client and check that he's not double logged on } } //userlist stuff if( !getUserListVersion().equalsIgnoreCase(packetUserListVersion) ){ //list changed update it..without self /**@todo make a removeProperty method in packet*/ packet.clearProperties(); packet.addProperty(new Property(USER_LIST, getConnectedClients(sessionId))); packet.addProperty(new Property(USER_LIST_VERSION, getUserListVersion()) ); } //System.out.println("ClientManager : Property key: "+key+" ; value: "+value); //System.out.println("ClientManager : After clients.get(key)"); } // else System.out.println("ClientManager : client sending. no packet"); } public String getUserListVersion(){ return (PREFIX+this.version); } public static Vector getConnectedClients(String sessionId){ /**@todo: don't make a new instance everytime*/ Vector connClients=new Vector(); Enumeration enumer = ClientManager.clients.keys(); while (enumer.hasMoreElements()){ String id = (String)enumer.nextElement(); connClients.add( new Property(id,((User)ClientManager.clients.get(id)).getName()) ); } return connClients; } private boolean removeDoubleRegistry(String sessionId, String userId){ //System.out.println("ClientManager: removeDoubleRegistry new sessionId : "+sessionId); boolean existed = false; String fromId = (String) ClientManager.reverseClients.get(userId); if( fromId!=null){ //System.out.println("ClientManager: removeDoubleRegistry old sessionId : "+fromId); MessageManager.moveMessages(fromId,sessionId); ClientManager.clients.remove(fromId); ClientManager.reverseClients.remove(userId);//old reference existed = true; } return existed; } }