/**
*
*/
package model.events;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* EventManager.java
*
* @author Christopher Bertels (chbertel@uos.de) 17.09.2008
*
* {@link EventManager} - Verwaltet alle {@link VideothekEventListener} und
* leitet {@link VideothekEvent}s an diese weiter.
*/
public class EventManager
{
private static Map<Class<? extends VideothekEvent>, List<VideothekEventListener>> listenerMap = new HashMap<Class<? extends VideothekEvent>, List<VideothekEventListener>>();
/**
* Registriert/Verknüpft einen {@link VideothekEventListener} mit einem
* bestimmten Eventtyp.
*
* @param c Die Klasse (also der 'Typ') des Events, auf das der Listener
* reagieren soll.
* @param eventListener Der Eventlistener, der auf das Event reagieren soll.
*/
public static void registerEventListener(Class<? extends VideothekEvent> c,
VideothekEventListener eventListener)
{
if (listenerMap.containsKey(c))
{
// keine doppelten eintragungen...
if (!listenerMap.get(c).contains(eventListener))
{
listenerMap.get(c).add(eventListener);
}
}
else
{
// Key erstellen, neue Liste mit EventListener drin erstellen und
// eintragen
List<VideothekEventListener> newListenerList = new LinkedList<VideothekEventListener>();
newListenerList.add(eventListener);
listenerMap.put(c, newListenerList);
}
}
/**
* Entbindet/Unregistriert einen {@link VideothekEventListener} zu einem
* bestimmten Eventtyp.
*
* @param c Die Klasse (also der 'Typ') des Events, von dem der
* EventListener abgemeldet werden soll.
* @param eventListener Der Eventlistener, der abgemeldet werden soll.
*/
public static void removeEventListener(Class<? extends VideothekEvent> c,
VideothekEventListener eventListener)
{
if (listenerMap.containsKey(c))
{
if (listenerMap.get(c).contains(eventListener))
{
listenerMap.get(c).remove(eventListener);
}
}
}
/**
* 'Feuert' ein {@link VideothekEvent} - Wird an alle EventListener
* weitergeleitet, die sich für diesen Eventtyp registriert haben.
*
* @param event Das Event, das weitergeleitet werden soll.
*/
public static void fireEvent(VideothekEvent event)
{
if (listenerMap.containsKey(event.getClass()))
{
for (VideothekEventListener listener : listenerMap.get(event
.getClass()))
{
if (listener != null)
{
listener.handleEvent(event);
}
}
}
}
}