package org.geotools.data.efeature; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.geotools.data.efeature.query.EFeatureFilter; /** * EFeature {@link TreeIterator} class. * <p> * This class implements a EObject Tree iterator that: * <ol> * <li>support lazy loading</li> * <li>support spatial filtering</li> * </ol> * </p> * * @author kengu * */ public class EFeatureIterator implements TreeIterator<EObject> { private static final long serialVersionUID = 1L; private EObject eNext = null; private EFeatureFilter where; private TreeIterator<EObject> it; public EFeatureIterator(TreeIterator<EObject> from, EFeatureFilter where) { // Initialize // this.where = where; // // Get EMF tree iterator // this.it = from; } @Override public boolean hasNext() { if (eNext == null || it.hasNext()) { eNext = next(); } return eNext != null; } public EObject peek() { // // Already matched by hasNext()? // if (eNext != null) { return eNext; } // Prepare // EObject eObject = null; // Loop until next match or end of collection // while (it.hasNext() && eObject == null) { // Get next object // eObject = it.next(); // // Prune? // if (where.shouldPrune(eObject)) { it.prune(); } // // Not a match? // if (!where.matches(eObject)) { eObject = null; } } // while // // Set as next // eNext = eObject; // // Finished // return eObject; } @Override public EObject next() { try { return eNext != null ? eNext : peek(); } finally { eNext = null; } } /** * Remove is not supported by this iterator */ @Override public void remove() { throw new UnsupportedOperationException(); } @Override public void prune() { it.prune(); } }