package net.i2p.util;
/*
* free (adj.): unencumbered; not under the control of others Written
* by human & jrandom in 2004 and released into the public domain with
* no warranty of any kind, either expressed or implied. It probably
* won't make your computer catch on fire, or eat your children, but
* it might. Use at your own risk.
*
*/
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* An implementation of the EventDispatcher interface. Since Java
* doesn't support multiple inheritance, you could follow the Log.java
* style: this class should be instantiated and kept as a variable by
* each object it is used by, ala:
* <code>private final EventDispatcher _event = new EventDispatcher();</code>
*
* Deprecated - Used only by I2PTunnel
*
* If there is anything in here that doesn't make sense, turn off
* your computer and go fly a kite - (c) 2004 by jrandom
* @author human
* @author jrandom
*/
public class EventDispatcherImpl implements EventDispatcher {
private boolean _ignore = false;
private final Map<String, Object> _events = new ConcurrentHashMap<String, Object>(4);
private final List<EventDispatcher> _attached = new CopyOnWriteArrayList<EventDispatcher>();
public EventDispatcher getEventDispatcher() {
return this;
}
public void attachEventDispatcher(EventDispatcher ev) {
if (ev == null) return;
_attached.add(ev);
}
public void detachEventDispatcher(EventDispatcher ev) {
if (ev == null) return;
_attached.remove(ev);
}
public void notifyEvent(String eventName, Object args) {
if (_ignore) return;
if (args == null) {
args = "[null value]";
}
_events.put(eventName, args);
synchronized (_events) {
_events.notifyAll();
}
for (EventDispatcher e : _attached) {
e.notifyEvent(eventName, args);
}
}
public Object getEventValue(String name) {
if (_ignore) return null;
return _events.get(name);
}
public Set<String> getEvents() {
if (_ignore) return Collections.emptySet();
return new HashSet<String>(_events.keySet());
}
public void ignoreEvents() {
_ignore = true;
_events.clear();
}
public void unIgnoreEvents() {
_ignore = false;
}
public Object waitEventValue(String name) {
if (_ignore) return null;
do {
synchronized (_events) {
Object val = _events.get(name);
if (val != null)
return val;
try {
_events.wait(5 * 1000);
} catch (InterruptedException e) {}
}
} while (true);
}
}