package org.sef4j.core.helpers.senders.multiplexer; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.sef4j.core.api.EventSender; /** * De-Multiplexer EventSender: * unwrap event, extract key and dispatch unwrapped event to corresponding EventSender * * see also MultiplexerDefaults * * <PRE> * +-----------------------------------------------------+ * | +------+ | * | |key1 | sender1= | ---> sendEvent(ue) * | / +------+ dispatcher(key1) | * | / | * sendEvent(..) | / +------+ | * -------->| --> --- |key2 | sender2= | ---> sendEvent(ue) * | key,ue=unwrap(event) \ +------+ dispatcher(key2) | * | \ | * | \ +------+ | * | |key3 | sender3= | ---> sendEvent(ue) * | +------+ dispatcher(key3) | * +-----------------------------------------------------+ * </PRE> * */ public abstract class AbstractDemultiplexerEventSender<K,T,TDestEvent> implements EventSender<T> { public static class UnwrapInfoPair<K,TDestEvent> { K key; TDestEvent unwrappedEvent; public UnwrapInfoPair(K key, TDestEvent unwrappedEvent) { this.key = key; this.unwrappedEvent = unwrappedEvent; } } // ------------------------------------------------------------------------ protected AbstractDemultiplexerEventSender() { } // implements EventSender<T> // ------------------------------------------------------------------------ @Override public void sendEvent(T event) { UnwrapInfoPair<K, TDestEvent> unwrapInfo = unwrapEventInfo(event); K key = unwrapInfo.key; dispatchEvent(key, unwrapInfo.unwrappedEvent); } @Override public void sendEvents(Collection<T> events) { Map<K,List<TDestEvent>> key2events = new HashMap<K,List<TDestEvent>>(); for(T event : events) { UnwrapInfoPair<K, TDestEvent> unwrapInfo = unwrapEventInfo(event); K key = unwrapInfo.key; List<TDestEvent> ls = key2events.get(key); if (ls == null) { ls = new ArrayList<TDestEvent>(); key2events.put(key, ls); } ls.add(unwrapInfo.unwrappedEvent); } for(Map.Entry<K, List<TDestEvent>> e : key2events.entrySet()) { K key = e.getKey(); EventSender<TDestEvent> dispatchedSender = eventSenderDispatcherFor(key); if (dispatchedSender != null) { List<TDestEvent> unwrappedEvents = e.getValue(); dispatchedSender.sendEvents(unwrappedEvents); } } } // ------------------------------------------------------------------------ protected abstract UnwrapInfoPair<K, TDestEvent> unwrapEventInfo(T event); protected abstract EventSender<TDestEvent> eventSenderDispatcherFor(K key); protected void dispatchEvent(K key, TDestEvent unwrapEvent) { EventSender<TDestEvent> dispatchedSender = eventSenderDispatcherFor(key); if (dispatchedSender != null) { dispatchedSender.sendEvent(unwrapEvent); } } protected void dispatchEvents(K key, List<TDestEvent> unwrappedEvents) { EventSender<TDestEvent> dispatchedSender = eventSenderDispatcherFor(key); if (dispatchedSender != null) { dispatchedSender.sendEvents(unwrappedEvents); } } }