package org.sef4j.core.helpers.ioeventchain;
import java.util.function.Function;
import org.sef4j.core.api.def.ioevenchain.TransformerInputEventChainDef;
import org.sef4j.core.api.ioeventchain.InputEventChain;
import org.sef4j.core.api.ioeventchain.InputEventChainFactory;
import org.sef4j.core.helpers.senders.AbstractTransformerEventSender.FuncTransformerEventSender;
import org.sef4j.core.util.factorydef.DependencyObjectCreationContext;
/**
* InputEventChain for transforming events received from an underlying InputEventChain
*
* <PRE>
* registerEventListener registerEventListener
* <----- <-----
* underlyingInput TransformerInputEventChain
* +-----------------+ sendEvent +-------------------+ sendEvent
* | InputEventChain | ------> | | ----->
* +-----------------+ | transform(event) |
* sendEvent +-------------------+ sendEvent
* ------> ----->
*
* unregisterEventListener unregisterEventListener
* <---- <----
* </PRE>
*
* @param <T>
*/
public class TransformerInputEventChain<TSrc,T> extends InputEventChain<T> {
private InputEventChain<TSrc> underlying;
private FuncTransformerEventSender<TSrc,T> transformerEventProvider;
// private Function<TSrc,T> transformer ... = transformerEventProvider.getTransformer();
private InputEventChain.ListenerHandle<TSrc> underlyingListenerHandle;
// ------------------------------------------------------------------------
public TransformerInputEventChain(String displayName,
InputEventChain<TSrc> underlying, Function<TSrc,T> transformer) {
super(displayName);
this.underlying = underlying;
this.transformerEventProvider = new FuncTransformerEventSender<TSrc,T>(innerEventProvider, transformer);
}
@Override
public void close() {
super.close();
assert underlyingListenerHandle == null;
this.underlying = null;
this.transformerEventProvider = null;
}
// ------------------------------------------------------------------------
@Override
public boolean isStarted() {
return underlyingListenerHandle != null && underlying.isStarted();
}
@Override
public void start() {
if (underlyingListenerHandle == null) {
underlyingListenerHandle = underlying.registerEventListener(transformerEventProvider);
}
}
@Override
public void stop() {
if (underlyingListenerHandle != null) {
underlying.unregisterEventListener(underlyingListenerHandle);
underlyingListenerHandle = null;
}
}
// ------------------------------------------------------------------------
public static class Factory<TSrc,T>
extends InputEventChainFactory<TransformerInputEventChainDef<TSrc,T>,TransformerInputEventChain<TSrc,T>> {
@SuppressWarnings({ "unchecked", "rawtypes" })
public Factory() {
super("TransformedInputEventChain", (Class)TransformerInputEventChainDef.class);
}
@Override
@SuppressWarnings("unchecked")
public TransformerInputEventChain<TSrc,T> create(
TransformerInputEventChainDef<TSrc,T> def,
DependencyObjectCreationContext ctx) {
InputEventChain<TSrc> underlying = ctx.getOrCreateDependencyByDef("underlying", def.getUnderlying());
Function<TSrc,T> transformer = (Function<TSrc,T>) def.getEventTransformerDef();
String displayName = ctx.getCurrObjectDisplayName();
return new TransformerInputEventChain<TSrc,T>(displayName, underlying, transformer);
}
}
}