diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java @ 1854:e372934f0c42

Replaced the dbconnection.include used by Mapserver - these information are provided by LayerInfo objects now, which reduces config overhead. flys-artifacts/trunk@3199 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 09 Nov 2011 15:00:29 +0000
parents 5364b86a0880
children dd467951335c
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java	Wed Nov 09 14:02:15 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java	Wed Nov 09 15:00:29 2011 +0000
@@ -3,10 +3,15 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
 import org.w3c.dom.Document;
 
 import org.apache.log4j.Logger;
 
+import org.hibernate.impl.SessionFactoryImpl;
+
 import com.vividsolutions.jts.geom.Envelope;
 
 import de.intevation.artifacts.Artifact;
@@ -20,8 +25,11 @@
 import de.intevation.artifacts.common.ArtifactNamespaceContext;
 import de.intevation.artifacts.common.utils.XMLUtils;
 
+import de.intevation.flys.backend.SessionFactoryProvider;
+
 import de.intevation.flys.artifacts.states.DefaultState;
 import de.intevation.flys.artifacts.model.WMSDBLayerFacet;
+import de.intevation.flys.utils.FLYSUtils;
 
 
 public abstract class WMSDBArtifact extends StaticFLYSArtifact {
@@ -30,6 +38,9 @@
 
     public static final String XPATH_IDS = "/art:action/art:ids/@value";
 
+    public static final Pattern DB_URL_PATTERN =
+        Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z]+)");
+
 
     @Override
     public void setup(
@@ -126,12 +137,85 @@
             facet.setData(getDataString());
             facet.setFilter(getFilter());
             facet.setGeometryType(getGeometryType());
+            facet.setConnection(getConnection());
+            facet.setConnectionType(getConnectionType());
 
             facets.add(facet);
 
             return null;
         }
 
+        /**
+         * This method returns a connection string for databases used by
+         * Mapserver's Mapfile.
+         *
+         * @return A connection string for Mapserver.
+         */
+        protected 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.");
+                return null;
+            }
+
+            logger.debug("Groups for connection string: " + m.groupCount());
+            int groups = m.groupCount();
+
+            for (int i = 0; i <= m.groupCount(); 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);
+
+                StringBuilder sb = new StringBuilder();
+                sb.append("dbname=" + db);
+                sb.append("host='" + host + "'");
+                sb.append("port=" + port);
+                sb.append("password='" + pass + "'");
+                sb.append("sslmode=disable");
+
+                connection = sb.toString();
+            }
+
+            logger.debug("Created connection: '" + connection + "'");
+
+            return connection;
+        }
+
+        protected String getConnectionType() {
+            return FLYSUtils.isUsingOracle() ? "oraclespatial" : "postgis";
+        }
+
         protected abstract String getFacetType();
 
         protected abstract String getTitle(CallMeta meta);

http://dive4elements.wald.intevation.org