package scrum.client;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.rpc.IsSerializable;
public class UsersStatusData implements Serializable, IsSerializable {
private Map<String, UserStatus> statuses = new HashMap<String, UserStatus>();
public boolean addSelectedEntityId(String userId, String entityId) {
synchronized (statuses) {
return get(userId).selectedEntitysIds.add(entityId);
}
}
public boolean removeSelectedEntityId(String userId, String entityId) {
synchronized (statuses) {
return get(userId).selectedEntitysIds.remove(entityId);
}
}
public void setUsersSelectedEntities(String userId, Set<String> ids) {
synchronized (statuses) {
get(userId).selectedEntitysIds = ids;
}
}
public void setOnlineUsers(Set<String> userIds) {
synchronized (statuses) {
Set<String> updated = new HashSet<String>();
for (Map.Entry<String, UserStatus> entry : statuses.entrySet()) {
String userId = entry.getKey();
entry.getValue().online = userIds.contains(userId);
updated.add(userId);
}
for (String userId : userIds) {
if (updated.contains(userId)) continue;
get(userId).online = true;
}
}
}
public UserStatus get(String userId) {
synchronized (statuses) {
UserStatus status = statuses.get(userId);
if (status == null) {
status = new UserStatus();
statuses.put(userId, status);
}
return status;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("UsersStatusData(");
boolean first = true;
for (Map.Entry<String, UserStatus> entry : statuses.entrySet()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(entry.getKey());
sb.append("->");
sb.append(entry.getValue().isOnline() ? "online" : "offline");
}
sb.append(")");
return sb.toString();
}
public static class UserStatus implements Serializable, IsSerializable {
private Set<String> selectedEntitysIds = new HashSet<String>();
private boolean online;
public Set<String> getSelectedEntitysIds() {
return selectedEntitysIds;
}
public boolean isOnline() {
return online;
}
}
}