/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.util;
import java.util.Iterator;
import com.mysema.commons.lang.Assert;
import com.mysema.query.QueryModifiers;
/**
* LimitingIterator is and Iterator adapter which takes limit and offset into
* account
*
* @author tiwe
*/
public class LimitingIterator<E> implements Iterator<E> {
public static <T> Iterator<T> create(Iterator<T> iterator, QueryModifiers modifiers) {
if (modifiers.isRestricting()) {
if (modifiers.getOffset() != null) {
int counter = 0;
while (iterator.hasNext() && counter < modifiers.getOffset()) {
counter++;
iterator.next();
}
}
if (modifiers.getLimit() != null) {
iterator = new LimitingIterator<T>(iterator, modifiers.getLimit());
}
}
return iterator;
}
private long counter;
private final long limit;
private final Iterator<E> original;
LimitingIterator(Iterator<E> iterator, long limit) {
this.original = Assert.notNull(iterator, "iterator");
this.limit = limit;
}
@Override
public boolean hasNext() {
return original.hasNext() && counter < limit;
}
@Override
public E next() {
counter++;
return original.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}