package org.sef4j.core.helpers.senders;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;
import org.sef4j.core.api.EventSender;
public abstract class AbstractFilterEventSender<T> implements EventSender<T> {
protected EventSender<T> target;
// ------------------------------------------------------------------------
protected AbstractFilterEventSender(EventSender<T> target) {
this.target = target;
}
// ------------------------------------------------------------------------
@Override
public void sendEvent(T event) {
if (acceptEvent(event)) {
target.sendEvent(event);
}
}
@Override
public void sendEvents(Collection<T> events) {
List<T> filteredEvents = new ArrayList<T>(events.size());
for(T event : events) {
if (acceptEvent(event)) {
filteredEvents.add(event);
}
}
if (! filteredEvents.isEmpty()) {
if (filteredEvents.size() > 1) {
target.sendEvents(filteredEvents);
} else {
target.sendEvent(filteredEvents.get(0));
}
}
}
protected abstract boolean acceptEvent(T event);
// ------------------------------------------------------------------------
public static class PredicateFilterEventSender<T> extends AbstractFilterEventSender<T> {
private Predicate<T> predicate;
public PredicateFilterEventSender(EventSender<T> target, Predicate<T> predicate) {
super(target);
this.predicate = predicate;
}
@Override
protected boolean acceptEvent(T event) {
return predicate.test(event);
}
// ------------------------------------------------------------------------
@Override
public String toString() {
return "PredicateFilterEventSender [predicate=" + predicate + ", target=" + target + "]";
}
}
}