/**
*
*/
package vnet.sms.gateway.nettytest.embedded;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ExceptionEvent;
import com.google.common.base.Predicate;
/**
* @author obergner
*
*/
class DefaultChannelEvents implements ChannelEvents,
ChannelListener<ChannelEvent> {
private final FilteredChannelEventQueue<ChannelEvent> channelEvents = new FilteredChannelEventQueue<ChannelEvent>();
DefaultChannelEvents() {
}
// ------------------------------------------------------------------------
// ChannelListener
// ------------------------------------------------------------------------
@Override
public void onEvent(final ChannelEvent e) {
this.channelEvents.onEvent(e);
}
@Override
public void onExceptionEvent(final ExceptionEvent e) {
this.channelEvents.onExceptionEvent(e);
}
// ------------------------------------------------------------------------
// ChannelEvents
// ------------------------------------------------------------------------
@Override
public boolean isEmpty() {
return this.channelEvents.isEmpty();
}
/**
* @see java.lang.Iterable#iterator()
*/
@Override
public Iterator<ChannelEvent> iterator() {
return this.channelEvents.iterator();
}
/**
* @see vnet.sms.gateway.nettytest.embedded.ChannelEvents#nextChannelEvent()
*/
@Override
public ChannelEvent nextChannelEvent() {
return this.channelEvents.poll();
}
/**
* @see vnet.sms.gateway.nettytest.embedded.ChannelEvents#nextMatchingChannelEvent(vnet.sms.gateway.nettytest.embedded.ChannelEventFilter)
*/
@Override
public ChannelEvent nextMatchingChannelEvent(
final Predicate<ChannelEvent> predicate) {
for (final ChannelEvent candidate : this.channelEvents) {
if (predicate.apply(candidate)) {
this.channelEvents.remove(candidate);
return candidate;
}
}
return null;
}
/**
* @see vnet.sms.gateway.nettytest.embedded.ChannelEvents#allChannelEvents()
*/
@Override
public ChannelEvent[] allChannelEvents() {
final int size = this.channelEvents.size();
final ChannelEvent[] a = new ChannelEvent[size];
for (int i = 0; i < size; i++) {
final ChannelEvent product = nextChannelEvent();
if (product == null) {
throw new ConcurrentModificationException();
}
a[i] = product;
}
return a;
}
// ------------------------------------------------------------------------
// toString
// ------------------------------------------------------------------------
@Override
public String toString() {
return "DefaultChannelEvents@" + this.hashCode() + "[channelEvents: "
+ this.channelEvents + "]";
}
}