Package org.geotools.data.postgis

Source Code of org.geotools.data.postgis.PostgisNGCreateDatabaseTest

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2002-2009, 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 static org.geotools.data.postgis.PostgisNGDataStoreFactory.*;
import static org.geotools.jdbc.JDBCDataStoreFactory.DATABASE;
import static org.geotools.jdbc.JDBCDataStoreFactory.DBTYPE;
import static org.geotools.jdbc.JDBCDataStoreFactory.HOST;
import static org.geotools.jdbc.JDBCDataStoreFactory.PASSWD;
import static org.geotools.jdbc.JDBCDataStoreFactory.USER;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.geotools.data.DataUtilities;
import org.geotools.feature.SchemaException;
import org.geotools.jdbc.JDBCDataStore;
import org.geotools.test.OnlineTestCase;

/**
*
*
* @source $URL$
*/
public class PostgisNGCreateDatabaseTest extends OnlineTestCase {

    private static final String CREATE_DROP_TESTDB = "gt2_create_drop_testdb";

    @Override
    protected boolean isOnline() throws Exception {
        PostgisNGDataStoreFactory factory =  new PostgisNGDataStoreFactory();
        JDBCDataStore closer = new JDBCDataStore();
        Class.forName(factory.getDriverClassName());
       
        // get host and port
        String host = fixture.getProperty(HOST.key);
        String port = fixture.getProperty(PORT.key);
        String user = fixture.getProperty(USER.key);
        String password = fixture.getProperty(PASSWD.key);
        String url = "jdbc:postgresql" + "://" + host + ":" + port + "/template1";
       
        Connection cx = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            cx = DriverManager.getConnection(url, user, password);
            st = cx.createStatement();
            rs = st.executeQuery("select rolcreatedb from pg_authid where rolname = '" + user + "'");
            boolean canCreate = false;
            if(rs.next()) {
                canCreate = rs.getBoolean(1);
            }
            rs.close();
           
            if(!canCreate) {
                System.out.println("User " + user + " has no database creation options, skipping test");
                return false;
            }
           
            // creation options available, let's check if we have the postgis extension available then
            rs = st.executeQuery("select * from pg_available_extensions where name = 'postgis'");
            boolean hasPostgisExtension = false;
            if(rs.next()) {
                hasPostgisExtension = true;
            }
            rs.close();
           
            if(!hasPostgisExtension) {
                System.out.println("This version of postgresql has no postgis extension available (as in, one that can be used by the \"create extension\" command, skipping it");
                return false;
            }
           
            // drop the database if available
            rs = st.executeQuery("select * from pg_database where datname = 'create_drop_testdb'");
            boolean databaseExists = rs.next();
            rs.close();
            if(databaseExists) {
                st.execute("drop database " + CREATE_DROP_TESTDB);
            }
           
            return true;
        } catch(SQLException e) {
            System.out.println("Failed to check if the user has database creation privileges and postgis is an available extension");
            e.printStackTrace();
            return false;
        } finally {
            closer.closeSafe(rs);
            closer.closeSafe(cx);
            closer.closeSafe(st);
        }
    }
   
    public void testCreateDrop() throws IOException, SQLException, SchemaException {
        PostgisNGDataStoreFactory factory =  new PostgisNGDataStoreFactory();
        Properties db = fixture;
       
        Map<String, Object> params = new HashMap<String, Object>();
        params.put(HOST.key, db.getProperty(HOST.key));
        params.put(DATABASE.key, CREATE_DROP_TESTDB);
        params.put(PORT.key, db.getProperty(PORT.key));
        params.put(USER.key, db.getProperty(USER.key));
        params.put(PASSWD.key, db.getProperty(PASSWD.key));
        params.put(DBTYPE.key, "postgis");
        params.put(PostgisNGDataStoreFactory.CREATE_DB_IF_MISSING.key, true);

        // we can work with it
        assertTrue(factory.canProcess(params));
       
        // force database creation and check the store functions
        JDBCDataStore store = factory.createDataStore(params);
        assertNotNull(store);
        store.createSchema(DataUtilities.createType("test", "id:String,polygonProperty:Polygon:srid=32615"));
        store.getSchema("test");
       
        // now disconnect and drop
        store.dispose();
        factory.dropDatabase(params);
       
        // try to connect again, it must fail
        params.remove(PostgisNGDataStoreFactory.CREATE_DB_IF_MISSING.key);
        try {
            store = factory.createDataStore(params);
            store.getTypeNames();
            fail("This one should have failed, the database has just been dropped");
        } catch(Exception e) {
            // fine, it's what we expected
        }
       
    }

    @Override
    protected String getFixtureId() {
        return "postgis-createdrop";
    }

}
TOP

Related Classes of org.geotools.data.postgis.PostgisNGCreateDatabaseTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.