package edu.ualberta.med.biobank.widgets.listeners;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class VetoListenerSupport<T, V> {
private Map<T, Collection<VetoListener<T, V>>> listenersMap = new HashMap<T, Collection<VetoListener<T, V>>>();
public void addListener(T type, VetoListener<T, V> listener) {
Collection<VetoListener<T, V>> listeners = listenersMap.get(type);
if (listeners == null) {
listeners = new ArrayList<VetoListener<T, V>>();
listenersMap.put(type, listeners);
}
listeners.add(listener);
}
public void removeListener(T type, VetoListener<T, V> listener) {
Collection<VetoListener<T, V>> listeners = listenersMap.get(type);
if (listeners != null) {
listeners.remove(listener);
}
}
public void notifyListeners(Event<T, V> event) throws VetoException {
T type = event.getType();
Collection<VetoListener<T, V>> listeners = listenersMap.get(type);
if (listeners != null) {
for (VetoListener<T, V> listener : listeners) {
listener.handleEvent(event);
}
}
}
public static class Event<T, V> {
private final T type;
private final V object;
public boolean doit = true;
public Event(T type, V object) {
this.type = type;
this.object = object;
}
public T getType() {
return type;
}
public V getObject() {
return object;
}
public static <T, V> Event<T, V> newEvent(T type, V object) {
return new Event<T, V>(type, object);
}
}
public interface VetoListener<T, V> {
public void handleEvent(Event<T, V> event) throws VetoException;
}
public static class VetoException extends Exception {
private static final long serialVersionUID = 1L;
public VetoException(String message) {
super(message);
}
}
}