Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/utils/MapUtils.java @ 9751:308a0d822d18 3.2.x
Keep configuration and data in distinct directories
This allows having distinct volumes for configuration and data
(artifact database, generated mapfiles and shapefiles, etc.).
While at it, cleanup MapServer configuration a little bit.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Tue, 11 Oct 2022 11:42:09 +0200 |
parents | 0a5239a1e46e |
children |
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013, 2020 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.net.URI; import java.net.URISyntaxException; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import org.hibernate.impl.SessionFactoryImpl; import org.dive4elements.river.backend.SessionFactoryProvider; public class MapUtils { private static final Logger log = LogManager.getLogger(MapUtils.class); private static final String JDBC_SCHEME = "^jdbc:"; private static final String JDBC_DRV_PATTERN = JDBC_SCHEME + "(postgresql|oracle:(thin|oci)):.*"; /** * 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.info("Parse connection string: " + url); if (!url.matches(JDBC_DRV_PATTERN)) { log.error("Could not parse connection string: " + "Not a JDBC URL with PostgreSQL or Oracle driver"); return null; } URI uri = null; try { // Strip JDBC_SCHEME to let the driver be parsed as scheme uri = new URI(url.replaceFirst(JDBC_SCHEME, "")); } catch (URISyntaxException e) { log.error("Could not parse connection string: " + e.getMessage()); return null; } String drv = uri.getScheme(); log.debug("Driver: " + drv); String connection = null; if (drv.equals("oracle")) { try { // Work-around the extra colon in the driver part of the scheme String con = new URI(uri.getSchemeSpecificPart()) .getSchemeSpecificPart().replaceFirst("^@(//)?", ""); log.debug("Database specifier: " + con); connection = user + "/" + pass + "@" + con; } catch (URISyntaxException e) { log.error("Could not parse Oracle connection string: " + e.getMessage()); return null; } } else { // assume PostgreSQL String host = uri.getHost(); if (host == null && uri.getSchemeSpecificPart().startsWith("//")) { // invalid hostnames (e.g. containing '_') are not parsed! log.error("Could not parse PostgreSQL connection string: " + "invalid host name"); return null; } String db = host == null ? uri.getSchemeSpecificPart() : uri.getPath(); int port = uri.getPort(); connection = createConnectionString(user, pass, host, db, port); } return connection; } private static String createConnectionString( String user, String pass, String host, String db, int port ) { StringBuilder sb = new StringBuilder(); // Required parameters // defaults to user name in PostgreSQL JDBC: if (db != null) { db = db.replaceFirst("/", ""); } sb.append("dbname=").append(db == null || db.equals("") ? user : db); sb.append(" user=").append(user); // Optional parameters if (host != null) { sb.append(" host='").append(host).append("'"); } if (port != -1) { 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"; } }