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: * Created on 7-apr-2004
017: */
018: package org.geotools.data.jdbc;
019:
020: import java.io.IOException;
021: import java.sql.SQLException;
022:
023: import org.geotools.data.FeatureReader;
024: import org.geotools.data.jdbc.fidmapper.FIDMapper;
025: import org.geotools.feature.Feature;
026: import org.geotools.feature.FeatureType;
027: import org.geotools.feature.GeometryAttributeType;
028: import org.geotools.feature.IllegalAttributeException;
029:
030: import com.vividsolutions.jts.geom.Geometry;
031:
032: /**
033: * JDBCDataStore specific implementation of the FeatureReader interface
034: *
035: * @author aaime
036: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/jdbc/src/main/java/org/geotools/data/jdbc/JDBCFeatureReader.java $
037: */
038: public class JDBCFeatureReader implements FeatureReader {
039: FeatureType featureType;
040: QueryData queryData;
041: Object[] attributes;
042: Object[] fidAttributes;
043:
044: /**
045: * Creates a new JDBCFeatureReader object.
046: *
047: * @param queryData
048: *
049: * @throws IOException
050: */
051: public JDBCFeatureReader(QueryData queryData) throws IOException {
052: this .queryData = queryData;
053: attributes = new Object[queryData.getAttributeHandlers().length];
054: fidAttributes = new Object[queryData.getMapper()
055: .getColumnCount()];
056: }
057:
058: /**
059: * @see org.geotools.data.FeatureReader#close()
060: */
061: public void close() throws IOException {
062: close(null);
063: }
064:
065: void close(SQLException sqlException) {
066: queryData.close(sqlException);
067: }
068:
069: /**
070: * @see org.geotools.data.FeatureReader#hasNext()
071: */
072: public boolean hasNext() throws IOException {
073: if (queryData.isClosed()) {
074: throw new IOException("Reader is closed");
075: }
076:
077: return queryData.hasNext();
078: }
079:
080: /**
081: * @see org.geotools.data.FeatureReader#next()
082: */
083: public Feature next() throws IllegalAttributeException, IOException {
084: if (queryData.isClosed()) {
085: throw new IOException("The feature reader has been closed");
086: }
087:
088: return readFeature();
089: }
090:
091: /**
092: * Really reads the feature from the QueryData object
093: * @throws IllegalAttributeException
094: * @throws IOException
095: */
096: private Feature readFeature() throws IllegalAttributeException,
097: IOException {
098: queryData.next();
099:
100: for (int i = 0; i < fidAttributes.length; i++) {
101: fidAttributes[i] = queryData.readFidColumn(i);
102: }
103:
104: FIDMapper mapper = queryData.getMapper();
105: String fid = mapper.getID(fidAttributes);
106:
107: for (int i = 0; i < attributes.length; i++) {
108: Object attribute = queryData.read(i);
109:
110: //JD: check for a coordinate system, if present on the type, set on the geometry
111: // I know this is pretty loose, but its better then nothing
112: if (attribute instanceof Geometry
113: && queryData.getFeatureType().getAttributeType(i) instanceof GeometryAttributeType) {
114: Geometry geometry = (Geometry) attribute;
115: GeometryAttributeType geometryType = (GeometryAttributeType) queryData
116: .getFeatureType().getAttributeType(i);
117:
118: if (geometryType.getCoordinateSystem() != null) {
119: geometry.setUserData(geometryType
120: .getCoordinateSystem());
121: }
122: }
123:
124: attributes[i] = attribute;
125: }
126:
127: return queryData.getFeatureType().create(attributes, fid);
128: }
129:
130: /**
131: * @see org.geotools.data.FeatureReader#getFeatureType()
132: */
133: public FeatureType getFeatureType() {
134: return queryData.getFeatureType();
135: }
136: }
|