package cn.mutils.core.event;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Event dispatcher
*/
@SuppressWarnings({"unchecked", "RedundantIfStatement"})
public class Dispatcher implements IDispatcher {
protected Map<String, List<IListener>> mListenersMap;
protected Map<String, List<IListener>> allocMap() {
return new ConcurrentHashMap<String, List<IListener>>();
}
protected List<IListener> allocList() {
return new CopyOnWriteArrayList<IListener>();
}
@Override
public void addListener(IListener listener) {
addListener("", listener);
}
@Override
public void removeListener(IListener listener) {
removeListener("", listener);
}
@Override
public void removeAllListeners() {
removeAllListeners("");
}
@Override
public void addListener(String type, IListener listener) {
if (listener == null) {
return;
}
if (mListenersMap == null) {
mListenersMap = allocMap();
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
listeners = allocList();
mListenersMap.put(type, listeners);
} else {
if (listeners.contains(listener)) {
return;
}
}
listeners.add(listener);
}
@Override
public void removeListener(String type, IListener listener) {
if (listener == null) {
return;
}
if (mListenersMap == null) {
return;
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
return;
}
listeners.remove(listener);
}
@Override
public void removeAllListeners(String type) {
if (mListenersMap == null) {
return;
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
return;
}
listeners.clear();
}
@Override
public List<IListener> getListeners() {
return getListeners("");
}
@Override
public List<IListener> getListeners(String type) {
if (mListenersMap == null) {
mListenersMap = allocMap();
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
listeners = allocList();
mListenersMap.put(type, listeners);
}
return listeners;
}
@Override
public IListener getListener() {
return getListener("");
}
@Override
public void setListener(IListener listener) {
setListener("", listener);
}
@Override
public IListener getListener(String type) {
if (mListenersMap == null) {
return null;
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
return null;
}
if (listeners.size() == 0) {
return null;
}
return listeners.get(0);
}
@Override
public void setListener(String type, IListener listener) {
if (mListenersMap == null) {
if (listener == null) {
return;
}
mListenersMap = allocMap();
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
if (listener == null) {
return;
}
listeners = allocList();
mListenersMap.put(type, listeners);
}
if (listeners.size() == 0) {
if (listener != null) {
listeners.add(listener);
}
} else {
if (listener != null) {
listeners.set(0, listener);
} else {
listeners.remove(0);
}
}
}
@Override
public boolean hasListener(IListener listener) {
return hasListener("", listener);
}
@Override
public boolean hasListener(String type, IListener listener) {
if (mListenersMap == null) {
return false;
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
return false;
}
if (listeners.contains(listener)) {
return true;
}
return false;
}
@Override
public <T extends IListener> T getListener(Class<T> listenerClass) {
return getListener("", listenerClass);
}
@Override
public <T extends IListener> List<T> getListeners(Class<T> listenerClass) {
return getListeners("", listenerClass);
}
@Override
public <T extends IListener> List<T> getListeners(String type, Class<T> listenerClass) {
List<T> retListeners = new ArrayList<T>();
for (IListener listener : getListeners(type)) {
if (listenerClass.isInstance(listener)) {
retListeners.add((T) listener);
}
}
return retListeners;
}
@Override
public <T extends IListener> T getListener(String type, Class<T> listenerClass) {
if (mListenersMap == null) {
return null;
}
List<IListener> listeners = mListenersMap.get(type);
if (listeners == null) {
return null;
}
if (listeners.size() == 0) {
return null;
}
IListener listener = listeners.get(0);
return listenerClass.isInstance(listener) ? ((T) listener) : null;
}
}