package org.sef4j.core.helpers.senders.multiplexer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.sef4j.core.api.EventSender;
/**
* Multiplexer for sending wrapped event with key to underlying EventSender
*
* see also MultiplexerDefaults
*
* <PRE>
* +--------------------------------------------------+
* sendEvent(..) | +------+ |
* -------->| |key1 | --> multiplexSend(key1, ..) --> |
* | +------+ wrappedEvent= \ |
* | wrapEvent(key,event) \ |
* sendEvent(..) | +------+ \ | target.sendEvent(wrappedEvent)
* -------->| |key2 | --> multiplexSend(key2, ..) --> --- | --------->
* | +------+ / |
* | / |
* sendEvent(..) | +------+ / |
* -------->| |key3 | --> multiplexSend(key3, ..) --> |
* | +------+ |
* +--------------------------------------------------+
* </PRE>
*
* @param <T>
*/
public abstract class AbstractWrapperMultiplexerEventSender<K,TSrcEvent,TDestEvent> {
protected EventSender<TDestEvent> target;
// ------------------------------------------------------------------------
public AbstractWrapperMultiplexerEventSender(EventSender<TDestEvent> target) {
this.target = target;
}
// ------------------------------------------------------------------------
public MultiplexedPerKeyEventSender<K,TSrcEvent,TDestEvent> eventSenderFor(K key) {
return new MultiplexedPerKeyEventSender<K,TSrcEvent,TDestEvent>(this, key);
}
public void multiplexSendEvent(K key, TSrcEvent event) {
TDestEvent wrappedEvent = wrapEvent(key, event);
target.sendEvent(wrappedEvent);
}
public void multiplexSendEvents(K key, Collection<TSrcEvent> events) {
List<TDestEvent> wrappedEvents = wrapEvents(key, events);
target.sendEvents(wrappedEvents);
}
// ------------------------------------------------------------------------
protected abstract TDestEvent wrapEvent(K key, TSrcEvent event);
protected List<TDestEvent> wrapEvents(K key, Collection<TSrcEvent> events) {
List<TDestEvent> res = new ArrayList<TDestEvent>(events.size());
for(TSrcEvent e : events) {
TDestEvent de = wrapEvent(key, e);
res.add(de);
}
return res;
}
// ------------------------------------------------------------------------
@Override
public String toString() {
return "MultiplexerEventSender[target=" + target + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((target == null) ? 0 : target.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
@SuppressWarnings("unchecked")
AbstractWrapperMultiplexerEventSender<K,TSrcEvent,TDestEvent> other = (AbstractWrapperMultiplexerEventSender<K,TSrcEvent,TDestEvent>) obj;
if (target == null) {
if (other.target != null)
return false;
} else if (!target.equals(other.target))
return false;
return true;
}
// ------------------------------------------------------------------------
/**
* Multiplexed per Key EventSender
* @param <K>
* @param <TSrcEvent>
* @param <TDestEvent>
*/
public static class MultiplexedPerKeyEventSender<K,TSrcEvent,TDestEvent> implements EventSender<TSrcEvent> {
protected final AbstractWrapperMultiplexerEventSender<K,TSrcEvent,TDestEvent> to;
protected final K key;
public MultiplexedPerKeyEventSender(AbstractWrapperMultiplexerEventSender<K,TSrcEvent,TDestEvent> to, K key) {
this.to = to;
this.key = key;
}
public void sendEvent(TSrcEvent event) {
to.multiplexSendEvent(key, event);
}
public void sendEvents(Collection<TSrcEvent> events) {
to.multiplexSendEvents(key, events);
}
@Override
public String toString() {
return "MultiplexedEventSender[" + key + ", to=" + to + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
result = prime * result + ((to == null) ? 0 : to.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
@SuppressWarnings("unchecked")
MultiplexedPerKeyEventSender<K,TSrcEvent,TDestEvent> other = (MultiplexedPerKeyEventSender<K,TSrcEvent,TDestEvent>) obj;
if (key == null) {
if (other.key != null)
return false;
} else if (!key.equals(other.key))
return false;
if (to == null) {
if (other.to != null)
return false;
} else if (!to.equals(other.to))
return false;
return true;
}
}
}