package org.bigbluebutton.red5;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* This class maintains the connections mapping of a user.
* This tracks the connections for a user to manage auto-reconnects.
* @author ralam
*
*/
public class UserConnectionMapper {
private ConcurrentMap<String, UserConnection> users = new ConcurrentHashMap<String, UserConnection>(8, 0.9f, 1);;
/**
* Adds a connection for a user.
* @param userId
* @param connId
*/
public synchronized void addUserConnection(String userId, String connId) {
if (users.containsKey(userId)) {
UserConnection user = users.get(userId);
user.add(connId);
} else {
UserConnection user = new UserConnection();
user.add(connId);
users.put(userId, user);
}
}
/**
* Removed a connection for a user. Returns true if the user doesn't have any
* connection left and thus can be removed.
* @param userId
* @param connId
* @return boolean - no more connections
*/
public synchronized boolean userDisconnected(String userId, String connId) {
if (users.containsKey(userId)) {
UserConnection user = users.get(userId);
user.remove(connId);
if (user.isEmpty()) {
users.remove(userId);
return true;
}
return false;
}
return true;
}
private class UserConnection {
private final Set<String> connections = new HashSet<String>();
public void add(String connId) {
connections.add(connId);
}
public void remove(String connId) {
connections.remove(connId);
}
public boolean isEmpty() {
return connections.isEmpty();
}
}
}