package org.vaadin.mideaas.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// TODO: Auto-generated Javadoc
/**
* The Class LobbyBroadcaster.
* https://vaadin.com/wiki/-/wiki/Main/Broadcasting%20messages%20to%20other%20users
*/
public class LobbyBroadcaster {
/** The listeners. */
private static final Collection<LobbyBroadcastListener> listeners = new ArrayList<LobbyBroadcastListener>();
private static final ExecutorService pool = Executors.newSingleThreadExecutor();
/**
* Registers LobbyBroadcastListener to listen new broadcasts.
*
* @param listener the listener
*/
public synchronized static void register(LobbyBroadcastListener listener) {
listeners.add(listener);
}
/**
* Unregisters LobbyBroacastListener -> no more broadcasts to you.
*
* @param listener the listener
*/
public synchronized static void unregister(LobbyBroadcastListener listener) {
listeners.remove(listener);
}
/**
* Gets the list of LobbyBroadcastListeners.
*
* @return the listeners
*/
private synchronized static Collection<LobbyBroadcastListener> getListeners() {
Collection<LobbyBroadcastListener> listenerCopy = new ArrayList<LobbyBroadcastListener>();
listenerCopy.addAll(listeners);
return listenerCopy;
}
public static void broadcastProjectsChanged() {
// Make a copy of the listener list while synchronized, can't be
// synchronized while firing the event or we would have to fire each
// event in a separate thread.
final Collection<LobbyBroadcastListener> listenersCopy = getListeners();
// We spawn another thread to avoid potential deadlocks with
// multiple UIs locked simultaneously
pool.submit(new Runnable() {
@Override
public void run() {
for (LobbyBroadcastListener listener : listenersCopy) {
listener.projectsChanged();
}
}
});
}
/*
public static void broadcastLoggedInUsersChanged(final Set<User> users) {
final Collection<LobbyBroadcastListener> listenersCopy = getListeners();
pool.submit(new Runnable() {
@Override
public void run() {
for (LobbyBroadcastListener listener : listenersCopy) {
listener.loggedInUsersChanged(users);
}
}
});
}
*/
public static void broadcastLoggedInUsersChanged(final TreeSet<User> users, final User user, final boolean loggedin) {
final Collection<LobbyBroadcastListener> listenersCopy = getListeners();
pool.submit(new Runnable() {
@Override
public void run() {
for (LobbyBroadcastListener listener : listenersCopy) {
listener.loggedInUsersChanged(users, user, loggedin);
}
}
});
}
}