package me.atam.atam4j.configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.google.common.io.ByteStreams;
import org.apache.commons.lang3.text.StrLookup;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
public class ConfigLoader<T> {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigLoader.class);
private final Class<T> configClass;
private final String configFileName;
private final ObjectReader reader;
private final StrSubstitutor substitutor;
public ConfigLoader(Class<T> configClass, String configFileName) {
this.configClass = configClass;
this.configFileName = configFileName;
this.reader = new ObjectMapper(new YAMLFactory()).reader(configClass);
this.substitutor = new StrSubstitutor(new EnvironmentVariableLookup());
}
public ConfigLoader(Class<T> configClass, String configFileName, StrLookup<Object> stringLookup) {
this.configClass = configClass;
this.configFileName = configFileName;
this.reader = new ObjectMapper(new YAMLFactory()).reader(configClass);
this.substitutor = new StrSubstitutor(stringLookup);
}
public T getTestConfig() {
try {
LOGGER.info(String.format("Loading config from: %s", configFileName));
final String substitutedString = substitutor.replace(new String(
ByteStreams.toByteArray(this.getClass().getClassLoader().getResourceAsStream(configFileName)),
StandardCharsets.UTF_8)
);
return reader.readValue(substitutedString);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
public String getConfigFileName() {
return configFileName;
}
public Class<T> getConfigClass() {
return configClass;
}
}