diff artifacts/src/main/java/org/dive4elements/river/utils/MapUtils.java @ 5838:5aa05a7a34b7

Rename modules to more fitting names.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 15:23:37 +0200
parents flys-artifacts/src/main/java/org/dive4elements/river/utils/MapUtils.java@bd047b71ab37
children 4897a58c8746
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/utils/MapUtils.java	Thu Apr 25 15:23:37 2013 +0200
@@ -0,0 +1,147 @@
+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 logger = Logger.getLogger(MapUtils.class);
+
+    public static final Pattern DB_URL_PATTERN =
+        Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([\\.a-zA-Z0-9_-]+)");
+
+    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 < 4) {
+                logger.warn("Could only partially parse connection string.");
+                return null;
+            }
+
+            String host = m.group(2);
+            String port = m.group(3);
+            String backend = m.group(4);
+            connection = user + "/" + pass + "@" + host + ":" + port + "/" + backend;
+        }
+        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