package siena.gae;
import java.lang.reflect.Field;
import java.util.Iterator;
import siena.ClassInfo;
import siena.core.async.QueryAsync;
import siena.core.options.QueryOptionPage;
import com.google.appengine.api.datastore.Entity;
/**
* @author mandubian <pascal.voitot@mandubian.org>
*
* A Siena Iterable<Model> encapsulating a GAE Iterable<Entity> with its Iterator in asynchronous mode<Model>...
*/
public class GaeSienaIterableAsync<Model> implements Iterable<Model> {
Iterable<Entity> gaeIterable;
QueryAsync<Model> query;
GaePersistenceManagerAsync pm;
GaeSienaIterableAsync(GaePersistenceManagerAsync pm, Iterable<Entity> gaeIterable, QueryAsync<Model> query) {
this.gaeIterable = gaeIterable;
this.query = query;
this.pm = pm;
}
public Iterator<Model> iterator() {
return new SienaGaeIteratorAsync<Model>(query, gaeIterable);
}
public class SienaGaeIteratorAsync<T> implements Iterator<T> {
Field id;
QueryAsync<T> query;
Iterator<Entity> gaeIterator;
SienaGaeIteratorAsync(QueryAsync<T> query, Iterable<Entity> gaeIterable) {
this.query = query;
this.id = ClassInfo.getIdField(query.getQueriedClass());
this.gaeIterator = gaeIterable.iterator();
// if paginating and 0 results then no more data
QueryOptionPage pag = (QueryOptionPage)query.option(QueryOptionPage.ID);
QueryOptionGaeContext gaeCtx = (QueryOptionGaeContext)query.option(QueryOptionGaeContext.ID);
if(pag.isPaginating() && !gaeIterator.hasNext()){
gaeCtx.noMoreDataAfter = true;
}
}
public boolean hasNext() {
return gaeIterator.hasNext();
}
public T next() {
Entity entity = gaeIterator.next();
T obj = pm.map(query, entity);
return obj;
}
public void remove() {
gaeIterator.remove();
}
}
}