view artifacts/src/main/java/org/dive4elements/river/utils/MapUtils.java @ 9671:9cfc495a9f40 3.2.x

Add minimal test coverage for MapServer connection generation
author Tom Gottfried <tom@intevation.de>
date Fri, 22 May 2020 19:45:08 +0200
parents 07d854c325d8
children b70b1bc0eece
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.utils;

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

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

import org.dive4elements.river.backend.SessionFactoryProvider;


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

    public static final Pattern DB_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);

        return getConnection(user, pass, url);
    }

    public static String getConnection(String user, String pass, String url) {
        log.debug("Parse connection url: " + url);

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

        int groups = m.groupCount();

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

        String connection = null;

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

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

        if (url.startsWith("jdbc:oracle:")) {
            connection = user + "/" + pass
                + "@" + host + ":" + port + "/" + db;
        }
        else {
            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();
    }

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

http://dive4elements.wald.intevation.org