All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wikibrain.spatial.dao.postgis.PostGISVersionChecker Maven / Gradle / Ivy

package org.wikibrain.spatial.dao.postgis;

import org.geotools.data.postgis.PostgisNGDataStoreFactory;
import org.geotools.jdbc.JDBCDataStore;
import org.geotools.jdbc.SQLDialect;
import org.wikibrain.core.dao.DaoException;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Shilad Sen
 */
public class PostGISVersionChecker extends PostgisNGDataStoreFactory {
    public static Logger LOG = LoggerFactory.getLogger(PostGISVersionChecker.class);

    public void verifyVersion(Map params) throws DaoException {
        JDBCDataStore dataStore = new JDBCDataStore();
        SQLDialect dialect = createSQLDialect(dataStore);
        dataStore.setSQLDialect(dialect);
        DataSource ds;
        try {
            ds = super.createDataSource(params, dialect);
        } catch (IOException e) {
            throw new DaoException(e);
        }

        LOG.info("checking for postgis extension");

        // First pass through loop may install extension. Second pass should work!
        for (int i = 0; i < 2; i++) {
            if (checkAndInstall(ds)) {
                return;
            }
        }
        throw new DaoException("Failed to create PostGIS extension for database. Is PostGIS 2.x installed?");

    }

    private boolean checkAndInstall(DataSource ds) throws DaoException {
        JDBCDataStore closer = new JDBCDataStore();
        // check we have postgis
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
        } catch (SQLException e) {
            throw new DaoException(e);
        }
        Statement st = null;
        try {
            st = cnx.createStatement();
        } catch (SQLException e) {
            closer.closeSafe(cnx);
            throw new DaoException(e);
        }
        try {
            ResultSet rs = st.executeQuery("select PostGIS_version()");
            rs.next();
            String version = rs.getString(1).trim();
            LOG.info("Found PostGIS version " + version);
            closer.closeSafe(rs);
            closer.closeSafe(st);
            closer.closeSafe(cnx);
            if (version.startsWith("2.")) {
                return true;
            } else {
                throw new DaoException("Invalid PostGIS version: " + version + ". Wikibrain requires 2.x");
            }
        } catch (SQLException e) {
            // Extension not available. Try to create it.
        }
        LOG.info("PostGIS extension not available for the database. Trying to create it.");

        try {
            st.execute("create extension postgis");
        } catch (SQLException e) {
            throw new DaoException("Failed to create PostGIS extension for database. Is PostGIS 2.x installed?");
        } finally {
            closer.closeSafe(st);
            closer.closeSafe(cnx);
        }
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy