package org.sef4j.core.helpers.ioeventchain;
import java.util.function.Predicate;
import org.sef4j.core.api.EventSender;
import org.sef4j.core.api.ioeventchain.OutputEventChain;
import org.sef4j.core.helpers.senders.AbstractFilterEventSender.PredicateFilterEventSender;
import org.sef4j.core.helpers.senders.DelegateEventSender;
/**
* OutputEventChain for filtering events by predicate
*
* @param <T>
*/
public class FilterOutputEventChain<T> extends OutputEventChain<T> {
private OutputEventChain<T> underlying;
/**
*
* cliSender = client.registerSender()
* |
* \/
* super.innerSender = FilterSender(predicate, sender=proxy)
* |
* \/
* Proxy
* |
* \/
* null or underlyingSenderHandle
* |
* \/
* underlyingEventChain(..innerEventSender)
*/
private PredicateFilterEventSender<T> innerEventSender;
private DelegateEventSender<T> proxyToUnderlyingEventSender;
private OutputEventChain.SenderHandle<T> underlyingSenderHandle;
// ------------------------------------------------------------------------
public FilterOutputEventChain(String displayName,
OutputEventChain<T> underlying, Predicate<T> predicate) {
super(displayName);
this.underlying = underlying;
this.proxyToUnderlyingEventSender = new DelegateEventSender<T>(null);
this.innerEventSender = new PredicateFilterEventSender<T>(proxyToUnderlyingEventSender, predicate);
}
@Override
public void close() {
super.close();
assert underlyingSenderHandle == null;
this.underlying = null;
this.innerEventSender = null;
this.proxyToUnderlyingEventSender = null;
}
// ------------------------------------------------------------------------
@Override
protected EventSender<T> getInnerEventSender() {
return innerEventSender;
}
@Override
public boolean isStarted() {
return underlyingSenderHandle != null && underlying.isStarted();
}
@Override
public void start() {
if (underlyingSenderHandle == null) {
underlyingSenderHandle = underlying.registerSender();
proxyToUnderlyingEventSender.setEventListener(underlyingSenderHandle);
}
}
@Override
public void stop() {
if (underlyingSenderHandle != null) {
proxyToUnderlyingEventSender.setEventListener(null);
underlying.unregisterSender(underlyingSenderHandle);
underlyingSenderHandle = null;
}
}
}