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)
{