Index: jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectIterator.java =================================================================== --- jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectIterator.java (revision 697068) +++ jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectIterator.java Fri Sep 19 19:32:49 MSD 2008 @@ -33,10 +33,7 @@ /** * ObjectIterator is a wrapper class for JCR NodeIterator, which returns - * mapped objects. Note, though, that this iterator may not return the same - * number of objects as the underlying node iterator as not all nodes may - * successfully be mapped to objects. Any problems mapping nodes to objects are - * logged at INFO level. + * mapped objects. *

* This Iterator implementation does not support removing elements, therefore * the {@link #remove()} method throws a UnsupportOperationException. @@ -46,17 +43,12 @@ */ public class ObjectIterator implements RangeIterator { - - private static final Log log = LogFactory.getLog(ObjectIterator.class); - private NodeIterator nodeIterator; private Session session; private ObjectConverter objectConverter; - private Object nextResult; - /** * Constructor * @@ -69,63 +61,56 @@ nodeIterator = iterator; objectConverter = converter; this.session = session; - - // get first result - seek(); } - + /** + * @see java.util.Iterator#hasNext() + */ public boolean hasNext() { - return nextResult != null; + return nodeIterator.hasNext(); } + /** + * @see java.util.Iterator#next() + */ public Object next() { - if (nextResult == null) { - throw new NoSuchElementException(); - } - - Object result = nextResult; - seek(); - return result; - } - - - public void remove() { - throw new UnsupportedOperationException(); - } - - - private void seek() { - while (nodeIterator.hasNext()) { - try { - Node node = nodeIterator.nextNode(); + try { + Node node = nodeIterator.nextNode(); - Object value = objectConverter.getObject(session, node.getPath()); - if (value != null) { - nextResult = value; - return; - } + return objectConverter.getObject(session, node.getPath()); - } catch (RepositoryException re) { + } catch (RepositoryException re) { - log.info("Repository access issue trying to map node to an object", re); - } catch (ObjectContentManagerException ocme) { - log.info("Mapping Failure", ocme); - } catch (Throwable t) { - log.info("Unexpected Problem while trying to map a node to an object", t); + throw new org.apache.jackrabbit.ocm.exception.RepositoryException("Repository access issue trying to map node to an object", re); - } - } + } + } - // no more results - nextResult = null; + /** + * This Iterator implementation does not support removing elements, therefore + * this method always throws a UnsupportOperationException. + * + * @see java.util.Iterator#next() + */ + public void remove() { + throw new UnsupportedOperationException(); } + + /** + * @see javax.jcr.RangeIterator#skip(long) + */ public void skip(long l) { nodeIterator.skip(l); } + /** + * @see javax.jcr.RangeIterator#getSize() + */ public long getSize() { return nodeIterator.getSize(); } + /** + * @see javax.jcr.RangeIterator#getPosition() + */ public long getPosition() { return nodeIterator.getPosition(); } Index: jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/AnnotationIteratorQueryTest.java =================================================================== --- jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/AnnotationIteratorQueryTest.java (revision 697068) +++ jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/query/AnnotationIteratorQueryTest.java Fri Sep 19 19:27:56 MSD 2008 @@ -34,6 +34,7 @@ import org.apache.jackrabbit.ocm.exception.JcrMappingException; import org.apache.jackrabbit.ocm.manager.ObjectContentManager; import org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl; +import org.apache.jackrabbit.ocm.manager.impl.ObjectIterator; import org.apache.jackrabbit.ocm.query.Filter; import org.apache.jackrabbit.ocm.query.Query; import org.apache.jackrabbit.ocm.query.QueryManager; @@ -89,22 +90,32 @@ // No scope QueryManager queryManager = this.getQueryManager(); Filter filter = queryManager.createFilter(Page.class); - Query query = queryManager.createQuery(filter); + Query query = queryManager.createQuery(filter); + // we need this to be sure about objects order in the iterator test + query.addOrderByAscending("title"); ObjectContentManager ocm = this.getObjectContentManager(); long start = System.currentTimeMillis(); - Iterator iterator = ocm.getObjectIterator(query); - System.out.println("getObject takes : " + (System.currentTimeMillis() - start)); + ObjectIterator iterator = (ObjectIterator) ocm.getObjectIterator(query); + System.out.println("getObjectIterator takes : " + (System.currentTimeMillis() - start)); - + start = System.currentTimeMillis(); Collection result = ocm.getObjects(query); System.out.println("getObject takes : " + (System.currentTimeMillis() - start)); - start = System.currentTimeMillis(); - iterator = ocm.getObjectIterator(query); - System.out.println("getObject takes : " + (System.currentTimeMillis() - start)); - + start = System.currentTimeMillis(); + iterator = (ObjectIterator) ocm.getObjectIterator(query); + System.out.println("getObjectIterator takes : " + (System.currentTimeMillis() - start)); + assertEquals("wrong results count", 4, iterator.getSize()); + assertEquals("wrong initial position", 0, iterator.getPosition()); + assertTrue("no objects returned", iterator.hasNext()); + Page page = (Page) iterator.next(); + assertEquals("wrong first result", "Page 1 Title", page.getTitle()); + iterator.skip(1); + assertEquals("wrong position after skip", 2, iterator.getPosition()); + page = (Page) iterator.next(); + assertEquals("wrong third result", "Page 3 Title", page.getTitle()); } catch (Exception e) {