package org.sef4j.core.helpers.ioeventchain; import java.util.HashMap; import java.util.Map; import org.sef4j.core.api.EventSender; import org.sef4j.core.api.def.ioevenchain.DefaultMapDemultiplexerOutputEventChainDef; import org.sef4j.core.api.def.ioevenchain.OutputEventChainDef; import org.sef4j.core.api.ioeventchain.OutputEventChain; import org.sef4j.core.api.ioeventchain.OutputEventChainFactory; import org.sef4j.core.helpers.senders.multiplexer.DefaultMapDemultiplexerEventSender; import org.sef4j.core.helpers.senders.multiplexer.MultiplexedEvent; import org.sef4j.core.util.factorydef.DependencyObjectCreationContext; import com.google.common.collect.ImmutableMap; /** * OutputEventChain for unwrapping events with key and dispatching to map<K,> underlying output * * <PRE> * </PRE> * * @param <K> * @param <T> */ public class DefaultMapDemultiplexerOutputEventChain<K,T> extends OutputEventChain<MultiplexedEvent<K,T>> { private final Map<K,OutputEventChainDependency<T>> outputDeps; protected DefaultMapDemultiplexerEventSender<K,T> innerSender; // ------------------------------------------------------------------------ public DefaultMapDemultiplexerOutputEventChain(String displayName, Map<K,OutputEventChain<T>> outputs ) { super(displayName); // wrap convert Map<K,OutputEventChain> to Map<K,OutputEventChainDependency> ImmutableMap.Builder<K,OutputEventChainDependency<T>> depsBuilder = new ImmutableMap.Builder<K,OutputEventChainDependency<T>>(); for(Map.Entry<K,OutputEventChain<T>> e : outputs.entrySet()) { OutputEventChainDependency<T> outputDep = new OutputEventChainDependency<T>(e.getValue()); depsBuilder.put(e.getKey(), outputDep); } this.outputDeps = depsBuilder.build(); // convert Map<K,OutputEventChainDependency> to Map<K,EventSender(getInnerEventSender())> ImmutableMap.Builder<K,EventSender<T>> outputSenders = new ImmutableMap.Builder<K,EventSender<T>>(); for(Map.Entry<K,OutputEventChainDependency<T>> e : outputDeps.entrySet()) { outputSenders.put(e.getKey(), e.getValue().getInnerEventSender()); } this.innerSender = new DefaultMapDemultiplexerEventSender<K,T>(outputSenders.build()); } // ------------------------------------------------------------------------ protected EventSender<MultiplexedEvent<K,T>> getInnerEventSender() { return innerSender; } @Override public boolean isStarted() { boolean res = OutputEventChainDependency.areAllStarted(outputDeps.values()); return res; } @Override public void start() { OutputEventChainDependency.startAll(outputDeps.values()); } @Override public void stop() { OutputEventChainDependency.stopAll(outputDeps.values()); } // ------------------------------------------------------------------------ @Override public String toString() { return "DefaultMapDemultiplexerOutputEventChain[" + outputDeps.keySet() + "]"; } // ------------------------------------------------------------------------ public static class Factory<K,T> extends OutputEventChainFactory<DefaultMapDemultiplexerOutputEventChainDef<K>,DefaultMapDemultiplexerOutputEventChain<K,T>> { @SuppressWarnings({ "rawtypes", "unchecked" }) public Factory() { super("DefaultMapDemultiplexerOutputEventChain", (Class) DefaultMapDemultiplexerOutputEventChainDef.class); } @Override public DefaultMapDemultiplexerOutputEventChain<K,T> create( DefaultMapDemultiplexerOutputEventChainDef<K> def, DependencyObjectCreationContext ctx) { Map<K, OutputEventChain<T>> outputs = new HashMap<K, OutputEventChain<T>>(); for(Map.Entry<K,OutputEventChainDef> e : def.getOutputs().entrySet()) { K key = e.getKey(); OutputEventChain<T> outputDep = ctx.getOrCreateDependencyByDef("output-" + key, def); outputs.put(key, outputDep); } String displayName = ctx.getCurrObjectDisplayName(); return new DefaultMapDemultiplexerOutputEventChain<K,T>(displayName, outputs); } } }