diff options
Diffstat (limited to 'common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl')
4 files changed, 134 insertions, 156 deletions
diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java index e81d82bf7d..07c81e5f5b 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/AggregateConfiguration.java @@ -19,14 +19,17 @@ package org.onap.config.impl; import static org.onap.config.Constants.LOAD_ORDER_KEY; import java.io.File; +import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import org.apache.commons.configuration2.CombinedConfiguration; import org.apache.commons.configuration2.Configuration; +import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.configuration2.tree.MergeCombiner; import org.apache.commons.configuration2.tree.OverrideCombiner; import org.apache.commons.configuration2.tree.UnionCombiner; @@ -40,61 +43,61 @@ public final class AggregateConfiguration { private final Map<String, Configuration> mergeConfig = Collections.synchronizedMap(new HashMap<>()); private final Map<String, Configuration> overrideConfig = Collections.synchronizedMap(new LinkedHashMap<>()); - public void addConfig(File file) throws Exception { - addConfig(file.getAbsolutePath().toUpperCase(), ConfigurationUtils.getMergeStrategy(file), - ConfigurationUtils.getConfigurationBuilder(file, false).getConfiguration()); + public void addConfig(File file) throws ConfigurationException { + addConfig(fileToUrl(file), ConfigurationUtils.getMergeStrategy(file), + ConfigurationUtils.getConfigurationBuilder(file).getConfiguration()); } - private void addConfig(String path, ConfigurationMode configMode, Configuration config) { + public void addConfig(URL url) throws ConfigurationException { + addConfig(url, ConfigurationUtils.getMergeStrategy(url), + ConfigurationUtils.getConfigurationBuilder(url).getConfiguration()); + } + + private void addConfig(URL url, ConfigurationMode configMode, Configuration config) { + + String normalizedUrl = normalize(url); if (configMode != null) { switch (configMode) { case MERGE: - mergeConfig.put(path, config); + mergeConfig.put(normalizedUrl, config); break; case OVERRIDE: - overrideConfig.put(path, config); + overrideConfig.put(normalizedUrl, config); break; case UNION: - unionConfig.put(path, config); + unionConfig.put(normalizedUrl, config); break; default: } } else { - rootConfig.put(path, config); + rootConfig.put(normalizedUrl, config); } } - public void addConfig(URL url) throws Exception { - addConfig(url.getFile().toUpperCase(), ConfigurationUtils.getMergeStrategy(url), - ConfigurationUtils.getConfigurationBuilder(url).getConfiguration()); + private String normalize(URL url) { + // what about Linux where paths are case sensitive? + return url.toString().toUpperCase(); } - public void removeConfig(File file) { - String key = file.getAbsolutePath().toUpperCase(); - if (rootConfig.containsKey(key)) { - rootConfig.remove(key); - } else if (mergeConfig.containsKey(key)) { - mergeConfig.remove(key); - } else if (unionConfig.containsKey(key)) { - unionConfig.remove(key); - } else if (overrideConfig.containsKey(key)) { - overrideConfig.remove(key); - } - } + private URL fileToUrl(File file) { - public boolean containsConfig(File file) { - String key = file.getAbsolutePath().toUpperCase(); - return rootConfig.containsKey(key) || mergeConfig.containsKey(key) || unionConfig.containsKey(key) - || overrideConfig.containsKey(key); + try { + return file.getAbsoluteFile().toURI().toURL(); + } catch (MalformedURLException e) { + throw new IllegalStateException("URL produced by JDK and is not expected to be malformed. File: " + + file.getAbsoluteFile()); + } } public Configuration getFinalConfiguration() { + CombinedConfiguration ccRoot = new CombinedConfiguration(new MergeCombiner()); ArrayList<Configuration> tempList = new ArrayList<>(rootConfig.values()); tempList.sort(this::sortForMerge); for (Configuration conf : tempList) { ccRoot.addConfiguration(conf); } + CombinedConfiguration ccMergeRoot = new CombinedConfiguration(new MergeCombiner()); ccMergeRoot.addConfiguration(ccRoot); tempList = new ArrayList<>(mergeConfig.values()); @@ -102,11 +105,13 @@ public final class AggregateConfiguration { for (Configuration conf : tempList) { ccMergeRoot.addConfiguration(conf); } + CombinedConfiguration ccUnionRoot = new CombinedConfiguration(new UnionCombiner()); ccUnionRoot.addConfiguration(ccMergeRoot); for (Configuration conf : unionConfig.values()) { ccUnionRoot.addConfiguration(conf); } + ArrayList<Configuration> tempOverrideConfigs = new ArrayList<>(overrideConfig.values()); Collections.reverse(tempOverrideConfigs); tempOverrideConfigs.sort(this::sortForOverride); @@ -114,31 +119,32 @@ public final class AggregateConfiguration { for (Configuration conf : tempOverrideConfigs) { ccOverrideRoot.addConfiguration(conf); } + ccOverrideRoot.addConfiguration(ccUnionRoot); return ccOverrideRoot; } private int sortForOverride(Configuration conf1, Configuration conf2) { - String order1 = conf1.getString(LOAD_ORDER_KEY); - String order2 = conf2.getString(LOAD_ORDER_KEY); - if (ConfigurationUtils.isBlank(order1) || !order1.trim().matches("\\d+")) { - order1 = "0"; - } - if (ConfigurationUtils.isBlank(order2) || !order2.trim().matches("\\d+")) { - order2 = "0"; - } - return Integer.parseInt(order2.trim()) - Integer.parseInt(order1.trim()); + return sort(conf1, conf2, (o1, o2) -> o2 - o1); } private int sortForMerge(Configuration conf1, Configuration conf2) { - String order1 = conf1.getString(LOAD_ORDER_KEY); - String order2 = conf2.getString(LOAD_ORDER_KEY); - if (ConfigurationUtils.isBlank(order1) || !order1.trim().matches("\\d+")) { - order1 = "0"; - } - if (ConfigurationUtils.isBlank(order2) || !order2.trim().matches("\\d+")) { - order2 = "0"; + return sort(conf1, conf2, (o1, o2) -> o1 - o2); + } + + private int sort(Configuration conf1, Configuration conf2, Comparator<Integer> comparator) { + int order1 = readLoadOrder(conf1); + int order2 = readLoadOrder(conf2); + return comparator.compare(order1, order2); + } + + private int readLoadOrder(Configuration conf) { + + String order = conf.getString(LOAD_ORDER_KEY); + if (ConfigurationUtils.isBlank(order) || !order.trim().matches("\\d+")) { + return 0; } - return Integer.parseInt(order1.trim()) - Integer.parseInt(order2.trim()); + + return Integer.parseInt(order.trim()); } } diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java index 77d0c11c9f..03b2075bac 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/CliConfigurationImpl.java @@ -19,24 +19,19 @@ package org.onap.config.impl; import static org.onap.config.Constants.DEFAULT_NAMESPACE; import static org.onap.config.Constants.DEFAULT_TENANT; import static org.onap.config.Constants.LOAD_ORDER_KEY; -import static org.onap.config.Constants.MBEAN_NAME; import static org.onap.config.Constants.MODE_KEY; import static org.onap.config.Constants.NAMESPACE_KEY; -import java.lang.management.ManagementFactory; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; -import javax.management.MBeanServer; -import javax.management.ObjectName; -import javax.management.StandardMBean; import org.onap.config.ConfigurationUtils; import org.onap.config.api.ConfigurationManager; import org.onap.config.api.Hint; @@ -44,13 +39,10 @@ import org.onap.config.type.ConfigurationQuery; public final class CliConfigurationImpl extends ConfigurationImpl implements ConfigurationManager { + private static final List<String> KEYS_TO_FILTER = Arrays.asList(NAMESPACE_KEY, MODE_KEY, LOAD_ORDER_KEY); + public CliConfigurationImpl() throws Exception { - MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - ObjectName name = new ObjectName(MBEAN_NAME); - if (mbs.isRegistered(name)) { - mbs.unregisterMBean(name); - } - mbs.registerMBean(new StandardMBean(this, ConfigurationManager.class), name); + super(); } public String getConfigurationValue(Map<String, Object> input) { @@ -58,40 +50,51 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con } private String getConfigurationValue(ConfigurationQuery queryData) { + try { + + Hint[] hints = getHints(queryData); + + String[] value; if (queryData.isFallback()) { - return ConfigurationUtils.getCommaSeparatedList( - get(queryData.getTenant(), queryData.getNamespace(), queryData.getKey(), String[].class, - queryData.isLatest() ? Hint.LATEST_LOOKUP : Hint.DEFAULT, - queryData.isExternalLookup() ? Hint.EXTERNAL_LOOKUP : Hint.DEFAULT, - queryData.isNodeSpecific() ? Hint.NODE_SPECIFIC : Hint.DEFAULT)); + value = get(queryData.getTenant(), queryData.getNamespace(), queryData.getKey(), String[].class, hints); } else { - String[] list = - getInternal(queryData.getTenant(), queryData.getNamespace(), queryData.getKey(), String[].class, - queryData.isLatest() ? Hint.LATEST_LOOKUP : Hint.DEFAULT, - queryData.isExternalLookup() ? Hint.EXTERNAL_LOOKUP : Hint.DEFAULT, - queryData.isNodeSpecific() ? Hint.NODE_SPECIFIC : Hint.DEFAULT); - return ConfigurationUtils - .getCommaSeparatedList(list == null ? Collections.emptyList() : Arrays.asList(list)); + value = getInternal(queryData.getTenant(), queryData.getNamespace(), queryData.getKey(), String[].class, + hints); } + + return ConfigurationUtils.getCommaSeparatedList(value); + } catch (Exception exception) { exception.printStackTrace(); } + return null; } + private Hint[] getHints(ConfigurationQuery query) { + List<Hint> hints = new ArrayList<>(Hint.values().length); + hints.add(query.isLatest() ? Hint.LATEST_LOOKUP : Hint.DEFAULT); + hints.add(query.isExternalLookup() ? Hint.EXTERNAL_LOOKUP : Hint.DEFAULT); + hints.add(query.isNodeSpecific() ? Hint.NODE_SPECIFIC : Hint.DEFAULT); + return hints.toArray(new Hint[0]); + } + private Object getInput(Map<String, Object> input) { Object toReturn = null; try { + toReturn = Class.forName(input.get("ImplClass").toString()).newInstance(); + Method[] methods = toReturn.getClass().getMethods(); for (Method method : methods) { if (input.containsKey(method.getName())) { method.invoke(toReturn, input.get(method.getName())); } } + } catch (Exception exception) { exception.printStackTrace(); } @@ -104,16 +107,21 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con } private Map<String, String> listConfiguration(ConfigurationQuery query) { + Map<String, String> map = new HashMap<>(); + try { + Collection<String> keys = getKeys(query.getTenant(), query.getNamespace()); for (String key : keys) { map.put(key, getConfigurationValue(query.key(key))); } + } catch (Exception exception) { exception.printStackTrace(); return null; } + return map; } @@ -122,13 +130,16 @@ public final class CliConfigurationImpl extends ConfigurationImpl implements Con ArrayList<String> keys = new ArrayList<>(); try { + Iterator<String> iter = ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace).getKeys(); while (iter.hasNext()) { + String key = iter.next(); - if (!(key.equals(NAMESPACE_KEY) || key.equals(MODE_KEY) || key.equals(LOAD_ORDER_KEY))) { + if (!KEYS_TO_FILTER.contains(key)) { keys.add(key); } } + } catch (Exception exception) { //do nothing } diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java index 9a93801144..8f8a39d82c 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java @@ -16,6 +16,8 @@ package org.onap.config.impl; +import static org.onap.config.ConfigurationUtils.isBlank; + import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -40,8 +42,6 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { private static final String KEY_CANNOT_BE_NULL = "Key can't be null."; - private static final ThreadLocal<String> TENANT = ThreadLocal.withInitial(() -> Constants.DEFAULT_TENANT); - private static final Object LOCK = new Object(); private static boolean instantiated = false; @@ -55,8 +55,8 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { private void init() throws Exception { - if (instantiated || !CliConfigurationImpl.class.isAssignableFrom(this.getClass())) { - throw new RuntimeException("Illegal access to configuration."); + if (instantiated) { + return; } Map<String, AggregateConfiguration> moduleConfigStore = new HashMap<>(); @@ -76,7 +76,7 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { } } String configLocation = System.getProperty("config.location"); - if (configLocation != null && configLocation.trim().length() > 0) { + if (!isBlank(configLocation)) { File root = new File(configLocation); Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); Predicate<File> filePredicate = ConfigurationUtils::isConfig; @@ -95,7 +95,7 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { } } String tenantConfigLocation = System.getProperty("tenant.config.location"); - if (tenantConfigLocation != null && tenantConfigLocation.trim().length() > 0) { + if (!isBlank(tenantConfigLocation)) { File root = new File(tenantConfigLocation); Collection<File> tenantsRoot = ConfigurationUtils.getAllFiles(root, false, true); Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); @@ -122,7 +122,7 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { populateFinalConfigurationIncrementally(moduleConfigStore); String nodeConfigLocation = System.getProperty("node.config.location"); - if (nodeConfigLocation != null && nodeConfigLocation.trim().length() > 0) { + if (!isBlank(nodeConfigLocation)) { File root = new File(nodeConfigLocation); Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); Predicate<File> filePredicate = ConfigurationUtils::isConfig; @@ -201,16 +201,8 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { @Override public <T> Map<String, T> populateMap(String tenantId, String namespace, String key, Class<T> clazz) { - if (tenantId == null || tenantId.trim().length() == 0) { - tenantId = TENANT.get(); - } else { - tenantId = tenantId.toUpperCase(); - } - if (namespace == null || namespace.trim().length() == 0) { - namespace = Constants.DEFAULT_NAMESPACE; - } else { - namespace = namespace.toUpperCase(); - } + tenantId = calculateTenant(tenantId); + namespace = calculateNamespace(namespace); Map<String, T> map = new HashMap<>(); Iterator<String> keys; try { @@ -234,21 +226,14 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { @Override public Map generateMap(String tenantId, String namespace, String key) { - if (tenantId == null || tenantId.trim().length() == 0) { - tenantId = TENANT.get(); - } else { - tenantId = tenantId.toUpperCase(); - } - if (namespace == null || namespace.trim().length() == 0) { - namespace = Constants.DEFAULT_NAMESPACE; - } else { - namespace = namespace.toUpperCase(); - } + tenantId = calculateTenant(tenantId); + namespace = calculateNamespace(namespace); + Map map; Map parentMap = new HashMap<>(); Iterator<String> keys; try { - if (key == null || key.trim().length() == 0) { + if (isBlank(key)) { keys = ConfigurationRepository.lookup().getConfigurationFor(tenantId, namespace).getKeys(); } else { keys = ConfigurationRepository.lookup().getConfigurationFor(tenantId, namespace).getKeys(key); @@ -257,11 +242,11 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { map = parentMap; String k = keys.next(); - if (key != null && key.trim().length() != 0 && !k.startsWith(key + ".")) { + if (!isBlank(key) && !k.startsWith(key + ".")) { continue; } String value = getAsString(tenantId, namespace, k); - if (key != null && key.trim().length() != 0 && k.startsWith(key + ".")) { + if (!isBlank(key) && k.startsWith(key + ".")) { k = k.substring(key.trim().length() + 1); } @@ -292,22 +277,17 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { } } - if (tenant == null || tenant.trim().length() == 0) { - tenant = TENANT.get(); - } else { - tenant = tenant.toUpperCase(); - } - if (namespace == null || namespace.trim().length() == 0) { - namespace = Constants.DEFAULT_NAMESPACE; - } else { - namespace = namespace.toUpperCase(); - } - if ((key == null || key.trim().length() == 0) && !clazz.isAnnotationPresent(Config.class)) { + tenant = calculateTenant(tenant); + namespace = calculateNamespace(namespace); + + if (isBlank(key) && !clazz.isAnnotationPresent(Config.class)) { throw new IllegalArgumentException(KEY_CANNOT_BE_NULL); } + if (clazz == null) { throw new IllegalArgumentException("clazz is null."); } + if (clazz.isPrimitive()) { clazz = getWrapperClass(clazz); } @@ -351,8 +331,7 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { return null; } } else if (clazz.isAnnotationPresent(Config.class)) { - return read(tenant, namespace, clazz, (key == null || key.trim().length() == 0) ? "" : (key + "."), - hints); + return read(tenant, namespace, clazz, isBlank(key) ? "" : (key + "."), hints); } else { throw new IllegalArgumentException( "Only primitive classes, wrapper classes, corresponding array classes and any " @@ -364,6 +343,24 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { return null; } + private static String calculateNamespace(String namespace) { + + if (isBlank(namespace)) { + return Constants.DEFAULT_NAMESPACE; + } + + return namespace.toUpperCase(); + } + + private static String calculateTenant(String tenant) { + + if (isBlank(tenant)) { + return Constants.DEFAULT_TENANT; + } + + return tenant.toUpperCase(); + } + private <T> T read(String tenant, String namespace, Class<T> clazz, String keyPrefix, Hint... hints) throws Exception { Config confAnnotation = clazz.getAnnotation(Config.class); @@ -448,11 +445,13 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { } private <T> T getValue(Object obj, Class<T> clazz, int processingHint) { + if (obj == null || obj.toString().trim().length() == 0) { return null; } else { obj = obj.toString().trim(); } + if (String.class.equals(clazz)) { if (obj.toString().startsWith("@") && ConfigurationUtils.isExternalLookup(processingHint)) { String contents = ConfigurationUtils.getFileContents( @@ -535,9 +534,9 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration { return (T[]) obj; } - private <T> Collection<T> convert(String commaSaperatedValues, Class<T> clazz, int processingHints) { + private <T> Collection<T> convert(String commaSeparatedValues, Class<T> clazz, int processingHints) { ArrayList<T> collection = new ArrayList<>(); - for (String value : commaSaperatedValues.split(",")) { + for (String value : commaSeparatedValues.split(",")) { try { T type1 = getValue(value, clazz, processingHints); if (type1 != null) { diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java index 5b950d1af6..5863caef68 100644 --- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java +++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationRepository.java @@ -18,7 +18,6 @@ package org.onap.config.impl; import java.io.File; import java.sql.Timestamp; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -31,7 +30,6 @@ import org.apache.commons.configuration2.Configuration; import org.apache.commons.configuration2.FileBasedConfiguration; import org.apache.commons.configuration2.builder.BasicConfigurationBuilder; import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; -import org.apache.commons.configuration2.ex.ConfigurationException; import org.onap.config.ConfigurationUtils; import org.onap.config.Constants; @@ -105,29 +103,16 @@ public final class ConfigurationRepository { } public void populateOverrideConfiguration(String key, File file) { + ConfigurationHolder holder = store.get(key); + if (holder == null) { holder = new ConfigurationHolder(new CombinedConfiguration()); store.put(key, holder); } - holder.addOverrideConfiguration(file.getAbsolutePath(), ConfigurationUtils.getConfigurationBuilder(file, true)); - populateTenantsNamespace(key); - } - public void refreshOverrideConfigurationFor(String key, int index) { - ConfigurationHolder holder = store.get(key); - if (holder != null) { - holder.refreshOverrideConfiguration(index); - } - } - - public void removeOverrideConfiguration(File file) { - for (String s : (Iterable<String>) new ArrayList(store.keySet())) { - ConfigurationHolder holder = store.get(s); - if (holder.containsOverrideConfiguration(file.getAbsolutePath())) { - holder.removeOverrideConfiguration(file.getAbsolutePath()); - } - } + holder.addOverrideConfiguration(file.getAbsolutePath(), ConfigurationUtils.getConfigurationBuilder(file)); + populateTenantsNamespace(key); } private class ConfigurationHolder { @@ -147,20 +132,6 @@ public final class ConfigurationRepository { this.config = builder; } - public void refreshOverrideConfiguration(int index) { - int count = -1; - for (FileBasedConfigurationBuilder overrides : overrideConfiguration.values()) { - try { - if (++count == index) { - overrides.save(); - overrides.resetResult(); - } - } catch (ConfigurationException exception) { - //do nothing - } - } - } - public void addOverrideConfiguration(String path, BasicConfigurationBuilder<FileBasedConfiguration> builder) { overrideConfiguration.put(path.toUpperCase(), (FileBasedConfigurationBuilder) builder); getEffectiveConfiguration(config, overrideConfiguration.values()); @@ -181,15 +152,6 @@ public final class ConfigurationRepository { } } - public void removeOverrideConfiguration(String path) { - overrideConfiguration.remove(path.toUpperCase()); - getEffectiveConfiguration(config, overrideConfiguration.values()); - } - - public boolean containsOverrideConfiguration(String path) { - return overrideConfiguration.containsKey(path.toUpperCase()); - } - public Configuration getConfiguration(String namespace) throws Exception { if (config == null) { |