package org.sef4j.core.helpers.senders; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.sef4j.core.api.EventSender; /** * buffer events in memory while no delegate are present, otherwise redispatch to delegate * * @param <T> */ public class MutableInMemoryOrDelegateEventSender<T> implements EventSender<T> { private EventSender<T> target; private List<T> events = new ArrayList<T>(); private Object lock = new Object(); private int maxEvents; // ------------------------------------------------------------------------ public MutableInMemoryOrDelegateEventSender(EventSender<T> target, int maxEvents) { this.target = target; this.maxEvents = maxEvents; } // ------------------------------------------------------------------------ public EventSender<T> getDelegate() { synchronized(lock) { return target; } } public void setDelegate(EventSender<T> target) { List<T> eventsToSend = null; synchronized(lock) { this.target = target; if (target != null && ! events.isEmpty()) { eventsToSend = events; events = new ArrayList<T>(); } } if (eventsToSend != null) { target.sendEvents(eventsToSend); } } public void sendEvent(T event) { EventSender<T> to; synchronized (lock) { to = target; } if (to != null) { to.sendEvent(event); } else { synchronized (lock) { events.add(event); onCheckMaxEventsSize(); } } } public void sendEvents(Collection<T> event) { EventSender<T> to; synchronized (lock) { to = target; } if (to != null) { to.sendEvents(events); } else { synchronized (lock) { events.addAll(events); onCheckMaxEventsSize(); } } } protected void onCheckMaxEventsSize() { if (maxEvents > 0 && events.size() > maxEvents) { events = new ArrayList<T>(maxEvents); // TODO ... insert special event for "truncation event" events.addAll(events.subList(events.size()-maxEvents, events.size())); } } // ------------------------------------------------------------------------ @Override public String toString() { EventSender<T> to; int eventsCount; synchronized (lock) { to = target; eventsCount = events.size(); } return "MutableInMemoryOrDelegateEventSender[" + ((to != null)? to : "") + ((eventsCount != 0)? eventsCount + " buffered event(s)" : "") +"]"; } }