package org.squirrelframework.foundation.component.impl; import com.google.common.base.Predicate; import org.squirrelframework.foundation.component.Observable; import org.squirrelframework.foundation.component.SquirrelProvider; import org.squirrelframework.foundation.event.ListenerMethod; import org.squirrelframework.foundation.event.PolymEventDispatcher; import org.squirrelframework.foundation.event.SquirrelEvent; import org.squirrelframework.foundation.util.ReflectUtils; import java.lang.reflect.Method; public abstract class AbstractSubject implements Observable { private boolean notifiable = true; private PolymEventDispatcher eventDispatcher; @Override public boolean isNotifiable() { return notifiable; } @Override public void setNotifiable(boolean notifiable) { this.notifiable = notifiable; } @Override public void addListener(Class<?> eventType, Object listener, Method method) { if (eventDispatcher == null) { eventDispatcher = SquirrelProvider.getInstance().newInstance(PolymEventDispatcher.class); } eventDispatcher.register(eventType, listener, method); } @Override public void addListener(Class<?> eventType, Object listener, String methodName) { Method method = ReflectUtils.getFirstMethodOfName(listener.getClass(), methodName); addListener(eventType, listener, method); } public void removeListener(Predicate<ListenerMethod> predicate) { if (eventDispatcher != null) { eventDispatcher.unregister(predicate); } } @Override public void removeListener(Class<?> eventType, Object listener, Method method) { if (eventDispatcher != null) { eventDispatcher.unregister(eventType, listener, method); } } @Override public int getListenerSize() { return eventDispatcher!=null ? eventDispatcher.getListenerSize() : 0; } @Override public void removeListener(Class<?> eventType, Object listener, String methodName) { Method method = ReflectUtils.getFirstMethodOfName(listener.getClass(), methodName); removeListener(eventType, listener, method); } @Override public void removeListener(Class<?> eventType, Object listener) { if (eventDispatcher != null) { eventDispatcher.unregister(eventType, listener); } } @Override public void removeAllListeners() { if (eventDispatcher != null) eventDispatcher.unregisterAll(); } @Override public void fireEvent(SquirrelEvent event) { if (eventDispatcher != null && isNotifiable()) { eventDispatcher.fireEvent(event); } } }