package org.apereo.cas.config;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.configuration.model.support.jpa.AbstractJpaProperties;
import org.apereo.cas.configuration.support.Beans;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* This is {@link JdbcCloudConfigBootstrapConfiguration}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
@Configuration("jdbcCloudConfigBootstrapConfiguration")
public class JdbcCloudConfigBootstrapConfiguration implements PropertySourceLocator {
private static final Logger LOGGER = LoggerFactory.getLogger(JdbcCloudConfigBootstrapConfiguration.class);
@Override
public PropertySource<?> locate(final Environment environment) {
final Properties props = new Properties();
try {
final JdbcCloudConnection connection = new JdbcCloudConnection(environment);
final DataSource dataSource = Beans.newDataSource(connection);
final JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
final List<Map<String, Object>> rows = jdbcTemplate.queryForList(connection.getSql());
for (final Map row : rows) {
props.put(row.get("name"), row.get("value"));
}
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
}
return new PropertiesPropertySource(getClass().getSimpleName(), props);
}
private static class JdbcCloudConnection extends AbstractJpaProperties {
private static final String SQL = "SELECT id, name, value FROM CAS_SETTINGS_TABLE";
private final Environment environment;
JdbcCloudConnection(final Environment environment) {
this.environment = environment;
}
private static String getSetting(final Environment environment, final String key) {
return environment.getProperty("cas.spring.cloud.jdbc." + key);
}
public String getSql() {
return StringUtils.defaultIfBlank(getSetting(environment, "sql"), SQL);
}
@Override
public String getUrl() {
return StringUtils.defaultIfBlank(getSetting(environment, "url"), super.getUrl());
}
@Override
public String getPassword() {
return StringUtils.defaultIfBlank(getSetting(environment, "password"), super.getPassword());
}
@Override
public String getUser() {
return StringUtils.defaultIfBlank(getSetting(environment, "user"), super.getUser());
}
@Override
public String getDriverClass() {
return StringUtils.defaultIfBlank(getSetting(environment, "driverClass"), super.getDriverClass());
}
}
}