package com.vividsolutions.jump.datastore.postgis; import java.sql.*; import org.postgresql.*; import com.vividsolutions.jump.feature.*; import com.vividsolutions.jump.datastore.*; import com.vividsolutions.jump.datastore.jdbc.*; /** * Implements the mapping between a result set and * a {@link FeatureSchema} and {@link Feature} set. * * This is a transient worker class, whose lifetime * should be no longer than the lifetime of the * provided ResultSet */ public class PostgisResultSetConverter { private ResultSet rs; private FeatureSchema featureSchema; private int geometryColIndex = -1; private ValueConverter[] mapper; private PostgisValueConverterFactory odm; private boolean isInitialized = false; public PostgisResultSetConverter(Connection conn, ResultSet rs) { odm = new PostgisValueConverterFactory(conn); this.rs = rs; } public FeatureSchema getFeatureSchema() throws SQLException { init(); return featureSchema; } public Feature getFeature() throws Exception { init(); Feature f = new BasicFeature(featureSchema); for (int i = 0; i < mapper.length; i++) { f.setAttribute(i, mapper[i].getValue(rs, i + 1)); } return f; } private void init() throws SQLException { if (isInitialized) return; isInitialized = true; ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); //String[] columnNames = new String[numberOfColumns]; //String[] columnTypeNames = new String[numberOfColumns]; //int[] columnPositions = new int[numberOfColumns]; mapper = new ValueConverter[numberOfColumns]; featureSchema = new FeatureSchema(); for (int i = 0; i < numberOfColumns; i++) { mapper[i] = odm.getConverter(rsmd, i + 1); String colName = rsmd.getColumnName(i + 1); // only handles one geometry col for now [MD ?] // Convert the first geometry into AttributeType.GEOMETRY and the following ones // into AttributeType.STRINGs [mmichaud 2007-05-13] if (mapper[i].getType() == AttributeType.GEOMETRY) { if (featureSchema.getGeometryIndex() == -1) { // fixed by mmichaud using a patch from jaakko [2008-05-21] : // use colName instead of "GEOMETRY" for attribute name featureSchema.addAttribute(colName, mapper[i].getType()); } else { mapper[i] = ValueConverterFactory.STRING_MAPPER; featureSchema.addAttribute(colName, AttributeType.STRING); } } else { featureSchema.addAttribute(colName, mapper[i].getType()); } } } }