package com.bagri.xquery.saxon;
import java.util.Iterator;
import javax.xml.xquery.XQDataFactory;
import javax.xml.xquery.XQException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.saxon.expr.LastPositionFinder;
import net.sf.saxon.om.Item;
import net.sf.saxon.om.SequenceIterator;
import net.sf.saxon.trans.XPathException;
public class XQIterator implements Iterator {
private static final Logger logger = LoggerFactory.getLogger(XQIterator.class);
private XQDataFactory xqFactory;
private SequenceIterator iter;
private Item next;
public XQIterator(XQDataFactory xqFactory, SequenceIterator iter) {
this.xqFactory = xqFactory;
this.iter = iter;
try {
next = iter.next();
} catch (XPathException e) {
logger.error("<init>.error", e);
}
}
public int getFullSize() {
if ((iter.getProperties() & SequenceIterator.LAST_POSITION_FINDER) != 0) {
try {
return ((LastPositionFinder) iter).getLength();
} catch (XPathException ex) {
logger.error("getFullSize.error", ex);
}
}
if (next == null) {
return 0;
}
return -1; // ONE_OR_MORE
}
@Override
public boolean hasNext() {
return next != null;
}
@Override
public Object next() {
Item item = next;
try {
next = iter.next();
} catch (XPathException ex) {
// throw Runtime ex?
logger.error("next 1.error", ex);
}
if (item != null) {
try {
return SaxonUtils.itemToXQItem(item, xqFactory);
} catch (XPathException ex) {
logger.error("next 2.error", ex);
} catch (XQException ex) {
logger.error("next 3.error", ex);
}
}
return null;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Operation 'remove' is not supported");
}
}