package org.squirrelframework.foundation.event;
import java.lang.reflect.Method;
import java.util.LinkedHashSet;
import org.squirrelframework.foundation.component.SquirrelComponent;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterators;
/**
* Event mediator dispatch event to proper listener according to event type.
*
* @author Henry.He
*
*/
public class PolymEventDispatcher implements SquirrelComponent {
private LinkedHashSet<ListenerMethod> listeners = null;
public void register(Class<?> eventType, Object listener, Method method) {
if (listeners == null) {
listeners = new LinkedHashSet<ListenerMethod>();
}
listeners.add(new ListenerMethod(eventType, listener, method));
}
public void unregister(Predicate<ListenerMethod> predicate) {
if (listeners != null) {
Iterators.removeIf(listeners.iterator(), predicate);
}
}
public void unregister(final Class<?> eventType, final Object target) {
if (listeners != null) {
Iterators.removeIf(listeners.iterator(), new Predicate<ListenerMethod>() {
@Override
public boolean apply(ListenerMethod m) {
return m.matches(eventType, target);
}
});
}
}
public void unregister(final Class<?> eventType, final Object target, final Method method) {
if (listeners != null) {
ListenerMethod toBeRemove = Iterators.find(listeners.iterator(), new Predicate<ListenerMethod>() {
@Override
public boolean apply(ListenerMethod m) {
return m.matches(eventType, target, method);
}
});
if(toBeRemove!=null) {
listeners.remove(toBeRemove);
}
}
}
public void unregisterAll() {
listeners = null;
}
public void fireEvent(Object event) {
if (listeners == null) return;
ListenerMethod[] listenerArray = listeners.toArray(new ListenerMethod[listeners.size()]);
for (int i = 0; i < listenerArray.length; i++) {
if (listenerArray[i].getEventType().isAssignableFrom(event.getClass())) {
listenerArray[i].invokeMethod(event);
}
}
}
public int getListenerSize() {
return listeners!=null ? listeners.size() : 0;
}
}