DIRKRB-511 Load configuration content when adding the resource. Contributed by Yan.
diff --git a/kerby-config/src/main/java/org/apache/kerby/config/Conf.java b/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
index d5bbcfc..86555e9 100644
--- a/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
+++ b/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
@@ -25,27 +25,23 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
+/**
+ * A general class to describe and store all the config files.
+ */
 public class Conf implements Config {
     private static final Logger LOGGER = LoggerFactory.getLogger(Conf.class);
 
     private List<ConfigLoader> resourceConfigs;
     private final ConfigImpl config;
-    private final Map<String, String> setValues;
-    private boolean needReload;
 
     public Conf() {
         this.resourceConfigs = new ArrayList<ConfigLoader>(1);
         this.config = new ConfigImpl("Conf");
-        this.setValues = new HashMap<>(10);
-        this.needReload = true;
-
-        addMapConfig(setValues);
     }
 
     public void addXmlConfig(File xmlFile) throws IOException {
@@ -72,10 +68,16 @@
         addResource(Resource.createMapResource(mapConfig));
     }
 
-    public void addResource(Resource resource) {
+    /**
+     * Load the resource name and content in one step.
+     * Add synchronized to avoid conflicts
+     * @param resource the config resource
+     */
+    public synchronized void addResource(Resource resource) {
         ConfigLoader loader = getLoader(resource);
         resourceConfigs.add(loader);
-        needReload = true;
+        Config loaded = loader.load();
+        config.add(loaded);
     }
 
     private static ConfigLoader getLoader(Resource resource) {
@@ -94,16 +96,12 @@
         return loader;
     }
 
-    private void checkAndLoad() {
-        if (needReload) {
-            reload();
-            needReload = false;
-        }
-    }
-
-    public void reload() {
+    /**
+     * For users usage, to determine whether to reload config files.
+     * Add synchronized to avoid conflicts
+     */
+    public synchronized void reload() {
         config.reset();
-
         for (ConfigLoader loader : resourceConfigs) {
             Config loaded = loader.load();
             config.add(loaded);
@@ -112,37 +110,38 @@
 
     @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, boolean useDefault) {
-        checkAndLoad();
         return config.getString(name, useDefault);
     }
 
     @Override
     public String getString(String name, String defaultValue) {
-        checkAndLoad();
         return config.getString(name, defaultValue);
     }
 
+    /**
+     * Values user sets will be add in config directly.
+     * Add synchronized to avoid conflicts
+     * @param name The property name
+     * @param value The string value
+     */
     @Override
-    public void setString(String name, String value) {
-        setValues.put(name, value);
+    public synchronized void setString(String name, String value) {
+        config.set(name, value);
     }
 
     @Override
@@ -152,31 +151,26 @@
 
     @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, boolean useDefault) {
-        checkAndLoad();
         return config.getBoolean(name, useDefault);
     }
 
     @Override
     public Boolean getBoolean(String name, Boolean defaultValue) {
-        checkAndLoad();
         return config.getBoolean(name, defaultValue);
     }
 
@@ -192,19 +186,16 @@
 
     @Override
     public Integer getInt(String name) {
-        checkAndLoad();
         return config.getInt(name);
     }
 
     @Override
     public Integer getInt(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getInt(name, useDefault);
     }
 
     @Override
     public Integer getInt(String name, Integer defaultValue) {
-        checkAndLoad();
         return config.getInt(name, defaultValue);
     }
 
@@ -220,19 +211,16 @@
 
     @Override
     public Long getLong(String name) {
-        checkAndLoad();
         return config.getLong(name);
     }
 
     @Override
     public Long getLong(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getLong(name, useDefault);
     }
 
     @Override
     public Long getLong(String name, Long defaultValue) {
-        checkAndLoad();
         return config.getLong(name, defaultValue);
     }
 
@@ -248,19 +236,16 @@
 
     @Override
     public Float getFloat(String name) {
-        checkAndLoad();
         return config.getFloat(name);
     }
 
     @Override
     public Float getFloat(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getFloat(name, useDefault);
     }
 
     @Override
     public Float getFloat(String name, Float defaultValue) {
-        checkAndLoad();
         return config.getFloat(name, defaultValue);
     }
 
@@ -276,69 +261,58 @@
 
     @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, boolean useDefault)
             throws ClassNotFoundException {
-        checkAndLoad();
         return config.getClass(name, useDefault);
     }
 
     @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);
     }
 }
\ No newline at end of file
diff --git a/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java b/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java
index d083313..ec3090f 100644
--- a/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java
+++ b/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java
@@ -38,8 +38,6 @@
      */
     private List<Config> configs;
 
-    private Set<String> propNames;
-
     protected ConfigImpl(String resource) {
         this.resource = resource;
         this.properties = new HashMap<String, ConfigObject>();
@@ -58,7 +56,10 @@
 
     @Override
     public Set<String> getNames() {
-        reloadNames();
+        Set<String>propNames = new HashSet<String>(properties.keySet());
+        for (Config config : configs) {
+            propNames.addAll(config.getNames());
+        }
         return propNames;
     }
 
@@ -424,14 +425,4 @@
             this.configs.add(config);
         }
     }
-
-    private void reloadNames() {
-        if (propNames != null) {
-            propNames.clear();
-        }
-        propNames = new HashSet<String>(properties.keySet());
-        for (Config config : configs) {
-            propNames.addAll(config.getNames());
-        }
-    }
 }