package org.hivedb.util.database;
import static org.hivedb.util.HiveUtils.empty;
import java.util.Map;
import java.util.Properties;
import org.hivedb.meta.Node;
import org.hivedb.util.FilteringStringBuilder;
public class JdbcUriFormatter {
private static final String OPTIONS = "options";
private static final String PASSWORD = "password";
private static final String USERNAME = "username";
private static final String PORT = "port";
private static final String DATABASE = "database";
private static final String HOST = "host";
private static final String DRIVER = "driver";
private Properties p;
public JdbcUriFormatter(Node node) {
this.p = getConnectionPropertiesFromNode(node);
}
public String getUri() {
return new UriBuilder(p)
.append("jdbc:")
.filter("get", DRIVER).append(":")
.chain(HOST).add("get").add("format", "//%s").end()
.chain(PORT).add("get").add("format", ":%s").end()
.append(p.containsKey(HOST) ? "/" : "")
.filter("get", DATABASE)
.chain(USERNAME).add("get").add("format", "?user=%s").end()
.chain(PASSWORD).add("get").add("format", p.containsKey(USERNAME) ? "&password=%s" : "?password=%s").end()
.filter("get", OPTIONS).toString();
}
private class UriBuilder extends FilteringStringBuilder {
private Properties p;
public UriBuilder(Properties p) {
super();
this.p = p;
this.addFilter("get", FilteringStringBuilder.getMapEntry(p));
}
}
private static Properties getConnectionPropertiesFromNode(Node node) {
Properties p = new Properties();
p.put(DRIVER, DriverLoader.getDriverStringForDialect(node.getDialect()));
addIf(node.getDialect() == HiveDbDialect.MySql, HOST, node.getHost(), p);
p.put(DATABASE, node.getDatabaseName());
if(node.getPort() != 0)
p.put(PORT, node.getPort());
addIf(!empty(node.getUsername()), USERNAME, node.getUsername(), p);
addIf(!empty(node.getPassword()),PASSWORD, node.getPassword(), p);
addIf(!empty(node.getOptions()), OPTIONS, node.getOptions(), p);
addIf(node.getDialect() == HiveDbDialect.MySql, OPTIONS, "&autoReconnect=true&autoReconnectForPools=true", p);
return p;
}
@SuppressWarnings("unchecked")
private static Map addIf(boolean b, Object key, Object value, Map map) {
if(b)
map.put(key, value);
return map;
}
}