package pl.net.bluesoft.util.eventbus.listenables;
import pl.net.bluesoft.util.eventbus.EventListener;
import pl.net.bluesoft.util.eventbus.SupportingEventListener;
import java.lang.ref.WeakReference;
/**
* @author: amichalak@bluesoft.net.pl
*/
public abstract class ListenerReference<L extends EventListener> implements SupportingEventListener {
public abstract L getListener();
public boolean hasReference() {
return getListener() != null;
}
public boolean hasReference(L listener) {
return getListener().equals(listener);
}
@Override
public boolean supports(Class eventClass) {
L listener = getListener();
return listener != null && (!(listener instanceof SupportingEventListener)
|| ((SupportingEventListener) listener).supports(eventClass));
}
@Override
public void onEvent(Object o) {
if (!hasReference()) {
throw new IllegalStateException(getClass().getName() + " lost reference to event listener");
}
if (supports(o.getClass())) {
getListener().onEvent(o);
}
}
public static class EventListenerStrongReference<L extends EventListener> extends ListenerReference<L> {
private final L eventListener;
public EventListenerStrongReference(L eventListener) {
this.eventListener = eventListener;
}
@Override
public L getListener() {
return eventListener;
}
}
public static class EventListenerWeakReference<L extends EventListener> extends ListenerReference<L> {
private final WeakReference<L> reference;
public EventListenerWeakReference(L listener) {
this.reference = new WeakReference<L>(listener);
}
@Override
public L getListener() {
return reference.get();
}
}
public static <L extends EventListener> ListenerReference<L> weakReference(L listener) {
return new EventListenerWeakReference<L>(listener);
}
public static <L extends EventListener> ListenerReference<L> strongReference(L listener) {
return new EventListenerStrongReference<L>(listener);
}
}