/*
* This software is distributed under the terms of the FSF
* Gnu Lesser General Public License (see lgpl.txt).
*
* This program is distributed WITHOUT ANY WARRANTY. See the
* GNU General Public License for more details.
*/
package com.scooterframework.admin;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import com.scooterframework.common.logging.LogUtil;
/**
* EventsManager class manages events.
*
* @author (Fei) John Chen
*
*/
public class EventsManager {
private LogUtil log = LogUtil.getLogger(this.getClass().getName());
private static final EventsManager me = new EventsManager();
private final ConcurrentHashMap<String, List<Listener>> listenersMap =
new ConcurrentHashMap<String, List<Listener>>();
private EventsManager() {
}
/**
* Returns the singleton instance of the <tt>EventsManager</tt>.
*
* @return the singleton instance of the <tt>EventsManager</tt>.
*/
public static EventsManager getInstance() {
return me;
}
/**
* Register a listener for a specific event type.
*
* @param eventType The event type
* @param listener The event listener to be registered.
*/
public void registerListener(String eventType, Listener listener) {
List<Listener> listeners = listenersMap.get(eventType);
if (listeners == null) {
listeners = new CopyOnWriteArrayList<Listener>();
List<Listener> oldListeners = listenersMap.putIfAbsent(eventType, listeners);
if (oldListeners != null) {
listeners = oldListeners;
}
}
if (!listeners.contains(listener)) listeners.add(listener);
}
/**
* Removes a listener for a specific event type.
*
* @param eventType The event type
* @param listener The event listener to be removed.
*/
public void removeListener(String eventType, Listener listener) {
List<Listener> listeners = listenersMap.get(eventType);
if (listeners != null) {
listeners.remove(listener);
}
}
/**
* Removes a listener for all event types.
*
* @param listener The event listener to be removed.
*/
public void removeListener(Listener listener) {
for (Map.Entry<String, List<Listener>> entry : listenersMap.entrySet()) {
List<Listener> listeners = entry.getValue();
listeners.remove(listener);
}
}
/**
* Publishes an event.
*
* @param event The event to be published.
*/
public void publishEvent(Event event) {
if (event == null) return;
List<Listener> listeners = listenersMap.get(event.getEventType());
if (listeners != null) {
for (Iterator<Listener> it = listeners.iterator(); it.hasNext();) {
Listener listener = it.next();
try {
listener.handleEvent(event);
}
catch (RuntimeException ex) {
log.error("Error in calling listener: " + ex.getMessage());
it.remove();
}
}
}
}
}