package play.modules.cream.ocm; import java.util.ArrayList; import java.util.List; import javax.jcr.NodeIterator; public class JcrQueryResult<T> { private final NodeIterator iterator; private final Class<T> entityClass; public JcrQueryResult(Class<T> clazz, NodeIterator nodeIterator) { this.iterator = nodeIterator; this.entityClass = clazz; } public long count() { return iterator.getSize(); } /** * Retrieve all results of the query * * @return A list of entities */ public List<T> fetch() { return JcrMapper.toList(entityClass, iterator, "*", -1); } /** * Retrieve results of the query * * @param max * Max results to fetch * @return A list of entities */ public List<T> fetch(int max) { // long count = iterator.getSize(); int c = 0; List<T> list = new ArrayList<T>(); while (iterator.hasNext() && c < max) { list.add(JcrMapper.fromNode(entityClass, iterator.nextNode())); c++; } return list; } /** * Retrieve a page of result * * @param page * Page number (start at 1) * @param length * (page length) * @return a list of entities */ public List<T> fetch(int page, int length) { List<T> list = new ArrayList<T>(); if (!isEmpty()) { int offset = (Math.max(page, 1) - 1) * length; if (offset > 0) { iterator.skip(offset); } int c = 0; while (iterator.hasNext() && c < length) { list.add(JcrMapper.fromNode(entityClass, iterator.nextNode())); c++; } } return list; } public T first() { return (iterator.hasNext()) ? JcrMapper.fromNode(entityClass, iterator.nextNode()) : null; } /** * Set the position to start * * @param position * Position of the first element * @return A new query */ public JcrQueryResult from(int position) { iterator.skip(position); return this; } public boolean isEmpty() { return iterator.getSize() < 1; } }