package at.asitplus.eidas.specific.connector; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Properties; import org.apache.commons.lang3.StringUtils; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertiesPropertySource; import at.gv.egiz.components.spring.api.SpringBootApplicationContextInitializer; import lombok.extern.slf4j.Slf4j; @Slf4j public class MsSpecificSpringBootApplicationContextInitializer extends SpringBootApplicationContextInitializer { private static final String SYSTEMD_PROP_NAME = "eidas.ms.configuration"; private static final String PATH_FILE_PREFIX = "file:"; @Override public void initialize(ConfigurableApplicationContext applicationContext) { String configPath = System.getProperty(SYSTEMD_PROP_NAME); if (StringUtils.isNotEmpty(configPath)) { log.debug("Find configuration-source from SystemD Property: '{}' ...", SYSTEMD_PROP_NAME); if (configPath.startsWith(PATH_FILE_PREFIX)) { configPath = configPath.substring(PATH_FILE_PREFIX.length()); } injectConfiguration(configPath, applicationContext); } else { log.info("Find NO SystemD Property: '{}' Maybe no configuration available", SYSTEMD_PROP_NAME); } super.initialize(applicationContext); } private void injectConfiguration(String configPath, ConfigurableApplicationContext applicationContext) { InputStream is = null; try { Path path = Paths.get(configPath); if (Files.exists(path)) { File file = new File(configPath); Properties props = new Properties(); is = new FileInputStream(file); props.load(is); MutablePropertySources sources = applicationContext.getEnvironment().getPropertySources(); sources.addFirst(new PropertiesPropertySource(SYSTEMD_PROP_NAME, props)); log.info("Set configuration-source from SystemD-Property: {}", SYSTEMD_PROP_NAME); } else { log.error("Configuration from SystemD Property: '{}' at Location: {} DOES NOT exist", SYSTEMD_PROP_NAME, configPath); } } catch (IOException e) { log.error("Configuration from SystemD Property: '{}' at Location: {} CAN NOT be loaded", SYSTEMD_PROP_NAME, configPath, e); } finally { try { if (is != null) { is.close(); } } catch (IOException e) { log.error("Can not close InputStream of configLoader: {}", configPath, e); } } } }