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.FeatureWriter;
023:
024: /**
025: * An iterator wrapper for a FeatureWriter - for use with
026: * an AbstractFeatureCollection.
027: * <p>
028: * There is no reason modify this class, subclasses that wish
029: * to work with a custom iterator need just that - a custom iterator.
030: * <p>
031: * <p>
032: * The use of this class against a FeatureSource not backed by
033: * a Transaction may *really* cut into performance. Consider if
034: * you will the overhead involved in writing out each feature into
035: * a temporary file (when the user may not even modify anything).
036: * </p>
037: * @author jgarnett
038: * @since 2.1.RC0
039: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/main/src/main/java/org/geotools/data/store/FeatureWriterIterator.java $
040: */
041: final class FeatureWriterIterator implements Iterator {
042: FeatureWriter writer;
043:
044: public FeatureWriterIterator(FeatureWriter writer) {
045: this .writer = writer;
046: }
047:
048: public boolean hasNext() {
049: try {
050: if (writer == null) {
051: return false;
052: }
053: writer.write(); // write out any "changes" made
054: if (writer.hasNext()) {
055: return true;
056: } else {
057: close();
058: return false;
059: // auto close because we don't trust client
060: // code to call close
061: }
062: } catch (IOException e) {
063: close();
064: return false; // failure sounds like lack of next to me
065: }
066: }
067:
068: public Object next() {
069: if (writer == null) {
070: throw new NoSuchElementException("Iterator has been closed");
071: }
072: try {
073: return writer.next();
074: } catch (IOException io) {
075: NoSuchElementException problem = new NoSuchElementException(
076: "Could not obtain the next feature:" + io);
077: problem.initCause(io);
078: throw problem;
079: }
080: }
081:
082: public void remove() {
083: try {
084: writer.remove();
085: } catch (IOException problem) {
086: throw (IllegalStateException) new IllegalStateException(
087: "Could not remove feature").initCause(problem);
088: }
089: }
090:
091: /**
092: * This method only needs package visability as only AbstractFeatureCollection
093: * is trusted enough to call it.
094: */
095: void close() {
096: if (writer != null) {
097: try {
098: writer.close();
099: } catch (IOException e) {
100: // sorry but iterators die quitely in the night
101: }
102: writer = null;
103: }
104: }
105: };
|