package org.apereo.cas.configuration;
import com.google.common.base.Throwables;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.FileBasedConfiguration;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;
import org.apache.commons.lang3.tuple.Pair;
import org.apereo.cas.util.spring.ApplicationContextProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.util.Assert;
import java.io.File;
import java.util.Map;
/**
* This is {@link CasConfigurationPropertiesEnvironmentManager}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public class CasConfigurationPropertiesEnvironmentManager {
private static final Logger LOGGER = LoggerFactory.getLogger(CasConfigurationPropertiesEnvironmentManager.class);
@Autowired
private ConfigurationPropertiesBindingPostProcessor binder;
@Autowired
private Environment environment;
/**
* Gets standalone profile configuration directory.
*
* @return the standalone profile configuration directory
*/
public File getStandaloneProfileConfigurationDirectory() {
return environment.getProperty("cas.standalone.config", File.class, new File("/etc/cas/config"));
}
/**
* Gets standalone profile configuration file.
*
* @return the standalone profile configuration file
*/
public File getStandaloneProfileConfigurationFile() {
return environment.getProperty("cas.standalone.config.file", File.class);
}
public String getApplicationName() {
return environment.getRequiredProperty("spring.application.name");
}
/**
* Save property for standalone profile.
*
* @param pair the pair
*/
public void savePropertyForStandaloneProfile(final Pair<String, String> pair) {
try {
final File file = getStandaloneProfileConfigurationDirectory();
final Parameters params = new Parameters();
final FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
.configure(params.properties().setFile(new File(file, getApplicationName() + ".properties")));
final Configuration config = builder.getConfiguration();
config.setProperty(pair.getKey(), pair.getValue());
builder.save();
} catch (final Exception e) {
throw Throwables.propagate(e);
}
}
/**
* Rebind cas configuration properties.
*/
public void rebindCasConfigurationProperties() {
rebindCasConfigurationProperties(this.binder);
}
/**
* Rebind cas configuration properties.
*
* @param binder the binder
*/
public static void rebindCasConfigurationProperties(final ConfigurationPropertiesBindingPostProcessor binder) {
Assert.notNull(binder, "Configuration binder cannot be null");
final ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
final Map<String, CasConfigurationProperties> map = applicationContext.getBeansOfType(CasConfigurationProperties.class);
final String name = map.keySet().iterator().next();
LOGGER.debug("Reloading CAS configuration via [{}]", name);
final Object e = applicationContext.getBean(name);
binder.postProcessBeforeInitialization(e, name);
final Object bean = applicationContext.getAutowireCapableBeanFactory().initializeBean(e, name);
applicationContext.getAutowireCapableBeanFactory().autowireBean(bean);
LOGGER.debug("Reloaded CAS configuration [{}]", name);
}
}