Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/IChatUserDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/IChatUserDAO.java,v diff -u -r1.11 -r1.12 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/IChatUserDAO.java 24 Oct 2012 11:27:01 -0000 1.11 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/IChatUserDAO.java 25 Oct 2012 10:21:03 -0000 1.12 @@ -24,44 +24,49 @@ package org.lamsfoundation.lams.tool.chat.dao; +import java.util.Date; +import java.util.List; + import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.tool.chat.model.ChatUser; /** - * DAO for accessing the ChatUser objects - interface defining - * methods to be implemented by the Hibernate or other implementation. + * DAO for accessing the ChatUser objects - interface defining methods to be implemented by the Hibernate or other + * implementation. */ -public interface IChatUserDAO extends IBaseDAO{ - /** - * - * @param userId - * @param toolSessionId - * @return - */ - ChatUser getByUserIdAndSessionId(Long userId, Long toolSessionId); +public interface IChatUserDAO extends IBaseDAO { + /** + * + * @param userId + * @param toolSessionId + * @return + */ + ChatUser getByUserIdAndSessionId(Long userId, Long toolSessionId); - void saveOrUpdate(ChatUser chatUser); + void saveOrUpdate(ChatUser chatUser); - /** - * - * @param loginName - * @param sessionID - * @return - */ - ChatUser getByLoginNameAndSessionId(String loginName, Long toolSessionId); + /** + * + * @param loginName + * @param sessionID + * @return + */ + ChatUser getByLoginNameAndSessionId(String loginName, Long toolSessionId); - /** - * - * @param uid - * @return - */ - ChatUser getByUID(Long uid); + /** + * + * @param uid + * @return + */ + ChatUser getByUID(Long uid); - /** - * - * @param nickname - * @param chatSession - * @return - */ - ChatUser getByNicknameAndSessionID(String nickname, Long sessionID); + /** + * + * @param nickname + * @param chatSession + * @return + */ + ChatUser getByNicknameAndSessionID(String nickname, Long toolSessionID); + + List getBySessionIdAndLastPresence(Long toolSessionID, Date oldestLastPresence); } \ No newline at end of file Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/hibernate/ChatUserDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/hibernate/ChatUserDAO.java,v diff -u -r1.12 -r1.13 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/hibernate/ChatUserDAO.java 24 Oct 2012 11:27:01 -0000 1.12 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dao/hibernate/ChatUserDAO.java 25 Oct 2012 10:21:03 -0000 1.13 @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.tool.chat.dao.hibernate; +import java.util.Date; import java.util.List; import org.lamsfoundation.lams.dao.hibernate.BaseDAO; @@ -35,68 +36,70 @@ */ public class ChatUserDAO extends BaseDAO implements IChatUserDAO { - public static final String SQL_QUERY_FIND_BY_USER_ID_SESSION_ID = "from " - + ChatUser.class.getName() + " as f" - + " where user_id=? and f.chatSession.sessionId=?"; + public static final String SQL_QUERY_FIND_BY_USER_ID_SESSION_ID = "from " + ChatUser.class.getName() + " as f" + + " where user_id=? and f.chatSession.sessionId=?"; - public static final String SQL_QUERY_FIND_BY_LOGIN_NAME_SESSION_ID = "from " - + ChatUser.class.getName() - + " as f where login_name=? and f.chatSession.sessionId=?"; + public static final String SQL_QUERY_FIND_BY_LOGIN_NAME_SESSION_ID = "from " + ChatUser.class.getName() + + " as f where login_name=? and f.chatSession.sessionId=?"; - private static final String SQL_QUERY_FIND_BY_UID = "from " - + ChatUser.class.getName() + " where uid=?"; + private static final String SQL_QUERY_FIND_BY_UID = "from " + ChatUser.class.getName() + " where uid=?"; - private static final String SQL_QUERY_FIND_BY_NICKNAME_AND_SESSION = "from " - + ChatUser.class.getName() - + " as f where nickname=? and f.chatSession.sessionId=?"; + private static final String SQL_QUERY_FIND_BY_NICKNAME_AND_SESSION = "from " + ChatUser.class.getName() + + " as f where nickname=? and f.chatSession.sessionId=?"; - public ChatUser getByUserIdAndSessionId(Long userId, Long toolSessionId) { - List list = this.getHibernateTemplate().find( - SQL_QUERY_FIND_BY_USER_ID_SESSION_ID, - new Object[] { userId, toolSessionId }); + public static final String SQL_QUERY_FIND_BY_SESSION_ID_AND_TIME = "from " + ChatUser.class.getName() + " as f" + + " where f.chatSession.sessionId=? and f.lastPresence > ?"; - if (list == null || list.isEmpty()) - return null; + public ChatUser getByUserIdAndSessionId(Long userId, Long toolSessionId) { + List list = this.getHibernateTemplate().find(SQL_QUERY_FIND_BY_USER_ID_SESSION_ID, + new Object[] { userId, toolSessionId }); - return (ChatUser) list.get(0); - } + if (list == null || list.isEmpty()) + return null; - public ChatUser getByLoginNameAndSessionId(String loginName, - Long toolSessionId) { + return (ChatUser) list.get(0); + } - List list = this.getHibernateTemplate().find( - SQL_QUERY_FIND_BY_LOGIN_NAME_SESSION_ID, - new Object[] { loginName, toolSessionId }); + public ChatUser getByLoginNameAndSessionId(String loginName, Long toolSessionId) { - if (list == null || list.isEmpty()) - return null; + List list = this.getHibernateTemplate().find(SQL_QUERY_FIND_BY_LOGIN_NAME_SESSION_ID, + new Object[] { loginName, toolSessionId }); - return (ChatUser) list.get(0); + if (list == null || list.isEmpty()) + return null; - } + return (ChatUser) list.get(0); - public void saveOrUpdate(ChatUser chatUser) { - this.getHibernateTemplate().saveOrUpdate(chatUser); - this.getHibernateTemplate().flush(); - } + } - public ChatUser getByUID(Long uid) { - List list = this.getHibernateTemplate().find(SQL_QUERY_FIND_BY_UID, - new Object[] { uid }); + public void saveOrUpdate(ChatUser chatUser) { + this.getHibernateTemplate().saveOrUpdate(chatUser); + this.getHibernateTemplate().flush(); + } - if (list == null || list.isEmpty()) - return null; + public ChatUser getByUID(Long uid) { + List list = this.getHibernateTemplate().find(SQL_QUERY_FIND_BY_UID, new Object[] { uid }); - return (ChatUser) list.get(0); - } + if (list == null || list.isEmpty()) + return null; - public ChatUser getByNicknameAndSessionID(String nickname, Long sessionID) { - List list = this.getHibernateTemplate().find(SQL_QUERY_FIND_BY_NICKNAME_AND_SESSION, - new Object[] { nickname, sessionID }); + return (ChatUser) list.get(0); + } - if (list == null || list.isEmpty()) - return null; + public ChatUser getByNicknameAndSessionID(String nickname, Long sessionID) { + List list = this.getHibernateTemplate().find(SQL_QUERY_FIND_BY_NICKNAME_AND_SESSION, + new Object[] { nickname, sessionID }); - return (ChatUser) list.get(0); - } + if (list == null || list.isEmpty()) + return null; + + return (ChatUser) list.get(0); + } + + @SuppressWarnings("unchecked") + public List getBySessionIdAndLastPresence(Long toolSessionID, Date oldestLastPresence) { + return this.getHibernateTemplate().find(SQL_QUERY_FIND_BY_SESSION_ID_AND_TIME, + new Object[] { toolSessionID, oldestLastPresence }); + + } } Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dbupdates/patch20121024.sql =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/dbupdates/patch20121024.sql,v diff -u -r1.1 -r1.2 Binary files differ Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/model/ChatUser.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/model/ChatUser.java,v diff -u -r1.10 -r1.11 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/model/ChatUser.java 24 Oct 2012 11:27:01 -0000 1.10 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/model/ChatUser.java 25 Oct 2012 10:21:03 -0000 1.11 @@ -24,193 +24,203 @@ package org.lamsfoundation.lams.tool.chat.model; +import java.util.Date; + import org.lamsfoundation.lams.usermanagement.dto.UserDTO; /** * - * Caches the user details. This allows the tool to be more efficient at - * displaying user names but means that when people's names change, they won't - * change in the "old" tool data. + * Caches the user details. This allows the tool to be more efficient at displaying user names but means that when + * people's names change, they won't change in the "old" tool data. * * @hibernate.class table="tl_lachat11_user" */ public class ChatUser implements java.io.Serializable { - /** + /** * */ - private static final long serialVersionUID = -3701664859818409197L; + private static final long serialVersionUID = -3701664859818409197L; - // Fields - private Long uid; + // Fields + private Long uid; - private Long userId; + private Long userId; - private String lastName; + private String lastName; - private String firstName; + private String firstName; - private String loginName; + private String loginName; - private ChatSession chatSession; + private ChatSession chatSession; - private boolean finishedActivity; - - private String nickname; + private boolean finishedActivity; - // Constructors + private String nickname; - /** default constructor */ - public ChatUser() { - } + private Date lastPresence; - public ChatUser(UserDTO user, ChatSession chatSession) { - this.userId = new Long(user.getUserID().intValue()); - this.firstName = user.getFirstName(); - this.lastName = user.getLastName(); - this.loginName = user.getLogin(); - this.chatSession = chatSession; - this.finishedActivity = false; - } + // Constructors + /** default constructor */ + public ChatUser() { + } - /** full constructor */ - public ChatUser(Long userId, String lastName, String firstName, - ChatSession chatSession) { - this.userId = userId; - this.lastName = lastName; - this.firstName = firstName; - this.chatSession = chatSession; - } + public ChatUser(UserDTO user, ChatSession chatSession) { + this.userId = new Long(user.getUserID().intValue()); + this.firstName = user.getFirstName(); + this.lastName = user.getLastName(); + this.loginName = user.getLogin(); + this.chatSession = chatSession; + this.finishedActivity = false; + } - // Property accessors - /** - * @hibernate.id generator-class="native" type="java.lang.Long" column="uid" - */ - public Long getUid() { - return this.uid; - } + /** full constructor */ + public ChatUser(Long userId, String lastName, String firstName, ChatSession chatSession) { + this.userId = userId; + this.lastName = lastName; + this.firstName = firstName; + this.chatSession = chatSession; + } - public void setUid(Long uid) { - this.uid = uid; - } + // Property accessors + /** + * @hibernate.id generator-class="native" type="java.lang.Long" column="uid" + */ + public Long getUid() { + return this.uid; + } - /** - * @hibernate.property column="user_id" length="20" - * - */ - public Long getUserId() { - return this.userId; - } + public void setUid(Long uid) { + this.uid = uid; + } - public void setUserId(Long userId) { - this.userId = userId; - } - /** - * @hibernate.property column="last_name" length="255" - * - */ - public String getLastName() { - return this.lastName; - } + /** + * @hibernate.property column="user_id" length="20" + * + */ + public Long getUserId() { + return this.userId; + } - public void setLastName(String lastName) { - this.lastName = lastName; - } - - /** - * @hibernate.property column="login_name" length="255" - * - */ - public String getLoginName() { - return loginName; - } + public void setUserId(Long userId) { + this.userId = userId; + } - public void setLoginName(String loginName) { - this.loginName = loginName; - } + /** + * @hibernate.property column="last_name" length="255" + * + */ + public String getLastName() { + return this.lastName; + } - /** - * @hibernate.property column="first_name" length="255" - * - */ - public String getFirstName() { - return this.firstName; - } + public void setLastName(String lastName) { + this.lastName = lastName; + } - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - /** - * @hibernate.property column="finishedActivity" - */ - public boolean isFinishedActivity() { - return finishedActivity; - } + /** + * @hibernate.property column="login_name" length="255" + * + */ + public String getLoginName() { + return loginName; + } - public void setFinishedActivity(boolean finishedActivity) { - this.finishedActivity = finishedActivity; - } - - /** - * @hibernate.property column="nickname" - */ - public String getNickname() { - return nickname; - } + public void setLoginName(String loginName) { + this.loginName = loginName; + } - public void setNickname(String nickname) { - this.nickname = nickname; - } - - /** - * @hibernate.many-to-one not-null="true" - * @hibernate.column name="chat_session_uid" - * - */ - public ChatSession getChatSession() { - return this.chatSession; - } + /** + * @hibernate.property column="first_name" length="255" + * + */ + public String getFirstName() { + return this.firstName; + } - public void setChatSession(ChatSession chatSession) { - this.chatSession = chatSession; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } - /** - * toString - * - * @return String - */ - public String toString() { - StringBuffer buffer = new StringBuffer(); + /** + * @hibernate.property column="finishedActivity" + */ + public boolean isFinishedActivity() { + return finishedActivity; + } - buffer.append(getClass().getName()).append("@").append( - Integer.toHexString(hashCode())).append(" ["); - buffer.append("userId").append("='").append(getUserId()).append("' "); - buffer.append("]"); + public void setFinishedActivity(boolean finishedActivity) { + this.finishedActivity = finishedActivity; + } - return buffer.toString(); - } + /** + * @hibernate.property column="nickname" + */ + public String getNickname() { + return nickname; + } - public boolean equals(Object other) { - if ((this == other)) - return true; - if ((other == null)) - return false; - if (!(other instanceof ChatUser)) - return false; - ChatUser castOther = (ChatUser) other; + public void setNickname(String nickname) { + this.nickname = nickname; + } - return ((this.getUid() == castOther.getUid()) || (this.getUid() != null - && castOther.getUid() != null && this.getUid().equals( - castOther.getUid()))); - } + /** + * @hibernate.many-to-one not-null="true" + * @hibernate.column name="chat_session_uid" + * + */ + public ChatSession getChatSession() { + return this.chatSession; + } - public int hashCode() { - int result = 17; - result = 37 * result - + (getUid() == null ? 0 : this.getUid().hashCode()); - return result; - } + public void setChatSession(ChatSession chatSession) { + this.chatSession = chatSession; + } + + /** + * @hibernate.property column="last_presence" + */ + public Date getLastPresence() { + return lastPresence; + } + + public void setLastPresence(Date lastPresence) { + this.lastPresence = lastPresence; + } + + /** + * toString + * + * @return String + */ + public String toString() { + StringBuffer buffer = new StringBuffer(); + + buffer.append(getClass().getName()).append("@").append(Integer.toHexString(hashCode())).append(" ["); + buffer.append("userId").append("='").append(getUserId()).append("' "); + buffer.append("]"); + + return buffer.toString(); + } + + public boolean equals(Object other) { + if ((this == other)) + return true; + if ((other == null)) + return false; + if (!(other instanceof ChatUser)) + return false; + ChatUser castOther = (ChatUser) other; + + return ((this.getUid() == castOther.getUid()) || (this.getUid() != null && castOther.getUid() != null && this + .getUid().equals(castOther.getUid()))); + } + + public int hashCode() { + int result = 17; + result = 37 * result + (getUid() == null ? 0 : this.getUid().hashCode()); + return result; + } } \ No newline at end of file Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java,v diff -u -r1.55 -r1.56 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java 24 Oct 2012 11:27:01 -0000 1.55 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java 25 Oct 2012 10:21:03 -0000 1.56 @@ -414,6 +414,11 @@ return chatSession; } + public List getUsersActiveBySessionId(Long toolSessionId) { + Date oldestLastPresence = new Date(System.currentTimeMillis() - ChatConstants.PRESENCE_IDLE_TIMEOUT); + return chatUserDAO.getBySessionIdAndLastPresence(toolSessionId, oldestLastPresence); + } + public ChatUser getUserByUserIdAndSessionId(Long userId, Long toolSessionId) { return chatUserDAO.getByUserIdAndSessionId(userId, toolSessionId); } @@ -430,7 +435,18 @@ return chatUserDAO.getByNicknameAndSessionID(nickname, sessionID); } - public List getMessagesForUser(ChatUser chatUser) { + /* + * Stores information when users with given UIDs were last seen in their Chat session. + */ + public void updateUserPresence(Map presence) { + for (Long userUid : presence.keySet()) { + ChatUser chatUser = chatUserDAO.getByUID(userUid); + chatUser.setLastPresence(presence.get(userUid)); + saveOrUpdateChatUser(chatUser); + } + } + + public List getMessagesForUser(ChatUser chatUser) { return chatMessageDAO.getForUser(chatUser); } Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/IChatService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/IChatService.java,v diff -u -r1.19 -r1.20 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/IChatService.java 24 Oct 2012 11:27:01 -0000 1.19 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/IChatService.java 25 Oct 2012 10:21:03 -0000 1.20 @@ -25,12 +25,12 @@ package org.lamsfoundation.lams.tool.chat.service; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Map; import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.notebook.model.NotebookEntry; -import org.lamsfoundation.lams.tool.chat.dto.ChatMessageDTO; import org.lamsfoundation.lams.tool.chat.model.Chat; import org.lamsfoundation.lams.tool.chat.model.ChatAttachment; import org.lamsfoundation.lams.tool.chat.model.ChatCondition; @@ -40,7 +40,6 @@ import org.lamsfoundation.lams.tool.chat.util.ChatException; import org.lamsfoundation.lams.tool.chat.util.ChatMessageFilter; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; -import org.w3c.dom.Node; /** * Defines the services available to the web layer from the Chat Service @@ -111,6 +110,8 @@ */ public void saveOrUpdateChatSession(ChatSession chatSession); + public List getUsersActiveBySessionId(Long toolSessionId); + /** * * @param userId @@ -142,6 +143,8 @@ */ public ChatUser getUserByNicknameAndSessionID(String nickname, Long sessionID); + public void updateUserPresence(Map presence); + /** * * @param chatUser @@ -153,7 +156,7 @@ * @param chatUser * @return */ - public List getMessagesForUser(ChatUser chatUser); + public List getMessagesForUser(ChatUser chatUser); /** * @@ -177,15 +180,15 @@ public ChatMessageFilter updateMessageFilters(Chat chat); public String filterMessage(String message, Chat chat); - + /** * * @param messageUID * @return */ public ChatMessage getMessageByUID(Long messageUID); - public List getLastestMessages(ChatSession chatSession, int max); + public List getLastestMessages(ChatSession chatSession, int max); public void auditEditMessage(ChatMessage chatMessage, String messageBody); @@ -209,12 +212,12 @@ * Gets all messages sent by the given user. * * @param userUid - * UID of the user + * UID of the user * @return list of his/hers messages */ public List getMessagesSentByUser(Long userUid); void releaseConditionsFromCache(Chat chat); - + boolean isGroupedActivity(long toolContentID); } \ No newline at end of file Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/util/ChatConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/util/ChatConstants.java,v diff -u -r1.16 -r1.17 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/util/ChatConstants.java 24 Oct 2012 11:27:01 -0000 1.16 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/util/ChatConstants.java 25 Oct 2012 10:21:03 -0000 1.17 @@ -40,7 +40,7 @@ public static final int MONITORING_SUMMARY_MAX_MESSAGES = 5; - public static final long PRESENCE_IDLE_TIMEOUT = 20 * 1000; + public static final long PRESENCE_IDLE_TIMEOUT = 15 * 1000; // Attribute names public static final String ATTR_MESSAGE = "message"; Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java,v diff -u -r1.31 -r1.32 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java 24 Oct 2012 11:27:01 -0000 1.31 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java 25 Oct 2012 10:21:03 -0000 1.32 @@ -28,10 +28,10 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TimeZone; import javax.servlet.http.HttpServletRequest; @@ -43,6 +43,7 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.apache.tomcat.util.json.JSONArray; import org.apache.tomcat.util.json.JSONException; import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.notebook.model.NotebookEntry; @@ -81,12 +82,47 @@ */ public class LearningAction extends LamsDispatchAction { + /** + * Keeps information of users present in a Chat session. Needs to work with DB so presence is visible on clustered + * environment. + */ + private class Roster { + private long lastCheckTime = 0; + // users who currently poll messasages + private final Map activeUsers = new HashMap(); + private final Set roster = new HashSet(); + + private synchronized JSONArray getRosterJSON(ChatUser user) { + long currentTime = System.currentTimeMillis(); + activeUsers.put(user.getUid(), new Date(currentTime)); + + if (currentTime - lastCheckTime > ChatConstants.PRESENCE_IDLE_TIMEOUT) { + // store active users + chatService.updateUserPresence(activeUsers); + activeUsers.clear(); + + // read active users from all nodes + List storedActiveUsers = chatService.getUsersActiveBySessionId(user.getChatSession() + .getSessionId()); + roster.clear(); + for (ChatUser activeUser : storedActiveUsers) { + roster.add(activeUser.getNickname()); + } + + lastCheckTime = currentTime; + } else { + roster.add(user.getNickname()); + } + + return new JSONArray(roster); + } + } + private static Logger log = Logger.getLogger(LearningAction.class); private IChatService chatService; - private static final Map> presence = Collections - .synchronizedMap(new HashMap>()); + private static final Map rosters = Collections.synchronizedMap(new HashMap()); @Override public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, @@ -310,7 +346,6 @@ return null; } - @SuppressWarnings("unchecked") private void getMessages(Long lastMessageUid, ChatUser chatUser, JSONObject responseJSON) throws JSONException { List messages = chatService.getMessagesForUser(chatUser); if (!messages.isEmpty()) { @@ -345,28 +380,13 @@ private void getRoster(ChatUser chatUser, JSONObject responseJSON) throws JSONException { Long sessionId = chatUser.getChatSession().getSessionId(); // this is equivalent of a chat room - Map sessionRoster = LearningAction.presence.get(sessionId); + Roster sessionRoster = LearningAction.rosters.get(sessionId); if (sessionRoster == null) { - sessionRoster = Collections.synchronizedMap(new LinkedHashMap()); - LearningAction.presence.put(sessionId, sessionRoster); + sessionRoster = new Roster(); + LearningAction.rosters.put(sessionId, sessionRoster); } - // store when the user polled messages the last time - long currentTime = System.currentTimeMillis(); - sessionRoster.put(chatUser.getNickname(), currentTime); - - synchronized (sessionRoster) { - Iterator nickIterator = sessionRoster.keySet().iterator(); - while (nickIterator.hasNext()) { - String nick = nickIterator.next(); - // if user did not poll messages for some time, he left the chat and is unavailable - if (currentTime - sessionRoster.get(nick) < ChatConstants.PRESENCE_IDLE_TIMEOUT) { - responseJSON.append("roster", nick); - } else { - nickIterator.remove(); - } - } - } + responseJSON.put("roster", sessionRoster.getRosterJSON(chatUser)); } private ChatUser getCurrentUser(Long toolSessionId) {