rrenkert@4841: package de.intevation.flys.utils; rrenkert@4841: rrenkert@4841: import java.util.regex.Matcher; rrenkert@4841: import java.util.regex.Pattern; rrenkert@4841: rrenkert@4841: import org.apache.log4j.Logger; rrenkert@4841: import org.hibernate.impl.SessionFactoryImpl; rrenkert@4841: rrenkert@4841: import de.intevation.flys.backend.SessionFactoryProvider; rrenkert@4841: rrenkert@4841: rrenkert@4841: public class MapUtils rrenkert@4841: { rrenkert@4841: private static final Logger logger = Logger.getLogger(MapUtils.class); rrenkert@4841: rrenkert@4841: public static final Pattern DB_URL_PATTERN = rrenkert@4841: Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z]+)"); rrenkert@4841: rrenkert@4841: public static final Pattern DB_PSQL_URL_PATTERN = rrenkert@4841: Pattern.compile("(.*)\\/\\/(.*):([0-9]+)\\/([a-zA-Z0-9]+)"); rrenkert@4841: rrenkert@4841: /** rrenkert@4841: * This method returns a connection string for databases used by rrenkert@4841: * Mapserver's Mapfile. rrenkert@4841: * rrenkert@4841: * @return A connection string for Mapserver. rrenkert@4841: */ rrenkert@4841: public static String getConnection() { rrenkert@4841: SessionFactoryImpl sf = (SessionFactoryImpl) rrenkert@4841: SessionFactoryProvider.getSessionFactory(); rrenkert@4841: rrenkert@4841: String user = SessionFactoryProvider.getUser(sf); rrenkert@4841: String pass = SessionFactoryProvider.getPass(sf); rrenkert@4841: String url = SessionFactoryProvider.getURL(sf); rrenkert@4841: rrenkert@4841: logger.debug("Parse connection url: " + url); rrenkert@4841: rrenkert@4841: Matcher m = DB_URL_PATTERN.matcher(url); rrenkert@4841: if (!m.matches()) { rrenkert@4841: logger.warn("Could not parse Connection string." + rrenkert@4841: "Try to parse PostgreSQL string."); rrenkert@4841: // maybe this is a PostgreSQL connection... rrenkert@4841: return getPostgreSQLConnection(); rrenkert@4841: } rrenkert@4841: rrenkert@4841: logger.debug("Groups for connection string: " + m.groupCount()); rrenkert@4841: int groups = m.groupCount(); rrenkert@4841: rrenkert@4841: for (int i = 0; i <= groups; i++) { rrenkert@4841: logger.debug("Group " + i + ": " + m.group(i)); rrenkert@4841: } rrenkert@4841: rrenkert@4841: String connection = null; rrenkert@4841: rrenkert@4841: if (FLYSUtils.isUsingOracle()) { rrenkert@4841: if (groups < 3) { rrenkert@4841: logger.warn("Could only partially parse connection string."); rrenkert@4841: return null; rrenkert@4841: } rrenkert@4841: rrenkert@4841: String host = m.group(2); rrenkert@4841: String port = m.group(3); rrenkert@4841: rrenkert@4841: connection = user + "/" + pass + "@" + host; rrenkert@4841: } rrenkert@4841: else { rrenkert@4841: if (groups < 4) { rrenkert@4841: logger.warn("Could only partially parse connection string."); rrenkert@4841: return null; rrenkert@4841: } rrenkert@4841: rrenkert@4841: String host = m.group(2); rrenkert@4841: String port = m.group(3); rrenkert@4841: String db = m.group(4); rrenkert@4841: rrenkert@4841: StringBuilder sb = new StringBuilder(); rrenkert@4841: sb.append("dbname=" + db); rrenkert@4841: sb.append("host='" + host + "'"); rrenkert@4841: sb.append("port=" + port); rrenkert@4841: sb.append("password='" + pass + "'"); rrenkert@4841: sb.append("sslmode=disable"); rrenkert@4841: rrenkert@4841: connection = sb.toString(); rrenkert@4841: } rrenkert@4841: rrenkert@4841: return connection; rrenkert@4841: } rrenkert@4841: rrenkert@4841: protected static String getPostgreSQLConnection() { rrenkert@4841: SessionFactoryImpl sf = (SessionFactoryImpl) rrenkert@4841: SessionFactoryProvider.getSessionFactory(); rrenkert@4841: rrenkert@4841: String user = SessionFactoryProvider.getUser(sf); rrenkert@4841: String pass = SessionFactoryProvider.getPass(sf); rrenkert@4841: String url = SessionFactoryProvider.getURL(sf); rrenkert@4841: rrenkert@4841: Matcher m = DB_PSQL_URL_PATTERN.matcher(url); rrenkert@4841: if (!m.matches()) { rrenkert@4841: logger.warn("Could not parse PostgreSQL Connection string."); rrenkert@4841: return null; rrenkert@4841: } rrenkert@4841: rrenkert@4841: int groups = m.groupCount(); rrenkert@4841: logger.debug("Groups for PostgreSQL connection string: " + groups); rrenkert@4841: rrenkert@4841: if (logger.isDebugEnabled()) { rrenkert@4841: for (int i = 0; i <= groups; i++) { rrenkert@4841: logger.debug("Group " + i + ": " + m.group(i)); rrenkert@4841: } rrenkert@4841: } rrenkert@4841: rrenkert@4841: String connection = null; rrenkert@4841: rrenkert@4841: if (groups < 4) { rrenkert@4841: logger.warn("Could only partially parse connection string."); rrenkert@4841: return null; rrenkert@4841: } rrenkert@4841: rrenkert@4841: String host = m.group(2); rrenkert@4841: String port = m.group(3); rrenkert@4841: String db = m.group(4); rrenkert@4841: rrenkert@4841: StringBuilder sb = new StringBuilder(); rrenkert@4841: sb.append("dbname=" + db); rrenkert@4841: sb.append(" host='" + host + "'"); rrenkert@4841: sb.append(" port=" + port); rrenkert@4841: sb.append(" user=" + user); rrenkert@4841: sb.append(" password='" + pass + "'"); rrenkert@4841: sb.append(" sslmode=disable"); rrenkert@4841: rrenkert@4841: connection = sb.toString(); rrenkert@4841: rrenkert@4841: logger.debug("Created connection: '" + connection + "'"); rrenkert@4841: rrenkert@4841: return connection; rrenkert@4841: } rrenkert@4841: rrenkert@4841: public static String getConnectionType() { rrenkert@4841: return FLYSUtils.isUsingOracle() ? "oraclespatial" : "postgis"; rrenkert@4841: } rrenkert@4841: }