// Copyright (c) 2014 Tom Zhou<iwebpp@gmail.com>
package com.iwebpp.node;
import java.nio.ByteBuffer;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.iwebpp.SimpleDebug;
public class EventEmitter2
extends SimpleDebug
implements EventEmitter {
private final static String TAG = "EventEmitter2";
private Map<String, List<Listener>> events;
private Map<String, Integer> maxEvents;
public EventEmitter2() {
this.events = new Hashtable<String, List<Listener>>();
this.maxEvents = new Hashtable<String, Integer>();
}
@Override
public boolean emit(final String event) throws Exception {
if (events.containsKey(event)) {
debug(TAG, "emit "+event+" at="+this);
for (Listener cb : events.get(event))
cb.onEvent(null);
} else {
debug(TAG, "unknown event "+event+" at="+this);
return false;
}
return true;
}
@Override
public boolean emit(final String event, final Object data) throws Exception {
if (events.containsKey(event)) {
debug(TAG, "emit "+event+" data="+data+" at="+this);
for (Listener cb : events.get(event))
// always create new one to share in case ByteBuffer, etc
if (data instanceof ByteBuffer) {
ByteBuffer bb = ((ByteBuffer)data).slice();
cb.onEvent(bb);
} else
cb.onEvent(data);
} else {
debug(TAG, "unknown event "+event+" data "+data+" at="+this);
return false;
}
return true;
}
@Override
public EventEmitter addListener(final String event, final Listener cb) {
// check maxListens
if (maxEvents.containsKey(event) &&
maxEvents.get(event) < listenerCount(event)) {
warn(TAG, "exceed maxListeners@"+event+" at="+this);
///return this;
}
if (!events.containsKey(event)) {
events.put(event, new LinkedList<Listener>());
}
debug(TAG, "addListener "+event+" cb="+cb+" at="+this);
events.get(event).add(cb);
return this;
}
@Override
public EventEmitter addListener(final String event, final Listener cb, final int priority) {
// check maxListens
if (maxEvents.containsKey(event) &&
maxEvents.get(event) < listenerCount(event)) {
warn(TAG, "exceed maxListeners@"+event+" at="+this);
///return this;
}
if (!events.containsKey(event)) {
events.put(event, new LinkedList<Listener>());
}
if (priority < listenerCount(event))
events.get(event).add(priority, cb);
else
events.get(event).add(cb);
return this;
}
@Override
public EventEmitter on(final String event, final Listener cb) throws Exception {
return addListener(event, cb);
}
@Override
public EventEmitter once(final String event, final Listener ocb) {
return addListener(event, new Listener(){
@Override
public void onEvent(final Object data) throws Exception {
ocb.onEvent(data);
// remove listener
removeListener(event, this);
}
});
}
@Override
public EventEmitter removeListener(final String event, final Listener cb) {
if (events.containsKey(event) && events.get(event).contains(cb))
events.get(event).remove(cb);
return this;
}
@Override
public EventEmitter removeListener(final String event) {
if (events.containsKey(event))
events.remove(event);
return this;
}
@Override
public EventEmitter removeListener() {
events.clear();
return this;
}
@Override
public EventEmitter removeAllListeners() {
events.clear();
return this;
}
@Override
public EventEmitter setMaxListeners(final String event, final int n) {
this.maxEvents.put(event, n);
return this;
}
@Override
public List<Listener> listeners(final String event) {
return events.containsKey(event) ? events.get(event) : null;
}
@Override
public int listenerCount(final String event) {
return events.containsKey(event) ? events.get(event).size() : 0;
}
}