package org.vfny.geoserver.global;

import java.util.Iterator;
import java.util.NoSuchElementException;

import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.geotools.feature.collection.DecoratingFeatureCollection;
import org.opengis.feature.Feature;
import org.opengis.feature.type.FeatureType;

public class PrefetchingFeatureCollection<T extends FeatureType, F extends Feature> extends DecoratingFeatureCollection<T, F> {

    private int queueDepth;

    public PrefetchingFeatureCollection(FeatureCollection<T, F> delegate, int queueDepth) {
        super(delegate);
        this.queueDepth = queueDepth;
    }

    @Override
    public FeatureIterator<F> features() {
        return new PrefetchingFeatureIterator<F>(delegate, queueDepth);
    }
    
    @Override
    public Iterator iterator() {
        return new PrefetchingIterator(delegate, queueDepth);
    }
    
    @Override
    public void close(FeatureIterator<F> close) {
        close.close();
    }
    
    @Override
    public void close(Iterator<F> close) {
        ((PrefetchingIterator) close).close();
    }
    
    
    static class PrefetchingFeatureIterator<F extends Feature> implements FeatureIterator<F> {
        PrefetchingIterator iter;
        
        public PrefetchingFeatureIterator(FeatureCollection collection, int queueDepth) {
            this.iter = new PrefetchingIterator(collection, queueDepth);
        }

        public void close() {
            iter.close();
        }

        public boolean hasNext() {
            return iter.hasNext();
        }

        public F next() throws NoSuchElementException {
            return (F) iter.next();
        }
        
    }

}
