Package org.geotools.feature

Source Code of org.geotools.feature.FeatureReaderIterator

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2004-2008, Open Source Geospatial Foundation (OSGeo)
*
*    This library is free software; you can redistribute it and/or
*    modify it under the terms of the GNU Lesser General Public
*    License as published by the Free Software Foundation;
*    version 2.1 of the License.
*
*    This library is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*    Lesser General Public License for more details.
*
*/
package org.geotools.feature;

import java.io.Closeable;
import java.io.IOException;
import java.util.Iterator;
import java.util.NoSuchElementException;

import org.geotools.data.FeatureReader;
import org.opengis.feature.Feature;
import org.opengis.feature.type.FeatureType;

/**
* An iterator that wraps around a FeatureReader.
* <p>
* The Iterator's hasNext() will return false if the wrapped feature reader's hasNext method throws
* an exception. If next() throws an exception a NoSuchElementException will be thrown.
* </p>
* <p>
* {@link #close()} shall be called before disposing the iterator. Before propagating an exception
* from {@link #next()} or eating an exception from the underlying feature reader at
* {@link #hasNext()}, this iterator will auto-close.
* </p>
*
* @author jeichar
* @author Jody Garnett
* @author Gabriel Roldan
*
*
* @source $URL$
*/
public class FeatureReaderIterator<F extends Feature> implements Iterator<F>, Closeable {

    FeatureReader<? extends FeatureType, F> reader;

    public FeatureReaderIterator(FeatureReader<? extends FeatureType, F> reader) {
        this.reader = reader;
    }

    public boolean hasNext() {
        try {
            if (reader == null)
                return false;
            if (reader.hasNext()) {
                return true;
            } else {
                // auto close because we don't trust
                // client code to call closed :-)
                close();
                return false;
            }
        } catch (Exception e) {
            close();
            return false; // failure sounds like lack of next to me
        }
    }

    public F next() {
        if (reader == null) {
            throw new NoSuchElementException("Iterator has been closed");
        }
        try {
            return reader.next();
        } catch (IOException io) {
            close();
            NoSuchElementException problem = new NoSuchElementException(
                    "Could not obtain the next feature:" + io);
            problem.initCause(io);
            throw problem;
        } catch (org.opengis.feature.IllegalAttributeException create) {
            close();
            NoSuchElementException problem = new NoSuchElementException(
                    "Could not create the next feature:" + create);
            problem.initCause(create);
            throw problem;
        }
    }

    /** If this is a problem, a different iterator can be made based on FeatureWriter */
    public void remove() {
        throw new UnsupportedOperationException("Modification of contents is not supported");
    }

    /**
     * Close the reader please.
     */
    public void close() {
        if (reader != null) {
            try {
                reader.close();
            } catch (Exception e) {
                // sorry but iterators die quitely in the night
            }
            reader = null;
        }
    }
}
TOP

Related Classes of org.geotools.feature.FeatureReaderIterator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.