package org.apache.haox.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.*;
public class Conf implements Config {
private static final Logger logger = LoggerFactory.getLogger(Conf.class);
private List<ConfigLoader> resourceConfigs;
private final ConfigImpl config;
private boolean needReload;
public Conf() {
this.resourceConfigs = new ArrayList<ConfigLoader>(1);
this.config = new ConfigImpl("Conf");
this.needReload = true;
}
public void addXmlConfig(File xmlFile) throws IOException {
addResource(Resource.createXmlResource(xmlFile));
}
public void addIniConfig(File iniFile) throws IOException {
addResource(Resource.createIniResource(iniFile));
}
public void addJsonConfig(File jsonFile) throws IOException {
addResource(Resource.createJsonResource(jsonFile));
}
public void addPropertiesConfig(File propertiesFile) throws IOException {
addResource(Resource.createPropertiesFileResource(propertiesFile));
}
public void addPropertiesConfig(Properties propertiesConfig) {
addResource(Resource.createPropertiesResource(propertiesConfig));
}
public void addMapConfig(Map<String, String> mapConfig) {
addResource(Resource.createMapResource(mapConfig));
}
public void addResource(Resource resource) {
ConfigLoader loader = getLoader(resource);
resourceConfigs.add(loader);
needReload = true;
}
private static ConfigLoader getLoader(Resource resource) {
ConfigLoader loader = null;
Class<? extends ConfigLoader> loaderClass = resource.getFormat().getLoaderClass();
try {
loader = loaderClass.newInstance();
} catch (Exception e) {
throw new RuntimeException("Failed to create org.haox.config loader for " + loaderClass.getName(), e);
}
loader.setResource(resource);
return loader;
}
private void checkAndLoad() {
if (needReload) {
reload();
needReload = false;
}
}
public void reload() {
config.reset();
if (resourceConfigs.size() == 1) {
ConfigLoader loader = resourceConfigs.get(0);
loader.setConfig(config);
loader.load();
} else {
for (ConfigLoader loader : resourceConfigs) {
Config loaded = loader.load();
config.set(loaded.getResource(), loaded);
}
}
}
@Override
public String getResource() {
checkAndLoad();
return config.getResource();
}
@Override
public Set<String> getNames() {
checkAndLoad();
return config.getNames();
}
@Override
public String getString(String name) {
checkAndLoad();
return config.getString(name);
}
@Override
public String getString(ConfigKey name) {
checkAndLoad();
return config.getString(name);
}
@Override
public String getString(String name, String defaultValue) {
checkAndLoad();
return config.getString(name, defaultValue);
}
@Override
public String getTrimmed(String name) {
checkAndLoad();
return config.getTrimmed(name);
}
@Override
public String getTrimmed(ConfigKey name) {
checkAndLoad();
return config.getTrimmed(name);
}
@Override
public Boolean getBoolean(String name) {
checkAndLoad();
return config.getBoolean(name);
}
@Override
public Boolean getBoolean(ConfigKey name) {
checkAndLoad();
return config.getBoolean(name);
}
@Override
public Boolean getBoolean(String name, boolean defaultValue) {
checkAndLoad();
return config.getBoolean(name, defaultValue);
}
@Override
public Integer getInt(String name) {
checkAndLoad();
return config.getInt(name);
}
@Override
public Integer getInt(ConfigKey name) {
checkAndLoad();
return config.getInt(name);
}
@Override
public Integer getInt(String name, int defaultValue) {
checkAndLoad();
return config.getInt(name, defaultValue);
}
@Override
public Long getLong(String name) {
checkAndLoad();
return config.getLong(name);
}
@Override
public Long getLong(ConfigKey name) {
checkAndLoad();
return config.getLong(name);
}
@Override
public Long getLong(String name, long defaultValue) {
checkAndLoad();
return config.getLong(name, defaultValue);
}
@Override
public Float getFloat(String name) {
checkAndLoad();
return config.getFloat(name);
}
@Override
public Float getFloat(ConfigKey name) {
checkAndLoad();
return config.getFloat(name);
}
@Override
public Float getFloat(String name, float defaultValue) {
checkAndLoad();
return config.getFloat(name, defaultValue);
}
@Override
public List<String> getList(String name) {
checkAndLoad();
return config.getList(name);
}
@Override
public List<String> getList(String name, String[] defaultValue) {
checkAndLoad();
return config.getList(name, defaultValue);
}
@Override
public List<String> getList(ConfigKey name) {
checkAndLoad();
return config.getList(name);
}
@Override
public Config getConfig(String name) {
checkAndLoad();
return config.getConfig(name);
}
@Override
public Config getConfig(ConfigKey name) {
checkAndLoad();
return config.getConfig(name);
}
@Override
public Class<?> getClass(String name) throws ClassNotFoundException {
checkAndLoad();
return config.getClass(name);
}
@Override
public Class<?> getClass(String name, Class<?> defaultValue) throws ClassNotFoundException {
checkAndLoad();
return config.getClass(name, defaultValue);
}
@Override
public Class<?> getClass(ConfigKey name) throws ClassNotFoundException {
checkAndLoad();
return config.getClass(name);
}
@Override
public <T> T getInstance(String name) throws ClassNotFoundException {
checkAndLoad();
return config.getInstance(name);
}
@Override
public <T> T getInstance(ConfigKey name) throws ClassNotFoundException {
checkAndLoad();
return config.getInstance(name);
}
@Override
public <T> T getInstance(String name, Class<T> xface) throws ClassNotFoundException {
checkAndLoad();
return config.getInstance(name, xface);
}
}