package org.abcgo.config;
import java.net.URI;
import java.net.URISyntaxException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.ApplicationContextException;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
@Profile(Constants.SPRING_PROFILE_OPENSHIFT)
public class OpenShiftDatabaseConfiguration implements EnvironmentAware {
private final Logger log = LoggerFactory.getLogger(OpenShiftDatabaseConfiguration.class);
private RelaxedPropertyResolver propertyResolver;
@Override
public void setEnvironment(Environment environment) {
this.propertyResolver = new RelaxedPropertyResolver(environment, "spring.datasource.");
}
@Bean
public DataSource dataSource() {
log.debug("Configuring OpenShift Datasource");
String openShiftUrl = propertyResolver.getProperty("openshift-url");
if (openShiftUrl != null) {
log.info("Using OpenShift, parsing their $OPENSHIFT_POSTGRESQL_DB_URL to use it with JDBC");
URI dbUri = null;
try {
dbUri = new URI(openShiftUrl);
} catch (URISyntaxException e) {
throw new ApplicationContextException("OpenShift database connection pool is not configured correctly");
}
log.info(String.format("DB URI user info=%s", dbUri.getUserInfo()));
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://" +
dbUri.getHost() +
':' +
dbUri.getPort() +
"/" +
propertyResolver.getProperty("openshift-databaseName");
HikariConfig config = new HikariConfig();
config.setDataSourceClassName(propertyResolver.getProperty("dataSourceClassName"));
config.addDataSourceProperty("url", dbUrl);
config.addDataSourceProperty("user", username);
config.addDataSourceProperty("password", password);
log.info(String.format("DB information:\n \tusername=%s\n \tpassword=%s\n \thost=%s\n \tport=%s\n \turl=%s\n \tdataSourceClassName=%s",
username, password, dbUri.getHost(), dbUri.getPort(), dbUrl, config.getDataSourceClassName()));
return new HikariDataSource(config);
} else {
throw new ApplicationContextException("OpenShift database URL is not configured, you must set --spring.datasource.openshift-url=$OPENSHIFT_POSTGRESQL_DB_URL");
}
}
}