view flys-artifacts/src/main/java/de/intevation/flys/utils/MapUtils.java @ 5193:fb9dcc68b9c2

Possible fix for flys/1202. Initial SQL statements can now be issued at connection creation.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 07 Mar 2013 17:39:25 +0100
parents 48b231a02d3a
children 9e11599266c8
line wrap: on
line source
package de.intevation.flys.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;
import org.hibernate.impl.SessionFactoryImpl;

import de.intevation.flys.backend.SessionFactoryProvider;


public class MapUtils
{
    private static final Logger logger = Logger.getLogger(MapUtils.class);

    public static final Pattern DB_URL_PATTERN =
        Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z_-]+)");

    public static final Pattern DB_PSQL_URL_PATTERN =
        Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z0-9_-]+)");

    /**
     * This method returns a connection string for databases used by
     * Mapserver's Mapfile.
     *
     * @return A connection string for Mapserver.
     */
    public static String getConnection() {
        SessionFactoryImpl sf = (SessionFactoryImpl)
        SessionFactoryProvider.getSessionFactory();

        String user = SessionFactoryProvider.getUser(sf);
        String pass = SessionFactoryProvider.getPass(sf);
        String url  = SessionFactoryProvider.getURL(sf);

        logger.debug("Parse connection url: " + url);

        Matcher m = DB_URL_PATTERN.matcher(url);
        if (!m.matches()) {
            logger.warn("Could not parse Connection string." +
                "Try to parse PostgreSQL string.");
            // maybe this is a PostgreSQL connection...
            return getPostgreSQLConnection();
        }

        logger.debug("Groups for connection string: " + m.groupCount());
        int groups = m.groupCount();


        if (logger.isDebugEnabled()) {
            for (int i = 0; i <= groups; i++) {
                logger.debug("Group " + i + ": " + m.group(i));
            }
        }

        String connection = null;

        if (FLYSUtils.isUsingOracle()) {
            if (groups < 3) {
                logger.warn("Could only partially parse connection string.");
                return null;
            }

            String host = m.group(2);
            String port = m.group(3);

            connection = user + "/" + pass + "@" + host;
        }
        else {
            if (groups < 4) {
                logger.warn("Could only partially parse connection string.");
                return null;
            }

            String host = m.group(2);
            String port = m.group(3);
            String db   = m.group(4);

            connection = createConnectionString(user, pass, host, db, port);
        }

        return connection;
    }

    public static String createConnectionString(
        String user,
        String pass,
        String host,
        String db,
        String port
    ) {
        StringBuilder sb = new StringBuilder();
        sb.append("dbname=").append(db);
        sb.append(" host='").append(host).append("'");
        sb.append(" user=").append(user);
        sb.append(" port=").append(port);
        // XXX: We need to escape this somehow.
        sb.append(" password='").append(pass).append("'");
        sb.append(" sslmode=disable");
        return sb.toString();
    }

    protected static String getPostgreSQLConnection() {
        SessionFactoryImpl sf = (SessionFactoryImpl)
        SessionFactoryProvider.getSessionFactory();

        String user = SessionFactoryProvider.getUser(sf);
        String pass = SessionFactoryProvider.getPass(sf);
        String url  = SessionFactoryProvider.getURL(sf);

        Matcher m = DB_PSQL_URL_PATTERN.matcher(url);
        if (!m.matches()) {
            logger.warn("Could not parse PostgreSQL Connection string.");
            return null;
        }

        int groups = m.groupCount();
        logger.debug("Groups for PostgreSQL connection string: " + groups);

        if (logger.isDebugEnabled()) {
            for (int i = 0; i <= groups; i++) {
                logger.debug("Group " + i + ": " + m.group(i));
            }
        }

        String connection = null;

        if (groups < 4) {
            logger.warn("Could only partially parse connection string.");
            return null;
        }

        String host = m.group(2);
        String port = m.group(3);
        String db   = m.group(4);

        connection = createConnectionString(user, pass, host, db, port);

        logger.debug("Created connection: '" + connection + "'");

        return connection;
    }

    public static String getConnectionType() {
        return FLYSUtils.isUsingOracle() ? "oraclespatial" : "postgis";
    }
}

http://dive4elements.wald.intevation.org