/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2006-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.data.postgis; import java.sql.Statement; import org.geotools.data.DefaultQuery; import org.geotools.data.FeatureReader; import org.geotools.data.FeatureWriter; import org.geotools.data.Query; import org.geotools.data.Transaction; import org.geotools.data.postgis.fidmapper.PostgisFIDMapperFactory; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; /** * Hits a PostGIS database with a feature reader. * * @author Cory Horner, Refractions Research * * * * @source $URL$ */ public class PostgisFeatureReaderOnlineTest extends AbstractPostgisOnlineTestCase { protected void createTables(Statement st) throws Exception { createTable1(st); createTable2(st); createTable3(st); //advance the sequence to larger values st.execute("SELECT setval('"+table1+"_fid_seq', 2000000000);"); st.execute("SELECT setval('"+table3+"_fid_seq', 6000000000);"); //put some data in there String[] keys = new String[] {"name", "the_geom"}; String[] values = new String[] {"'f1'", "GeomFromText('POINT(1294523.17592358 469418.897140173)',4326)"}; addFeatureManual(table1, keys, values); values[0] = "'f2'"; values[1] = "GeomFromText('POINT(1281485.7108 459444.7332)',4326)"; addFeatureManual(table2, keys, values); values[0] = "'f3'"; values[1] = "GeomFromText('POINT(1271185.71084336 454376.774827237)',4326)"; addFeatureManual(table3, keys, values); } protected void setupGeometryColumns(Statement st) throws Exception { String preSql = "INSERT INTO geometry_columns (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, type) VALUES ('',"; String postSql = ", 'the_geom', 2, 4326, 'POINT')"; //table1: no entry //table2: geometry_columns f_table_schema = '' String sql = preSql + "'', '" + table2 + "'" + postSql; st.execute(sql); // table3: geometry_columns f_table_schema = 'public' sql = preSql + "'public', '" + table3 + "'" + postSql; st.execute(sql); } /** * Make sure that both large integer and long values are acceptable and valid. * @throws Exception */ public void testReadFid() throws Exception { if ( ((PostgisFIDMapperFactory) ds.getFIDMapperFactory() ).isReturningTypedFIDMapper() ) { assertEquals(table1+".2000000001",attemptRead(table1)); //int is signed :( assertEquals(table3+".6000000001",attemptRead(table3)); } else { assertEquals("2000000001",attemptRead(table1)); //int is signed :( assertEquals("6000000001",attemptRead(table3)); } } /** * Adds a feature so we have something to read. */ protected boolean addFeature(String table) throws Exception { FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(table, Transaction.AUTO_COMMIT); SimpleFeature feature; while (writer.hasNext()) { feature = (SimpleFeature) writer.next(); } feature = (SimpleFeature) writer.next(); feature.setAttribute(0, "test"); //feature.setAttribute(1, val); writer.write(); String id = feature.getID(); return id != null; } protected void addFeatureManual(String table, String[] keys, String[] values) throws Exception { Statement st = ds.getDataSource().getConnection().createStatement(); StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO \""); sql.append(table); sql.append("\" ("); for (int i = 0; i < keys.length; i++) { if (i > 0) { sql.append(","); } sql.append(keys[i]); } sql.append(") VALUES ("); for (int i = 0; i < values.length; i++) { if (i > 0) { sql.append(","); } sql.append(values[i]); } sql.append(")"); st.execute(sql.toString()); st.close(); } protected String attemptRead(String table) throws Exception { //addFeature(table); Query query = new DefaultQuery(table); FeatureReader<SimpleFeatureType, SimpleFeature> fr = ds.getFeatureReader(query, Transaction.AUTO_COMMIT); assertTrue(fr.hasNext()); SimpleFeature feature = fr.next(); String id = feature.getID(); fr.close(); return id; } public void testGetSchema() throws Exception { //test that getSchema works when a entry does not exist in the geometry_columns table SimpleFeatureType schema; schema = ds.getSchema(table1); assertNotNull(schema); //test that getSchema works when geometry_columns f_table_schema = public schema = ds.getSchema(table2); assertNotNull(schema); //test that getSchema works when geometry_columns f_table_schema = '' schema = ds.getSchema(table3); assertNotNull(schema); } }