001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2004-2006, GeoTools Project Managment Committee (PMC)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation;
009: * version 2.1 of the License.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: */
016: package org.geotools.data.store;
017:
018: import java.io.IOException;
019: import java.util.Iterator;
020: import java.util.NoSuchElementException;
021:
022: import org.geotools.data.FeatureReader;
023: import org.geotools.feature.IllegalAttributeException;
024:
025: /**
026: * An iterator wrapper for a FeatureReader - for use with
027: * an AbstractFeatureCollection.
028: * <p>
029: * There is no reason modify this class, subclasses that wish
030: * to work with a custom iterator need just that - a custom iterator.
031: * <p>
032: * @author jgarnett
033: * @since 2.1.RC0
034: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/main/src/main/java/org/geotools/data/store/FeatureReaderIterator.java $
035: */
036: final class FeatureReaderIterator implements Iterator {
037: FeatureReader reader;
038:
039: public FeatureReaderIterator(FeatureReader reader) {
040: this .reader = reader;
041: }
042:
043: public boolean hasNext() {
044: try {
045: if (reader == null)
046: return false;
047: if (reader.hasNext()) {
048: return true;
049: } else {
050: // auto close because we don't trust
051: // client code to call closed :-)
052: close();
053: return false;
054: }
055: } catch (IOException e) {
056: close();
057: return false; // failure sounds like lack of next to me
058: }
059: }
060:
061: public Object next() {
062: if (reader == null) {
063: throw new NoSuchElementException("Iterator has been closed");
064: }
065: try {
066: return reader.next();
067: } catch (IOException io) {
068: close();
069: NoSuchElementException problem = new NoSuchElementException(
070: "Could not obtain the next feature:" + io);
071: problem.initCause(io);
072: throw problem;
073: } catch (IllegalAttributeException create) {
074: close();
075: NoSuchElementException problem = new NoSuchElementException(
076: "Could not create the next feature:" + create);
077: problem.initCause(create);
078: throw problem;
079: }
080: }
081:
082: /** If this is a problem, a different iterator can be made based on FeatureWriter */
083: public void remove() {
084: throw new UnsupportedOperationException(
085: "Modification of contents is not supported");
086: }
087:
088: /**
089: * Close the reader please.
090: */
091: public void close() {
092: if (reader != null) {
093: try {
094: reader.close();
095: } catch (IOException e) {
096: // sorry but iterators die quitely in the night
097: }
098: reader = null;
099: }
100: }
101: };
|