package siena.core; import java.util.Iterator; import siena.Query; /** * @author mandubian * * A Siena Iterable<Model> encapsulating a iteration per page * its Iterator<Model>... */ public class SienaIterablePerPage<T> implements Iterable<T> { /** * The wrapped <code>Query</code>. */ private Query<T> query; /** * The pageSize */ private int pageSize; /** * The wrapped <code>Iterable</code>. */ Iterable<T> iterable; public SienaIterablePerPage(Query<T> query, int pageSize) { this.query = query; this.pageSize = pageSize; this.iterable = query.paginate(this.pageSize).iter(); } public Iterator<T> iterator() { return new SienaIteratorPerPage(iterable.iterator()); } // only constructs the iterator with Class<V> in order to transmit the generic type T public class SienaIteratorPerPage implements Iterator<T> { private Iterator<T> iterator; private boolean hasNext = false; SienaIteratorPerPage(Iterator<T> iterator) { this.iterator = iterator; } @Override public boolean hasNext() { if(iterator.hasNext()) { hasNext = true; } else { iterable = query.nextPage().iter(); this.iterator = iterable.iterator(); hasNext = this.iterator.hasNext(); } return hasNext; } @Override public T next() { if(hasNext || iterator.hasNext()){ return iterator.next(); }else { iterable = query.nextPage().iter(); this.iterator = iterable.iterator(); return this.iterator.next(); } } @Override public void remove() { // doesn't delete row because it REALLY deletes row from DB!!! // need to think about it /*try { rs.deleteRow(); } catch (SQLException e) { throw new SienaException(e); }*/ } @Override protected void finalize() throws Throwable { query.resetData(); super.finalize(); } } @Override protected void finalize() throws Throwable { query.resetData(); super.finalize(); } }