package net.rrm.ehour.persistence.database;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.URI;
import java.net.URISyntaxException;
@Configuration
public class DatabaseConfigFactory {
private static final Logger LOGGER = Logger.getLogger(DatabaseConfigFactory.class);
@Bean
public DatabaseConfig createDatabaseConfig(@Value("${ehour.database}") String databaseType,
@Value("${ehour.database.driver:}") String driver,
@Value("${ehour.database.url:}") String url,
@Value("${ehour.database.username:}") String username,
@Value("${ehour.database.password:}") String password) throws URISyntaxException {
Database database = Database.valueOf(databaseType.toUpperCase());
String sanitizedDriver = StringUtils.isBlank(driver) ? database.defaultDriver : driver;
String sanitizedUrl = null;
String sanitizedUsername = null;
String sanitizedPassword = null;
if (database != Database.DERBY) {
if (StringUtils.isBlank(username) && StringUtils.isBlank(password)) {
URI dbUri = new URI(url);
String userInfo = dbUri.getUserInfo();
if (StringUtils.isNotBlank(userInfo)) {
String[] splitted = userInfo.split(":");
if (splitted.length == 2) {
sanitizedUsername = splitted[0];
sanitizedPassword = splitted[1];
}
}
String query = (StringUtils.isNotBlank(dbUri.getQuery())) ? "?" + dbUri.getQuery() : "";
String dbUrl = String.format("jdbc:%s://%s:%d%s%s", database.name().toLowerCase(), dbUri.getHost(), dbUri.getPort(), dbUri.getPath(), query);
LOGGER.info("Only a DB URL was provided, stripped of username and password and using url " + dbUrl);
sanitizedUrl = dbUrl;
} else {
sanitizedUrl = url;
sanitizedUsername = username;
sanitizedPassword = password;
}
verifyUsernamePassword(sanitizedUsername, sanitizedPassword);
verifyItem("ehour.database.url", sanitizedUrl);
}
return new DatabaseConfig(database, sanitizedDriver, sanitizedUrl, sanitizedUsername, sanitizedPassword);
}
private void verifyUsernamePassword(String username, String password) {
verifyItem("ehour.database.username", username);
verifyItem("ehour.database.password", password);
}
private void verifyItem(String name, String value) {
if (StringUtils.isBlank(value)) {
throw new ConfigurationException(String.format("%s is required but no value provided", name));
}
}
}