package org.sef4j.core.helpers.ioeventchain; import java.util.function.Predicate; import org.sef4j.core.api.def.ioevenchain.FilterInputEventChainDef; import org.sef4j.core.api.ioeventchain.InputEventChain; import org.sef4j.core.api.ioeventchain.InputEventChainFactory; import org.sef4j.core.helpers.senders.AbstractFilterEventSender.PredicateFilterEventSender; import org.sef4j.core.util.factorydef.DependencyObjectCreationContext; /** * InputEventChain for filtering events by predicate received from an underlying InputEventChain * * <PRE> * registerEventListener * <----- * underlyingInput FilteredInputEventChain * +-----------------+ sendEvent +-------------------+ sendEvent * | InputEventChain | ------> | | ----> * +-----------------+ | filter(event) | * sendEvent +-------------------+ * ------> * * unregisterEventListener * <---- * </PRE> * * @param <T> */ public class FilterInputEventChain<T> extends InputEventChain<T> { private InputEventChainDependency<T> underlying; private PredicateFilterEventSender<T> predicateFilterEventProvider; // ------------------------------------------------------------------------ public FilterInputEventChain(String displayName, InputEventChain<T> underlying, Predicate<T> predicate) { super(displayName); this.predicateFilterEventProvider = new PredicateFilterEventSender<T>(innerEventProvider, predicate); this.underlying = new InputEventChainDependency<T>(underlying, predicateFilterEventProvider); } @Override public void close() { super.close(); assert ! isStarted(); this.underlying = null; this.predicateFilterEventProvider = null; } // ------------------------------------------------------------------------ @Override public boolean isStarted() { return underlying.isStarted(); } @Override public void start() { underlying.startListener(); } @Override public void stop() { underlying.stopListener(); } // ------------------------------------------------------------------------ public static class Factory<T> extends InputEventChainFactory<FilterInputEventChainDef,FilterInputEventChain<T>> { public Factory() { super("FilteredInputEventChain", FilterInputEventChainDef.class); } @Override @SuppressWarnings("unchecked") public FilterInputEventChain<T> create(FilterInputEventChainDef def, DependencyObjectCreationContext ctx) { InputEventChain<T> underlying = ctx.getOrCreateDependencyByDef("underlying", def.getUnderlying()); Predicate<T> predicate = (Predicate<T>) def.getFilterDef().getPredicate(); String displayName = ctx.getCurrObjectDisplayName(); return new FilterInputEventChain<T>(displayName, underlying, predicate); } } }