You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2016/10/05 16:44:41 UTC

svn commit: r1763466 - in /openmeetings/application: branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ branches/3.1.x/openmeetings-...

Author: solomax
Date: Wed Oct  5 16:44:41 2016
New Revision: 1763466

URL: http://svn.apache.org/viewvc?rev=1763466&view=rev
Log:
[OPENMEETINGS-1482] client objects are being removed on logout

Modified:
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
    openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java Wed Oct  5 16:44:41 2016
@@ -29,7 +29,6 @@ import java.util.List;
 
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.user.IUserService;
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.admin.AdminPanel;
@@ -152,7 +151,7 @@ public class ConnectionsPanel extends Ad
 			protected void populateItem(final Item<org.apache.openmeetings.web.app.Client> item) {
 				org.apache.openmeetings.web.app.Client c = item.getModelObject();
 				item.add(new Label("id", ""));
-				User u = getBean(UserDao.class).get(c.getUserId());
+				User u = c.getUser();
 				item.add(new Label("login", u == null ? null : u.getLogin()));
 				item.add(new Label("since", c.getConnectedSince()));
 				item.add(new Label("scope", "html5"));

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Wed Oct  5 16:44:41 2016
@@ -35,12 +35,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.commons.collections4.MapIterator;
-import org.apache.commons.collections4.keyvalue.MultiKey;
-import org.apache.commons.collections4.map.MultiKeyMap;
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.remote.MainService;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
@@ -102,9 +98,9 @@ import org.wicketstuff.dashboard.web.Das
 public class Application extends AuthenticatedWebApplication implements IApplication {
 	private static final Logger log = getLogger(Application.class, webAppRootKey);
 	private static boolean isInstalled;
-	private static MultiKeyMap<String, org.apache.openmeetings.web.app.Client> ONLINE_USERS = new MultiKeyMap<>(); 
-	private static Map<String, org.apache.openmeetings.web.app.Client> INVALID_SESSIONS = new ConcurrentHashMap<String, org.apache.openmeetings.web.app.Client>();
-	private static Map<Long, Set<Client>> ROOMS = new ConcurrentHashMap<Long, Set<Client>>();
+	private static ConcurrentHashMap<String, Client> ONLINE_USERS = new ConcurrentHashMap<>(); 
+	private static ConcurrentHashMap<String, Client> INVALID_SESSIONS = new ConcurrentHashMap<>();
+	private static ConcurrentHashMap<Long, Set<String>> ROOMS = new ConcurrentHashMap<>();
 	//additional maps for faster searching should be created
 	private DashboardContext dashboardContext;
 	private static Set<String> STRINGS_WITH_APP = new HashSet<>(); //FIXME need to be removed
@@ -211,30 +207,26 @@ public class Application extends Authent
 		return get().dashboardContext;
 	}
 	
-	public synchronized static void addOnlineUser(org.apache.openmeetings.web.app.Client client) {
-		try {
-			ONLINE_USERS.put("" + client.getUserId(), client.getSessionId(), client);
-		} catch (Exception err) {
-			log.error("[addOnlineUser]", err);
-		}
+	public static void addOnlineUser(Client c) {
+		log.debug("Adding online client: {}, room: {}", c.getUid(), c.getRoomId());
+		ONLINE_USERS.put(c.getUid(), c);
 	}
 	
-	public synchronized static void removeOnlineUser(org.apache.openmeetings.web.app.Client c) {
-		try {
-			if (c != null) {
-				ONLINE_USERS.removeAll("" + c.getUserId(), c.getSessionId());
-			}
-		} catch (Exception err) {
-			log.error("[removeOnlineUser]", err);
+	public static void removeOnlineUser(Client c) {
+		if (c != null) {
+			log.debug("Removing online client: {}, room: {}", c.getUid(), c.getRoomId());
+			ONLINE_USERS.remove(c.getUid());
 		}
 	}
 	
+	public static Client getOnlineClient(String uid) {
+		return uid == null ? null : ONLINE_USERS.get(uid);
+	}
+	
 	public static boolean isUserOnline(Long userId) {
-		MapIterator<MultiKey<? extends String>, org.apache.openmeetings.web.app.Client> it = ONLINE_USERS.mapIterator();
 		boolean isUserOnline = false;
-		while (it.hasNext()) {
-			MultiKey<? extends String> multi = it.next();
-			if (multi.size() > 0 && userId.equals(multi.getKey(0))) {
+		for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) {
+			if (e.getValue().getUserId().equals(userId)) {
 				isUserOnline = true;
 				break;
 			}
@@ -242,17 +234,15 @@ public class Application extends Authent
 		return isUserOnline;
 	}
 
-	public static List<org.apache.openmeetings.web.app.Client> getClients() {
-		return new ArrayList<org.apache.openmeetings.web.app.Client>(ONLINE_USERS.values());
+	public static List<Client> getClients() {
+		return new ArrayList<Client>(ONLINE_USERS.values());
 	}
 
-	public static List<org.apache.openmeetings.web.app.Client> getClients(Long userId) {
-		List<org.apache.openmeetings.web.app.Client> result =  new ArrayList<org.apache.openmeetings.web.app.Client>();
-		MapIterator<MultiKey<? extends String>, org.apache.openmeetings.web.app.Client> it = ONLINE_USERS.mapIterator();
-		while (it.hasNext()) {
-			MultiKey<? extends String> multi = it.next();
-			if (multi.size() > 1 && userId.equals(multi.getKey(0))) {
-				result.add(getClientByKeys(userId, (String)(multi.getKey(1))));
+	public static List<Client> getClients(Long userId) {
+		List<Client> result =  new ArrayList<>();
+		for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) {
+			if (e.getValue().getUserId().equals(userId)) {
+				result.add(e.getValue());
 				break;
 			}
 		}
@@ -263,13 +253,21 @@ public class Application extends Authent
 		return ONLINE_USERS.size();
 	}
 	
-	public static org.apache.openmeetings.web.app.Client getClientByKeys(Long userId, String sessionId) {
-		return (org.apache.openmeetings.web.app.Client) ONLINE_USERS.get(userId, sessionId);
+	public static Client getClientByKeys(Long userId, String sessionId) {
+		Client client = null;
+		for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) {
+			Client c = e.getValue();
+			if (c.getUserId().equals(userId) && c.getSessionId().equals(sessionId)) {
+				client = c;
+				break;
+			}
+		} 
+		return client;
 	}
 	
 	@Override
 	public void invalidateClient(Long userId, String sessionId) {
-		org.apache.openmeetings.web.app.Client client = getClientByKeys(userId, sessionId);
+		Client client = getClientByKeys(userId, sessionId);
 		if (client != null) {
 			if (!INVALID_SESSIONS.containsKey(client.getSessionId())) {
 				INVALID_SESSIONS.put(client.getSessionId(), client);
@@ -283,60 +281,52 @@ public class Application extends Authent
 	}
 	
 	public static void removeInvalidSession(String sessionId) {
-		if (INVALID_SESSIONS.containsKey(sessionId)){
+		if (sessionId != null){
 			INVALID_SESSIONS.remove(sessionId);
 		}
 	}
 	
-	public static Client addUserToRoom(long roomId, int pageId) {
-		if (!ROOMS.containsKey(roomId)) {
-			ROOMS.put(roomId, new ConcurrentHashSet<Client>());
-		}
-		Client c = new Client(WebSession.get().getId(), pageId, WebSession.getUserId());
-		c.setUid(UUID.randomUUID().toString());
-		ROOMS.get(roomId).add(c);
+	public static Client addUserToRoom(Client c) {
+		log.debug("Adding online room client: {}, room: {}", c.getUid(), c.getRoomId());
+		ROOMS.putIfAbsent(c.getRoomId(), new ConcurrentHashSet<String>());
+		ROOMS.get(c.getRoomId()).add(c.getUid());
 		return c;
 	}
 	
-	public static void removeUserFromRoom(long roomId, int pageId) {
-		removeUserFromRoom(roomId, new Client(WebSession.get().getId(), pageId, WebSession.getUserId()));
-	}
-	
-	public static Client removeUserFromRoom(long roomId, Client _c) {
-		if (ROOMS.containsKey(roomId)) {
-			Set<Client> clients = ROOMS.get(roomId);
-			for (Client c : clients) {
-				if (c.equals(_c)) {
-					clients.remove(c);
-					return c;
-				}
-			}
-			if (clients.isEmpty()) {
-				ROOMS.remove(roomId);
+	public static Client removeUserFromRoom(Client c) {
+		log.debug("Removing online room client: {}, room: {}", c.getUid(), c.getRoomId());
+		if (c.getRoomId() != null) {
+			Set<String> clients = ROOMS.get(c.getRoomId());
+			if (clients != null) {
+				clients.remove(c.getUid());
+				c.setRoomId(null);
 			}
 		}
-		return _c;
+		return c;
 	}
 	
-	public static long getRoom(Client c) {
-		for (Entry<Long, Set<Client>> me : ROOMS.entrySet()) {
-			Set<Client> clients = me.getValue();
-			if (clients.contains(c)) {
-				return me.getKey();
+	public static List<Client> getRoomClients(Long roomId) {
+		List<Client> clients = new ArrayList<>();
+		if (roomId != null) {
+			Set<String> uids = ROOMS.get(roomId);
+			if (uids != null) {
+				for (String uid : uids) {
+					Client c = getOnlineClient(uid);
+					if (c != null) {
+						clients.add(c);
+					}
+				}
 			}
 		}
-		return -1;
-	}
-	
-	public static Set<Client> getRoomUsers(long roomId) {
-		return ROOMS.containsKey(roomId) ? ROOMS.get(roomId) : new HashSet<Client>();
+		return clients;
 	}
 	
-	public static Set<Long> getUserRooms(long userId) {
-		Set<Long> result = new HashSet<Long>();
-		for (Entry<Long, Set<Client>> me : ROOMS.entrySet()) {
-			for (Client c : me.getValue()) {
-				if (c.getUserId() == userId) {
+	public static Set<Long> getUserRooms(Long userId) {
+		Set<Long> result = new HashSet<>();
+		for (Entry<Long, Set<String>> me : ROOMS.entrySet()) {
+			for (String uid : me.getValue()) {
+				Client c = getOnlineClient(uid);
+				if (c != null && c.getUserId().equals(userId)) {
 					result.add(me.getKey());
 				}
 			}
@@ -345,10 +335,10 @@ public class Application extends Authent
 	}
 	
 	public static boolean isUserInRoom(long roomId, long userId) {
-		if (ROOMS.containsKey(roomId)) {
-			Set<Client> clients = ROOMS.get(roomId);
-			for (Client c : clients) {
-				if (c.getUserId() == userId) {
+		Set<String> clients = ROOMS.get(roomId);
+		if (clients != null) {
+			for (String uid : clients) {
+				if (getOnlineClient(uid).getUserId().equals(userId)) {
 					return true;
 				}
 			}

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Wed Oct  5 16:44:41 2016
@@ -18,11 +18,17 @@
  */
 package org.apache.openmeetings.web.app;
 
+import static org.apache.openmeetings.web.app.Application.getBean;
+
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.UUID;
 
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
+import org.apache.openmeetings.db.entity.room.Room.Right;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.wicket.protocol.ws.api.registry.IKey;
 
 /**
@@ -33,116 +39,121 @@ import org.apache.wicket.protocol.ws.api
 public class Client implements IDataProviderEntity {
 	private static final long serialVersionUID = 1L;
 
-	public enum Right {
-		moderator
-	}
-	private String sessionId;
+	private final String sessionId;
 	private int pageId;
-	private long userId;
-	private String uid;
-	private Set<Right> rights = new HashSet<Right>();
-	private Date connectedSince;
+	private final User user;
+	private Long roomId;
+	private final String uid;
+	private final Set<Right> rights = new HashSet<>();
+	private final Date connectedSince;
 
-	public Client() {
-		this.connectedSince = new Date();
+	public Client(String sessionId, Long userId) {
+		this(sessionId, 0, userId);
 	}
 	
-	public Client(String sessionId, IKey key, long userId) {
-		this(sessionId, key.hashCode(), userId);
-	}
-	
-	public Client(String sessionId, int pageId, long userId) {
+	public Client(String sessionId, int pageId, Long userId) {
 		this.sessionId = sessionId;
 		this.pageId = pageId;
-		this.userId = userId;
+		this.user = getBean(UserDao.class).get(userId);
 		this.connectedSince = new Date();
+		uid = UUID.randomUUID().toString();
 	}
 
 	public String getSessionId() {
 		return sessionId;
 	}
 
-	public void setSessionId(String sessionId) {
-		this.sessionId = sessionId;
-	}
-
 	public int getPageId() {
 		return pageId;
 	}
 
+	public Client setPageId(IKey key) {
+		this.pageId = key.hashCode();
+		return this;
+	}
+
 	public void setPageId(int pageId) {
 		this.pageId = pageId;
 	}
 
-	public long getUserId() {
-		return userId;
+	public User getUser() {
+		return user;
 	}
 
-	public void setUserId(long userId) {
-		this.userId = userId;
+	public Long getUserId() {
+		return user.getId();
 	}
 
 	public String getUid() {
 		return uid;
 	}
 
-	public void setUid(String uid) {
-		this.uid = uid;
+	public Set<Right> getRights() {
+		return rights;
+	}
+
+	public boolean hasRight(Right right) {
+		if (Right.superModerator == right) {
+			return rights.contains(right);
+		}
+		return rights.contains(Right.superModerator) || rights.contains(Right.moderator) ? true : rights.contains(right);
+	}
+
+	public Date getConnectedSince() {
+		return connectedSince;
+	}
+
+	@Override
+	public Long getId() {
+		return null;
+	}
+
+	@Override
+	public void setId(Long id) {
+	}
+
+	public Long getRoomId() {
+		return roomId;
+	}
+
+	public Client setRoomId(Long roomId) {
+		this.roomId = roomId;
+		return this;
 	}
 
 	@Override
 	public int hashCode() {
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + pageId;
-		result = prime * result + ((sessionId == null) ? 0 : sessionId.hashCode());
-		result = prime * result + (int) (userId ^ (userId >>> 32));
+		result = prime * result + ((uid == null) ? 0 : uid.hashCode());
 		return result;
 	}
 
 	@Override
 	public boolean equals(Object obj) {
-		if (this == obj)
+		if (this == obj) {
 			return true;
-		if (obj == null)
+		}
+		if (obj == null) {
 			return false;
-		if (getClass() != obj.getClass())
+		}
+		if (!(obj instanceof Client)) {
 			return false;
+		}
 		Client other = (Client) obj;
-		if (pageId != other.pageId)
-			return false;
-		if (sessionId == null) {
-			if (other.sessionId != null)
+		if (uid == null) {
+			if (other.uid != null) {
 				return false;
-		} else if (!sessionId.equals(other.sessionId))
-			return false;
-		if (userId != other.userId)
+			}
+		} else if (!uid.equals(other.uid)) {
 			return false;
+		}
 		return true;
 	}
 
-	public Set<Right> getRights() {
-		return rights;
-	}
-
-	public boolean hasRight(Right right) {
-		return rights.contains(Right.moderator) ? true : rights.contains(right);
-	}
-
-	public Date getConnectedSince() {
-		return connectedSince;
-	}
-
-	public void setConnectedSince(Date connectedSince) {
-		this.connectedSince = connectedSince;
-	}
-
 	@Override
-	public Long getId() {
-		return null;
-	}
-
-	@Override
-	public void setId(Long id) {
+	public String toString() {
+		return "Client [uid=" + uid + ", sessionId=" + sessionId + ", pageId=" + pageId + ", userId=" + user.getId() + ", roomId=" + roomId
+				+ ", rights=" + rights + ", connectedSince=" + connectedSince + "]";
 	}
 }

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Wed Oct  5 16:44:41 2016
@@ -114,7 +114,7 @@ public class WebSession extends Abstract
 
 	@Override
 	public void invalidate() {
-		removeOnlineUser(getClientByKeys(getUserId(), get().getId()));
+		removeOnlineUser(getClientByKeys(userId, getId()));
 		super.invalidate();
 		userId = null;
 		rights = Collections.unmodifiableSet(Collections.<Right>emptySet());
@@ -268,7 +268,7 @@ public class WebSession extends Abstract
 		if (_roomId != null) {
 			roomId = _roomId;
 		}
-		if (i != null) {
+		if (_i != null) {
 			i = _i;
 		}
 		userId = u.getId();

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java Wed Oct  5 16:44:41 2016
@@ -21,7 +21,6 @@ package org.apache.openmeetings.web.comm
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.addOnlineUser;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getClientByKeys;
 import static org.apache.openmeetings.web.app.Application.removeOnlineUser;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
@@ -68,6 +67,8 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
+import org.apache.wicket.protocol.ws.api.message.AbortedMessage;
+import org.apache.wicket.protocol.ws.api.message.AbstractClientMessage;
 import org.apache.wicket.protocol.ws.api.message.ClosedMessage;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 import org.red5.logging.Red5LoggerFactory;
@@ -81,7 +82,7 @@ public class MainPanel extends Panel {
 	private static final long serialVersionUID = 1L;
 	private static final Logger log = Red5LoggerFactory.getLogger(MainPanel.class, webAppRootKey);
 	public final static String PARAM_USER_ID = "userId";
-	private Client client;
+	private Client client = null;
 	private final MenuPanel menu;
 	private final WebMarkupContainer topControls = new WebMarkupContainer("topControls");
 	private final WebMarkupContainer topLinks = new WebMarkupContainer("topLinks");
@@ -96,7 +97,6 @@ public class MainPanel extends Panel {
 
 	public MainPanel(String id, WebMarkupContainer panel) {
 		super(id);
-		client = new Client();
 		add(topControls.setOutputMarkupPlaceholderTag(true).setMarkupId("topControls"));
 		menu = new MenuPanel("menu", getMainMenu());
 		contents = new WebMarkupContainer("contents");
@@ -200,18 +200,29 @@ public class MainPanel extends Panel {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void onConnect(ConnectedMessage message) {
-				super.onConnect(message);
-				addOnlineUser(new Client(message.getSessionId(), message.getKey(), getUserId()));
-				log.debug(String.format("WebSocketBehavior::onConnect [session: %s, key: %s]", message.getSessionId(), message.getKey()));
+			protected void onConnect(ConnectedMessage msg) {
+				super.onConnect(msg);
+				client = new Client(getSession().getId(), msg.getKey().hashCode(), getUserId());
+				addOnlineUser(client);
+				log.debug("WebSocketBehavior::onConnect [uid: {}, session: {}, key: {}]", client.getUid(), msg.getSessionId(), msg.getKey());
+			}
+
+			@Override
+			protected void onAbort(AbortedMessage msg) {
+				super.onAbort(msg);
+				closeHandler(msg);
 			}
 			
 			@Override
-			protected void onClose(ClosedMessage message) {
-				Client client = getClientByKeys(getUserId(), WebSession.get().getId());
+			protected void onClose(ClosedMessage msg) {
+				super.onClose(msg);
+				closeHandler(msg);
+			}
+
+			private void closeHandler(AbstractClientMessage msg) {
+				log.debug("WebSocketBehavior::closeHandler [uid: {}, session: {}, key: {}]", client.getUid(), msg.getSessionId(), msg.getKey());
 				removeOnlineUser(client);
-				super.onClose(message);
-				log.debug("WebSocketBehavior::onClose");
+				client = null;
 			}
 		});
 	}
@@ -228,7 +239,7 @@ public class MainPanel extends Panel {
 					public void onClick(AjaxRequestTarget target) {
 						onClick(MainPanel.this, target);
 					}
-				}); 
+				});
 			}
 			menu.add(new MenuItem(Application.getString(gl.getLabelId()), l));
 		}

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/SwfPanel.java Wed Oct  5 16:44:41 2016
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.room
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.app.WebSession.WICKET_ROOM_ID;
 import static org.apache.openmeetings.web.app.WebSession.getLanguage;
 import static org.apache.openmeetings.web.app.WebSession.getSid;
@@ -39,6 +39,7 @@ import org.apache.openmeetings.db.dao.ro
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.ServerDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
+import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.server.Server;
 import org.apache.openmeetings.web.app.Application;
@@ -208,8 +209,8 @@ public class SwfPanel extends BasePanel
 	}
 
 	public static boolean isModerator(long userId, long roomId) {
-		for (org.apache.openmeetings.web.app.Client c : getRoomUsers(roomId)) {
-			if (c.getUserId() == userId && c.hasRight(org.apache.openmeetings.web.app.Client.Right.moderator)) {
+		for (org.apache.openmeetings.web.app.Client c : getRoomClients(roomId)) {
+			if (c.getUserId() == userId && c.hasRight(Room.Right.moderator)) {
 				return true;
 			}
 		}

Modified: openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/branches/3.1.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Wed Oct  5 16:44:41 2016
@@ -21,7 +21,7 @@ package org.apache.openmeetings.web.user
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_CHAT;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
-import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.Application.getRoomClients;
 import static org.apache.openmeetings.web.app.Application.getUserRooms;
 import static org.apache.openmeetings.web.app.Application.isUserInRoom;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
@@ -223,9 +223,9 @@ public class ChatPanel extends BasePanel
 	
 	private static void sendRoom(ChatMessage m, String msg) {
 		IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
-		for (Client c : getRoomUsers(m.getToRoom().getId())) {
+		for (Client c : getRoomClients(m.getToRoom().getId())) {
 			try {
-				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Client.Right.moderator))) {
+				if (!m.isNeedModeration() || (m.isNeedModeration() && c.hasRight(Room.Right.moderator))) {
 					IWebSocketConnection con = reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId()));
 					if (con != null) {
 						con.sendMessage(msg);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Wed Oct  5 16:44:41 2016
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.app;
 
 import static org.apache.openmeetings.web.app.Application.getBean;
+
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Wed Oct  5 16:44:41 2016
@@ -115,7 +115,7 @@ public class WebSession extends Abstract
 
 	@Override
 	public void invalidate() {
-		removeOnlineUser(getClientByKeys(getUserId(), get().getId()));
+		removeOnlineUser(getClientByKeys(userId, getId()));
 		super.invalidate();
 		userId = null;
 		rights = Collections.unmodifiableSet(Collections.<Right>emptySet());

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Wed Oct  5 16:44:41 2016
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.app;
 
 import static org.apache.openmeetings.web.app.Application.getBean;
+
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;

Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1763466&r1=1763465&r2=1763466&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Wed Oct  5 16:44:41 2016
@@ -115,7 +115,7 @@ public class WebSession extends Abstract
 
 	@Override
 	public void invalidate() {
-		removeOnlineUser(getClientByKeys(getUserId(), get().getId()));
+		removeOnlineUser(getClientByKeys(userId, getId()));
 		super.invalidate();
 		userId = null;
 		rights = Collections.unmodifiableSet(Collections.<Right>emptySet());