package siena.gae; import java.util.Iterator; import siena.core.async.QueryAsync; /** * @author mandubian * * A Siena Iterable<Model> encapsulating a iteration per page * its Iterator<Model>... */ public class SienaIterableAsyncPerPage<T> implements Iterable<T> { /** * The wrapped <code>Query</code>. */ private QueryAsync<T> query; /** * The pageSize */ //private int pageSize; /** * The wrapped <code>Iterable</code>. */ Iterable<T> iterable; public SienaIterableAsyncPerPage(QueryAsync<T> query, int pageSize, Iterable<T> iterable) { this.query = query; //this.pageSize = pageSize; this.iterable = iterable; } public Iterator<T> iterator() { return new SienaIteratorAsyncPerPage(iterable.iterator()); } // only constructs the iterator with Class<V> in order to transmit the generic type T public class SienaIteratorAsyncPerPage implements Iterator<T> { private Iterator<T> iterator; private boolean hasNext = false; SienaIteratorAsyncPerPage(Iterator<T> iterator) { this.iterator = iterator; } @Override public boolean hasNext() { if(iterator.hasNext()) { hasNext = true; } else { this.iterator = query.nextPage().iter().get().iterator(); hasNext = this.iterator.hasNext(); } return hasNext; } @Override public T next() { if(hasNext || iterator.hasNext()){ return iterator.next(); }else { this.iterator = query.nextPage().iter().get().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.release(); super.finalize(); } } @Override protected void finalize() throws Throwable { query.release(); super.finalize(); } }