package org.sef4j.core.helpers.senders.multiplexer; import java.util.HashMap; import java.util.Map; import org.sef4j.core.api.EventSender; import org.sef4j.core.util.CopyOnWriteUtils; /** * default implementation of AbstractDemultiplexerEventSender * using in-memory map dispatcher + default MultiplexedEvent<K,T> wrapper event * * @param <K> * @param <T> */ public class DefaultMapDemultiplexerEventSender<K,T> extends AbstractDemultiplexerEventSender<K,MultiplexedEvent<K,T>,T> { /** copy-on-write field, using immutable Map */ protected Map<K,EventSender<T>> dispatcherMap = new HashMap<K,EventSender<T>>(); protected Object lock = new Object(); protected EventSender<T> defaultEventSender; // ------------------------------------------------------------------------ public DefaultMapDemultiplexerEventSender() { } public DefaultMapDemultiplexerEventSender(Map<K,EventSender<T>> dispatcherMap) { this.dispatcherMap = dispatcherMap; } // ------------------------------------------------------------------------ @Override protected UnwrapInfoPair<K,T> unwrapEventInfo(MultiplexedEvent<K,T> event) { return new UnwrapInfoPair<K,T>(event.getKey(), event.getWrappedEvent()); } @Override protected EventSender<T> eventSenderDispatcherFor(K key) { EventSender<T> res = dispatcherMap.get(key); if (res == null) { res = defaultEventSender; } return res; } // ------------------------------------------------------------------------ public EventSender<T> getDefaultEventSender() { return defaultEventSender; } public void setDefaultEventSender(EventSender<T> defaultEventSender) { this.defaultEventSender = defaultEventSender; } public EventSender<T> getEventSenderDispatcher(K key) { return this.dispatcherMap.get(key); } public void putEventSenderDispatcher(K key, EventSender<T> eventSender) { synchronized(lock) { this.dispatcherMap = CopyOnWriteUtils.newWithPut(dispatcherMap, key, eventSender); } } public void removeEventSenderDispatcher(K key, EventSender<T> eventSender) { synchronized(lock) { this.dispatcherMap = CopyOnWriteUtils.newWithRemove(dispatcherMap, key); } } // ------------------------------------------------------------------------ @Override public String toString() { return "DefaultMapDemultiplexerEventSender[" + "dispatcherMap=" + dispatcherMap + ", defaultEventSender=" + defaultEventSender + "]"; } }