/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2003-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.oracle;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Logger;
import oracle.sql.ARRAY;
import oracle.sql.Datum;
import oracle.sql.STRUCT;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.DataTestCase;
import org.geotools.data.jdbc.ConnectionPool;
import org.geotools.data.jdbc.ConnectionPoolManager;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.opengis.feature.type.FeatureType;
import org.opengis.feature.type.GeometryDescriptor;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.vividsolutions.jts.geom.Envelope;
/**
* This class provides a quick test of OracleDataStore.
* <p>
* We are using this class to test the internal workings of the
* OracleDataStore. To test the public "normal" api please
* refer to OracleDataStoreTest.
* </p>
* <p>
* Several of these tests bay be "X"ed out, in such cases
* the tests were serving as a scratch pad as we learned where oracle
* keeps everything.
* </p>
* @author Jody Garnett, Refractions Research
*
* @source $URL$
*/
public class QuickOracleOnlineTest extends DataTestCase {
/** The logger for the filter module. */
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geotools.data.postgis");
OracleDataStore data;
ConnectionPool pool;
private Connection conn;
/**
* Constructor for MemoryDataStoreTest.
*
* @param test
*
* @throws AssertionError DOCUMENT ME!
*/
public QuickOracleOnlineTest(String test) {
super(test);
}
protected void setUp() throws Exception {
super.setUp();
Properties resource = new Properties();
resource.load(this.getClass().getResourceAsStream("remote.properties"));
data = (OracleDataStore) DataStoreFinder.getDataStore(resource);
//BasicFIDMapper basic = new BasicFIDMapper("tid", 255, false);
//TypedFIDMapper typed = new TypedFIDMapper( basic, "trim_utm10");
//data.setFIDMapper("trim_utm10", typed );
}
boolean create = true;
protected void reset() throws Exception {
if( conn == null ) return;
if( !create ) return;
Statement st = conn.createStatement();
if( st.executeQuery("SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = 'ORA_TEST_LINES'").next()){
try {
st.execute("DROP TABLE ORA_TEST_LINES");
st.executeUpdate("DELETE FROM user_sdo_geom_metadata WHERE TABLE_NAME='ORA_TEST_LINES'");
}
catch( SQLException noPrevRun){
noPrevRun.printStackTrace();
}
}
try {
st.execute( "CREATE TABLE ORA_TEST_LINES ("+
" name VARCHAR(255),"+
" intval NUMBER,"+
" id NUMBER PRIMARY KEY,"+
" shape MDSYS.SDO_GEOMETRY"+
")");
st.execute( "INSERT INTO USER_SDO_GEOM_METADATA VALUES ("+
" 'ORA_TEST_LINES',"+
" 'SHAPE',"+
" MDSYS.SDO_DIM_ARRAY("+
" MDSYS.SDO_DIM_ELEMENT('X',-180,180,0.005),"+
" MDSYS.SDO_DIM_ELEMENT('Y',-90,90,0.005)"+
" ),"+
" 82465"+
")");
st.execute("create index test_line_index on ORA_TEST_LINES(SHAPE) INDEXTYPE IS MDSYS.SPATIAL_INDEX");
//
// If we ever need data we can do it here!
// but right now we are just hammering Schema
}
catch (SQLException fine){
fine.printStackTrace();
}
create = false;
}
protected void tearDown() throws Exception {
if( conn != null ) conn.close();
if( pool != null ) pool.close();
ConnectionPoolManager manager = ConnectionPoolManager.getInstance();
manager.closeAll();
data.dispose();
conn = null;
pool = null;
data = null;
super.tearDown();
// tests with oracle xe fail without these... it seems the oracle poolable connections
// are not closed right away even if I traced the dbcp code and it actually closes
// the connections...
System.gc(); System.gc(); System.gc();
}
public void testSRIDLookup() throws Exception {
if( conn == null ) return;
Statement st = conn.createStatement();
st.execute("select cs_name, wktext from cs_srs where srid = 82465");
ResultSet set = st.getResultSet();
ResultSetMetaData meta = set.getMetaData();
assertEquals( 2, meta.getColumnCount() );
assertTrue( set.next() );
String name = set.getString(1);
String wkt = set.getString(2);
assertEquals( "MGA94 Zone 52", name );
assertTrue( wkt.indexOf("Geodetic Datum of Australia 1994") != -1 );
//System.out.println( wkt );
CoordinateReferenceSystem crs = CRS.parseWKT( wkt );
//System.out.println( crs );
assertNotNull( crs );
}
public void testMetadataSRID() throws Exception {
if( conn == null ) return;
Statement st = conn.createStatement();
st.execute("SELECT srid FROM USER_SDO_GEOM_METADATA where TABLE_NAME = 'ORA_TEST_LINES'");
ResultSet set = st.getResultSet();
assertTrue( set.next() );
int srid = set.getInt( 1 );
assertEquals( 82465, srid );
}
public void testMetadataDIMInfo() throws Exception {
if( conn == null ) return;
Statement st = conn.createStatement();
st.execute("SELECT srid,diminfo FROM USER_SDO_GEOM_METADATA where TABLE_NAME = 'ORA_TEST_LINES'");
ResultSet set = st.getResultSet();
assertTrue( set.next() );
int srid = set.getInt( 1 );
CoordinateReferenceSystem crs = data.determineCRS( srid );
ARRAY array= (ARRAY) set.getObject(2);
Datum data[] = array.getOracleArray();
double minx = Double.NaN;
double miny = Double.NaN;
double maxx = Double.NaN;
double maxy = Double.NaN;
for( int i =0; i<data.length; i++){
Datum datum = data[i];
System.out.println( datum.getClass() );
STRUCT diminfo = (STRUCT) datum;
Datum info[] = diminfo.getOracleAttributes();
String ord = info[0].stringValue();
double min = info[1].doubleValue();
double max = info[2].doubleValue();
double precision = info[3].doubleValue(); // TODO use this for accurate JTS PercisionModel!
if( "X".equalsIgnoreCase( ord )){
minx = min; maxx= max;
}
if( "Y".equalsIgnoreCase( ord )){
miny = min; maxy= max;
}
}
Envelope extent = new Envelope(minx,maxx, miny,maxy );
ReferencedEnvelope ref = new ReferencedEnvelope( extent, crs );
assertFalse( ref.isNull() );
}
public void testDSSridMethod() throws Exception {
if( conn == null ) return;
int srid = data.determineSRID("ORA_TEST_LINES","SHAPE");
assertEquals( 82465, srid );
CoordinateReferenceSystem crs = data.determineCRS( srid );
assertNotNull( crs );
}
public void testGeometryCRS() throws Exception {
if( conn == null ) return;
FeatureType schema = data.getSchema("ORA_TEST_LINES");
GeometryDescriptor geom = schema.getGeometryDescriptor();
assertNotNull( geom.getCoordinateReferenceSystem() );
assertEquals( "SHAPE", geom.getLocalName() );
}
}