package ch.x42.terye.observation; import java.util.Iterator; import java.util.NoSuchElementException; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; public class FilteredEventIterator implements EventIterator { private Iterator<EventImpl> iterator; private EventFilter filter; private long position; private EventImpl next; public FilteredEventIterator(EventCollection events, EventFilter filter) { this.iterator = events.iterator(); this.filter = filter; this.position = 0; this.next = null; } @Override public void skip(long skipNum) { if (skipNum < 0) { throw new IllegalArgumentException("Parameter must be non-negative"); } while (skipNum > 0 && iterator.hasNext()) { iterator.next(); position++; skipNum--; } } @Override public long getSize() { return -1; } @Override public long getPosition() { return position; } private void fetchNext() { // next element is already fetched if (next != null) { return; } // fetch next while (iterator.hasNext()) { EventImpl event = iterator.next(); if (!filter.filters(event)) { next = event; return; } } } @Override public boolean hasNext() { fetchNext(); return next != null; } @Override public Object next() { fetchNext(); if (next == null) { throw new NoSuchElementException(); } position++; Event event = next; next = null; return event; } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public Event nextEvent() { return (Event) next(); } }