summaryrefslogtreecommitdiffstats
path: root/common/onap-common-configuration-management
diff options
context:
space:
mode:
Diffstat (limited to 'common/onap-common-configuration-management')
-rw-r--r--common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java128
-rw-r--r--common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationImpl.java690
-rw-r--r--common/onap-common-configuration-management/onap-configuration-management-core/src/test/java/org/onap/config/ConfigurationUtilsTest.java113
3 files changed, 574 insertions, 357 deletions
diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java
index 17e9ef048f..85698e89de 100644
--- a/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java
+++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/ConfigurationUtils.java
@@ -45,6 +45,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
+import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -77,6 +78,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;
+import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -92,14 +94,14 @@ public class ConfigurationUtils {
private static final String CONFIGURATION_TYPE_NOT_SUPPORTED = "Configuration type not supported:";
- private static final Map<Class, Class> ARRAY_CLASS_MAP;
+ private static final Map<Class<?>, Class<?>> ARRAY_CLASS_MAP;
private static final String CONFIG_REGEX_TPL_OPT_1 = "CONFIG(-\\w*){0,1}(-(%s|%s|%s)){0,1}\\.(%s|%s|%s|%s)$";
private static final String CONFIG_REGEX_TPL_OPT_2 = "CONFIG(.)*\\.(%s|%s|%s|%s)$";
static {
- Map<Class, Class> arrayTypes = new HashMap<>();
+ Map<Class<?>, Class<?>> arrayTypes = new HashMap<>();
arrayTypes.put(Byte.class, Byte[].class);
arrayTypes.put(Short.class, Short[].class);
arrayTypes.put(Integer.class, Integer[].class);
@@ -307,7 +309,7 @@ public class ConfigurationUtils {
return Optional.ofNullable(configurationMode);
}
- public static Class getCollectionGenericType(Field field) {
+ public static Class<?> getCollectionGenericType(Field field) {
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
@@ -327,12 +329,74 @@ public class ConfigurationUtils {
return String[].class;
}
- public static boolean isWrapperClass(Class clazz) {
- return clazz == String.class || clazz == Boolean.class || clazz == Character.class
- || Number.class.isAssignableFrom(clazz);
+ public static boolean isWrapperClass(Class<?> clazz) {
+ Predicate<Class<?>> predicateWrapper = type -> type == String.class || type == Boolean.class || type == Character.class
+ || Number.class.isAssignableFrom(type);
+ return isA(predicateWrapper, clazz);
}
- public static Class getArrayClass(Class clazz) {
+ public static boolean isAPrimitive(Class<?> clazz) {
+ return isA(Class::isPrimitive, clazz);
+ }
+
+ /**
+ * Check if clazz implementing Map iface
+ */
+ public static boolean isAMap(Class<?> clazz) {
+ Predicate<Class<?>> predicateMap = Map.class::isAssignableFrom;
+ return isA(predicateMap, clazz);
+ }
+
+ /**
+ * Check if clazz implementing Collection iface
+ */
+ public static boolean isACollection(Class<?> clazz) {
+ Predicate<Class<?>> predicateCollection = Collection.class::isAssignableFrom;
+ return isA(predicateCollection, clazz);
+ }
+
+ /**
+ * Check if clazz is a primitive or primitive wrapper
+ */
+ public static boolean isAPrimitiveOrWrapper(Class<?> clazz) {
+ Predicate<Class<?>> predicatePrimitive = Class::isPrimitive;
+ Predicate<Class<?>> predicateWrapper = ConfigurationUtils::isWrapperClass;
+ return isA(predicatePrimitive.or(predicateWrapper), clazz);
+ }
+
+ /**
+ * Check if clazz is array of primitives or array of primitives wrappers
+ */
+ public static boolean isAPrimitivesOrWrappersArray(Class<?> clazz) {
+ Predicate<Class<?>> predicatePrimitivesOrWrappersArray =
+ type -> ConfigurationUtils.isAWrappersArray(type) || ConfigurationUtils.isAPrimitivesArray(type);
+ return isA(predicatePrimitivesOrWrappersArray, clazz);
+
+ }
+
+ /**
+ * Check is clazz is array of primitives
+ */
+ public static boolean isAPrimitivesArray(Class<?> clazz) {
+ Predicate<Class<?>> predicateArray = Class::isArray;
+ Predicate<Class<?>> predicateComponentPrimitive = type -> type.getComponentType().isPrimitive();
+ return isA(predicateArray.and(predicateComponentPrimitive), clazz);
+ }
+
+ /**
+ * Check is clazz is array of primitives wrappers
+ */
+ public static boolean isAWrappersArray(Class<?> clazz) {
+ Predicate<Class<?>> predicateArray = Class::isArray;
+ Predicate<Class<?>> predicateComponentWrapper = type -> isWrapperClass(type.getComponentType());
+ return isA(predicateArray.and(predicateComponentWrapper), clazz);
+ }
+
+ private static boolean isA(Predicate<Class<?>> predicate, Class<?> clazz) {
+ return predicate.test(clazz);
+ }
+
+ public static Class<?> getArrayClass(Class<?> clazz) {
return ARRAY_CLASS_MAP.getOrDefault(clazz, null);
}
@@ -399,7 +463,7 @@ public class ConfigurationUtils {
return objToReturn;
}
- public static Object getPrimitiveArray(Collection collection, Class clazz) {
+ public static Object getPrimitiveArray(Collection<?> collection, Class<?> clazz) {
switch (clazz.getName()) {
case "int":
return getIntsPrimitiveArray(collection);
@@ -415,11 +479,24 @@ public class ConfigurationUtils {
return getDoublesPrimitiveArray(collection);
case "boolean":
return getBooleansPrimitiveArray(collection);
+ case "char":
+ return getCharsPrimitiveArray(collection);
default:
return null;
}
}
+ public static Object getWrappersArray(Collection<?> collection, Class<?> clazz) {
+ Object array = null;
+ if (isWrapperClass(clazz)){
+ int collectionSize = collection.size();
+ array = Array.newInstance(clazz, collection.size());
+ Object[] objArray = collection.toArray();
+ System.arraycopy(objArray, 0, array, 0, collectionSize);
+ }
+ return array;
+ }
+
public static String getCollectionString(String input) {
Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
Matcher matcher = pattern.matcher(input);
@@ -473,7 +550,7 @@ public class ConfigurationUtils {
return null;
}
- public static Object getDefaultFor(Class clazz) {
+ public static Object getDefaultFor(Class<?> clazz) {
if (byte.class == clazz) {
return new Byte("0");
} else if (short.class == clazz) {
@@ -492,7 +569,7 @@ public class ConfigurationUtils {
return (char) 0;
}
- public static Collection getCompatibleCollectionForAbstractDef(Class clazz) {
+ public static Collection getCompatibleCollectionForAbstractDef(Class<?> clazz) {
if (TransferQueue.class.isAssignableFrom(clazz)) {
return getConcreteCollection(TransferQueue.class);
}
@@ -518,7 +595,7 @@ public class ConfigurationUtils {
+ "assignable from TransferQueue, BlockingQueue, Deque, Queue, SortedSet, Set, List class");
}
- public static Collection getConcreteCollection(Class clazz) {
+ public static Collection getConcreteCollection(Class<?> clazz) {
switch (clazz.getName()) {
case "java.util.Collection":
case "java.util.List":
@@ -639,8 +716,8 @@ public class ConfigurationUtils {
return (hints & EXTERNAL_LOOKUP.value()) == EXTERNAL_LOOKUP.value();
}
- public static boolean isZeroLengthArray(Class clazz, Object obj) {
- if (clazz.isArray() && clazz.getComponentType().isPrimitive()) {
+ public static boolean isZeroLengthArray(Class<?> clazz, Object obj) {
+ if (isAPrimitivesArray(clazz)) {
if (clazz.getComponentType() == int.class) {
return ((int[]) obj).length == 0;
} else if (clazz.getComponentType() == byte.class) {
@@ -669,7 +746,7 @@ public class ConfigurationUtils {
// private methods section starts here
- private static int[] getIntsPrimitiveArray(Collection collection) {
+ private static int[] getIntsPrimitiveArray(Collection<?> collection) {
int collectionSize = collection.size();
int[] array = new int[collectionSize];
Object[] objArray = collection.toArray();
@@ -679,7 +756,7 @@ public class ConfigurationUtils {
return array;
}
- private static byte[] getBytesPrimitiveArray(Collection collection) {
+ private static byte[] getBytesPrimitiveArray(Collection<?> collection) {
int collectionSize = collection.size();
byte[] array = new byte[collectionSize];
Object[] objArray = collection.toArray();
@@ -689,7 +766,7 @@ public class ConfigurationUtils {
return array;
}
- private static short[] getShortsPrimitiveArray(Collection collection) {
+ private static short[] getShortsPrimitiveArray(Collection<?> collection) {
int collectionSize = collection.size();
short[] array = new short[collectionSize];
Object[] objArray = collection.toArray();
@@ -699,7 +776,7 @@ public class ConfigurationUtils {
return array;
}
- private static long[] getLongsPrimitiveArray(Collection collection) {
+ private static long[] getLongsPrimitiveArray(Collection<?> collection) {
int collectionSize = collection.size();
long[] array = new long[collectionSize];
Object[] objArray = collection.toArray();
@@ -709,7 +786,7 @@ public class ConfigurationUtils {
return array;
}
- private static float[] getFloatsPrimitiveArray(Collection collection) {
+ private static float[] getFloatsPrimitiveArray(Collection<?> collection) {
int collectionSize = collection.size();
float[] array = new float[collectionSize];
Object[] objArray = collection.toArray();
@@ -719,7 +796,7 @@ public class ConfigurationUtils {
return array;
}
- private static double[] getDoublesPrimitiveArray(Collection collection) {
+ private static double[] getDoublesPrimitiveArray(Collection<?> collection) {
int collectionSize = collection.size();
double[] array = new double[collectionSize];
Object[] objArray = collection.toArray();
@@ -729,7 +806,7 @@ public class ConfigurationUtils {
return array;
}
- private static boolean[] getBooleansPrimitiveArray(Collection collection) {
+ private static boolean[] getBooleansPrimitiveArray(Collection<?> collection) {
int collectionSize = collection.size();
boolean[] array = new boolean[collectionSize];
Object[] objArray = collection.toArray();
@@ -738,4 +815,15 @@ public class ConfigurationUtils {
}
return array;
}
+
+ private static char[] getCharsPrimitiveArray(Collection<?> collection) {
+ int collectionSize = collection.size();
+ char[] array = new char[collectionSize];
+ Object[] objArray = collection.toArray();
+ for (int i = 0; i < collectionSize; i++) {
+ array[i] = (char) objArray[i];
+ }
+ return array;
+ }
+
}
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 d13d5f7b92..0a5a141f09 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
@@ -27,12 +27,16 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.onap.config.ConfigurationUtils;
import org.onap.config.Constants;
@@ -47,116 +51,21 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationImpl.class);
private static final String KEY_CANNOT_BE_NULL = "Key can't be null.";
-
private static final NonConfigResource NON_CONFIG_RESOURCE = new NonConfigResource();
+ private static final Map<String, AggregateConfiguration> MODULE_CONFIG_STORE = new HashMap<>();
static {
-
- try {
- init();
- } catch (ConfigurationException e) {
- throw new IllegalStateException("Failed to initialize configuration", e);
- }
- }
-
- private static void init() throws ConfigurationException {
-
- Map<String, AggregateConfiguration> moduleConfigStore = new HashMap<>();
- List<URL> classpathResources = ConfigurationUtils.getAllClassPathResources();
- Predicate<URL> predicate = ConfigurationUtils::isConfig;
- for (URL url : classpathResources) {
- if (predicate.test(url)) {
- String moduleName = ConfigurationUtils.getConfigurationRepositoryKey(url);
- AggregateConfiguration moduleConfig = moduleConfigStore.get(moduleName);
- if (moduleConfig == null) {
- moduleConfig = new AggregateConfiguration();
- moduleConfigStore.put(moduleName, moduleConfig);
- }
- moduleConfig.addConfig(url);
- } else {
- NON_CONFIG_RESOURCE.add(url);
- }
- }
- String configLocation = System.getProperty("config.location");
- if (!isBlank(configLocation)) {
- File root = new File(configLocation);
- Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false);
- Predicate<File> filePredicate = ConfigurationUtils::isConfig;
- for (File file : filesystemResources) {
- if (filePredicate.test(file)) {
- String moduleName = ConfigurationUtils.getConfigurationRepositoryKey(file);
- AggregateConfiguration moduleConfig = moduleConfigStore.get(moduleName);
- if (moduleConfig == null) {
- moduleConfig = new AggregateConfiguration();
- moduleConfigStore.put(moduleName, moduleConfig);
- }
- moduleConfig.addConfig(file);
- } else {
- NON_CONFIG_RESOURCE.add(file);
- }
- }
- }
- String tenantConfigLocation = System.getProperty("tenant.config.location");
- if (!isBlank(tenantConfigLocation)) {
- File root = new File(tenantConfigLocation);
- Collection<File> tenantsRoot = ConfigurationUtils.getAllFiles(root, false, true);
- Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false);
- Predicate<File> filePredicate = ConfigurationUtils::isConfig;
- for (File file : filesystemResources) {
- if (filePredicate.test(file)) {
- String moduleName = ConfigurationUtils.getNamespace(file);
- for (File tenantFileRoot : tenantsRoot) {
- if (file.getAbsolutePath().startsWith(tenantFileRoot.getAbsolutePath())) {
- moduleName = ConfigurationUtils.getConfigurationRepositoryKey(
- (tenantFileRoot.getName().toUpperCase() + Constants.TENANT_NAMESPACE_SEPARATOR
- + moduleName).split(Constants.TENANT_NAMESPACE_SEPARATOR));
- }
- }
- AggregateConfiguration moduleConfig = moduleConfigStore.get(moduleName);
- if (moduleConfig == null) {
- moduleConfig = new AggregateConfiguration();
- moduleConfigStore.put(moduleName, moduleConfig);
- }
- moduleConfig.addConfig(file);
- }
- }
- }
-
- populateFinalConfigurationIncrementally(moduleConfigStore);
- String nodeConfigLocation = System.getProperty("node.config.location");
- if (!isBlank(nodeConfigLocation)) {
- File root = new File(nodeConfigLocation);
- Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false);
- Predicate<File> filePredicate = ConfigurationUtils::isConfig;
- for (File file : filesystemResources) {
- if (filePredicate.test(file)) {
- ConfigurationRepository.lookup().populateOverrideConfiguration(
- ConfigurationUtils.getConfigurationRepositoryKey(
- ConfigurationUtils.getNamespace(file).split(Constants.TENANT_NAMESPACE_SEPARATOR)),
- file);
- }
- }
- }
- }
-
- private static void populateFinalConfigurationIncrementally(Map<String, AggregateConfiguration> configs) {
-
- if (configs.get(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE) != null) {
- ConfigurationRepository.lookup().populateConfiguration(
- Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE,
- configs.remove(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE)
- .getFinalConfiguration());
- }
-
- Set<String> modules = configs.keySet();
- for (String module : modules) {
- ConfigurationRepository.lookup().populateConfiguration(module, configs.get(module).getFinalConfiguration());
+ if (!loadClassPathConfigurationsAndResources()
+ || !loadAdditionalConfigurationsAndResources()
+ || !loadTenantConfigurations()) {
+ throw new IllegalStateException("Failed to initialize configuration");
}
+ populateFinalConfigurationIncrementally(MODULE_CONFIG_STORE);
+ loadNodeSpecificConfigurations();
}
@Override
public <T> T get(String tenant, String namespace, String key, Class<T> clazz, Hint... hints) {
-
String[] tenantNamespaceArray;
if (tenant == null && namespace != null) {
tenantNamespaceArray = namespace.split(Constants.TENANT_NAMESPACE_SEPARATOR);
@@ -166,57 +75,46 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
}
}
- tenant = ConfigurationRepository.lookup().isValidTenant(tenant) ? tenant.toUpperCase()
- : Constants.DEFAULT_TENANT;
- namespace = ConfigurationRepository.lookup().isValidNamespace(namespace) ? namespace.toUpperCase()
- : Constants.DEFAULT_NAMESPACE;
+ tenant = ConfigurationRepository.lookup().isValidTenant(tenant) ? tenant.toUpperCase() : Constants.DEFAULT_TENANT;
+ namespace = ConfigurationRepository.lookup().isValidNamespace(namespace) ? namespace.toUpperCase() : Constants.DEFAULT_NAMESPACE;
+ hints = hints == null || hints.length == 0 ? new Hint[]{Hint.EXTERNAL_LOOKUP, Hint.NODE_SPECIFIC} : hints;
T returnValue;
- returnValue = (T) getInternal(tenant, namespace, key, clazz.isPrimitive() ? getWrapperClass(clazz) : clazz,
- hints == null || hints.length == 0 ? new Hint[] {Hint.EXTERNAL_LOOKUP, Hint.NODE_SPECIFIC} : hints);
+ returnValue = getInternal(tenant, namespace, key, clazz, hints);
if ((returnValue == null || ConfigurationUtils.isZeroLengthArray(clazz, returnValue))
- && !Constants.DEFAULT_TENANT.equals(tenant)) {
- returnValue = (T) getInternal(Constants.DEFAULT_TENANT, namespace, key,
- clazz.isPrimitive() ? getWrapperClass(clazz) : clazz,
- hints == null || hints.length == 0 ? new Hint[] {Hint.EXTERNAL_LOOKUP, Hint.NODE_SPECIFIC} : hints);
+ && !Constants.DEFAULT_TENANT.equals(tenant)) {
+ returnValue = getInternal(Constants.DEFAULT_TENANT, namespace, key, clazz, hints);
}
if ((returnValue == null || ConfigurationUtils.isZeroLengthArray(clazz, returnValue))
- && !Constants.DEFAULT_NAMESPACE.equals(namespace)) {
- returnValue = (T) getInternal(tenant, Constants.DEFAULT_NAMESPACE, key,
- clazz.isPrimitive() ? getWrapperClass(clazz) : clazz,
- hints == null || hints.length == 0 ? new Hint[] {Hint.EXTERNAL_LOOKUP, Hint.NODE_SPECIFIC} : hints);
+ && !Constants.DEFAULT_NAMESPACE.equals(namespace)) {
+ returnValue = getInternal(tenant, Constants.DEFAULT_NAMESPACE, key, clazz, hints);
}
if ((returnValue == null || ConfigurationUtils.isZeroLengthArray(clazz, returnValue))
- && !Constants.DEFAULT_NAMESPACE.equals(namespace) && !Constants.DEFAULT_TENANT.equals(tenant)) {
- returnValue = (T) getInternal(Constants.DEFAULT_TENANT, Constants.DEFAULT_NAMESPACE, key,
- clazz.isPrimitive() ? getWrapperClass(clazz) : clazz,
- hints == null || hints.length == 0 ? new Hint[] {Hint.EXTERNAL_LOOKUP, Hint.NODE_SPECIFIC} : hints);
+ && !Constants.DEFAULT_NAMESPACE.equals(namespace) && !Constants.DEFAULT_TENANT.equals(tenant)) {
+ returnValue = getInternal(Constants.DEFAULT_TENANT, Constants.DEFAULT_NAMESPACE, key, clazz, hints);
}
- if (returnValue == null && clazz.isPrimitive()) {
- return (T) ConfigurationUtils.getDefaultFor(clazz);
- } else {
- return returnValue;
+ if (returnValue == null && ConfigurationUtils.isAPrimitive(clazz)) {
+ returnValue = (T) ConfigurationUtils.getDefaultFor(clazz);
}
+ return returnValue;
}
@Override
public <T> Map<String, T> populateMap(String tenantId, String namespace, String key, Class<T> clazz) {
-
- tenantId = calculateTenant(tenantId);
- namespace = calculateNamespace(namespace);
+ final String calculatedTenantId = calculateTenant(tenantId);
+ final String calculatedNamespace = calculateNamespace(namespace);
Map<String, T> map = new HashMap<>();
Iterator<String> keys;
try {
- keys = ConfigurationRepository.lookup().getConfigurationFor(tenantId, namespace).getKeys(key);
- while (keys.hasNext()) {
- String k = keys.next();
+ keys = ConfigurationRepository.lookup().getConfigurationFor(calculatedTenantId, calculatedNamespace).getKeys(key);
+ keys.forEachRemaining(k -> {
if (k.startsWith(key + ".")) {
k = k.substring(key.length() + 1);
String subkey = k.substring(0, k.indexOf('.'));
if (!map.containsKey(subkey)) {
- map.put(subkey, get(tenantId, namespace, key + "." + subkey, clazz));
+ map.put(subkey, get(calculatedTenantId, calculatedNamespace, key + "." + subkey, clazz));
}
}
- }
+ });
} catch (Exception e) {
LOGGER.warn(
"Couldn't populate map fot tenant: {}, namespace: {}, key: {}, type: {}",
@@ -231,47 +129,23 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
}
@Override
- public Map generateMap(String tenantId, String namespace, String key) {
-
- tenantId = calculateTenant(tenantId);
- namespace = calculateNamespace(namespace);
-
- Map map;
- Map parentMap = new HashMap<>();
- Iterator<String> keys;
+ public Map<Object, Object> generateMap(String tenantId, String namespace, String key) {
+ final String calculatedTenantId = calculateTenant(tenantId);
+ final String calculatedNamespace = calculateNamespace(namespace);
+ Map<Object, Object> parentMap = new HashMap<>();
+ Iterator<String> configKeys;
try {
if (isBlank(key)) {
- keys = ConfigurationRepository.lookup().getConfigurationFor(tenantId, namespace).getKeys();
+ configKeys = ConfigurationRepository.lookup().getConfigurationFor(calculatedTenantId, calculatedNamespace).getKeys();
} else {
- keys = ConfigurationRepository.lookup().getConfigurationFor(tenantId, namespace).getKeys(key);
+ configKeys = ConfigurationRepository.lookup().getConfigurationFor(calculatedTenantId, calculatedNamespace).getKeys(key);
}
- while (keys.hasNext()) {
- map = parentMap;
- String k = keys.next();
-
- if (!isBlank(key) && !k.startsWith(key + ".")) {
- continue;
- }
- String value = getAsString(tenantId, namespace, k);
- if (!isBlank(key) && k.startsWith(key + ".")) {
- k = k.substring(key.trim().length() + 1);
+ configKeys.forEachRemaining(subKey -> {
+ if (!isBlank(key) && !subKey.startsWith(key + ".")) {
+ configKeys.remove();
}
-
- while (k.contains(".")) {
- if (k.contains(".")) {
- String subkey = k.substring(0, k.indexOf('.'));
- k = k.substring(k.indexOf('.') + 1);
- if (!map.containsKey(subkey)) {
- Map tmp = new HashMap();
- map.put(subkey, tmp);
- map = tmp;
- } else {
- map = (Map) map.get(subkey);
- }
- }
- }
- map.put(k, value);
- }
+ parseConfigSubKeys(subKey, key, calculatedTenantId, calculatedNamespace, parentMap);
+ });
} catch (Exception e) {
LOGGER.warn(
"Couldn't generate map fot tenant: {}, namespace: {}, key: {}",
@@ -284,6 +158,159 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
return parentMap;
}
+ private static boolean loadClassPathConfigurationsAndResources() {
+ List<URL> classpathResources = ConfigurationUtils.getAllClassPathResources();
+ Predicate<URL> predicate = ConfigurationUtils::isConfig;
+ Map<Boolean, List<URL>> resources = classpathResources.stream().collect(Collectors.partitioningBy(predicate));
+ List<URL> configResources = resources.get(true);
+ List<URL> nonConfigResources = resources.get(false);
+ AtomicReference<Boolean> successFlagHolder = new AtomicReference<>(true);
+
+ configResources.forEach(url -> successFlagHolder.set(setUpdateModuleConfigStore(url)));
+
+ nonConfigResources.forEach(NON_CONFIG_RESOURCE::add);
+
+ return successFlagHolder.get();
+ }
+
+ private static boolean loadAdditionalConfigurationsAndResources() {
+ String configLocation = System.getProperty("config.location");
+ AtomicReference<Boolean> successFlagHolder = new AtomicReference<>(true);
+ if (!isBlank(configLocation)) {
+ File root = new File(configLocation);
+ Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false);
+ Predicate<File> filePredicate = ConfigurationUtils::isConfig;
+ Map<Boolean, List<File>> resources = filesystemResources.stream().collect(Collectors.partitioningBy(filePredicate));
+ List<File> configResources = resources.get(true);
+ List<File> nonConfigResources = resources.get(false);
+
+ configResources.forEach(file -> successFlagHolder.set(setUpdateModuleConfigStore(file)));
+
+ nonConfigResources.forEach(NON_CONFIG_RESOURCE::add);
+ }
+ return successFlagHolder.get();
+ }
+
+ private static boolean loadTenantConfigurations() {
+ String tenantConfigLocation = System.getProperty("tenant.config.location");
+ AtomicReference<Boolean> successFlagHolder = new AtomicReference<>(true);
+ if (!isBlank(tenantConfigLocation)) {
+ File root = new File(tenantConfigLocation);
+ Collection<File> tenantsRoot = ConfigurationUtils.getAllFiles(root, false, true);
+ Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false);
+
+ Map<Boolean, List<File>> resources = filesystemResources.stream().collect(Collectors.partitioningBy(ConfigurationUtils::isConfig));
+ Collection<File> tenantResources = resources.get(true);
+
+ tenantResources.forEach(configFile -> {
+ AtomicReference<String> moduleNameHolder = new AtomicReference<>(ConfigurationUtils.getNamespace(configFile));
+ Predicate<File> startsWithRootPredicate = tenantRoot -> configFile.getAbsolutePath().startsWith(tenantRoot.getAbsolutePath());
+ Collection<File> matchesTenantRoot = tenantsRoot.stream().filter(startsWithRootPredicate).collect(Collectors.toCollection(ArrayList::new));
+ AtomicReference<String[]> altResource = new AtomicReference<>();
+ matchesTenantRoot.forEach(file -> altResource.set(
+ (file.getName().toUpperCase() + Constants.TENANT_NAMESPACE_SEPARATOR + moduleNameHolder.get())
+ .split(Constants.TENANT_NAMESPACE_SEPARATOR)
+ )
+ );
+ successFlagHolder.set(setUpdateModuleConfigStore(configFile, altResource.get()));
+ });
+ }
+ return successFlagHolder.get();
+ }
+
+ private static void loadNodeSpecificConfigurations() {
+ String nodeConfigLocation = System.getProperty("node.config.location");
+ if (!isBlank(nodeConfigLocation)) {
+ File root = new File(nodeConfigLocation);
+ Collection<File> filesystemResources = ConfigurationUtils.getAllFiles(root, true, false);
+ filesystemResources.stream().filter(ConfigurationUtils::isConfig).forEach(
+ file -> ConfigurationRepository.lookup().populateOverrideConfiguration(
+ ConfigurationUtils.getConfigurationRepositoryKey(
+ ConfigurationUtils.getNamespace(file).split(Constants.TENANT_NAMESPACE_SEPARATOR)), file)
+ );
+ }
+ }
+
+ private static void populateFinalConfigurationIncrementally(Map<String, AggregateConfiguration> configs) {
+ if (configs.get(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE) != null) {
+ ConfigurationRepository.lookup().populateConfiguration(
+ Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE,
+ configs.remove(Constants.DEFAULT_TENANT + Constants.KEY_ELEMENTS_DELIMITER + Constants.DB_NAMESPACE)
+ .getFinalConfiguration());
+ }
+ Set<String> modules = configs.keySet();
+ modules.forEach(
+ m -> ConfigurationRepository.lookup().populateConfiguration(m, configs.get(m).getFinalConfiguration())
+ );
+ }
+
+ private static <T> boolean setUpdateModuleConfigStore(T resource, String... namedResources) {
+ boolean success = true;
+ String moduleName;
+ try {
+ if (namedResources == null || namedResources.length == 0) {
+ moduleName = getConfigurationRepositoryKeyWrapper(resource);
+ } else {
+ moduleName = getConfigurationRepositoryKeyWrapper(namedResources);
+ }
+ moduleAddConfigWrapper(moduleName, resource);
+ } catch (Exception e) {
+ success = false;
+ LOGGER.error("Error occurred while processing config resource {}", resource, e);
+ }
+ return success;
+ }
+
+ private static <T> String getConfigurationRepositoryKeyWrapper(T resource) throws ConfigurationException {
+ switch (resource.getClass().getSimpleName()) {
+ case "URL":
+ return ConfigurationUtils.getConfigurationRepositoryKey((URL) resource);
+ case "File":
+ return ConfigurationUtils.getConfigurationRepositoryKey((File) resource);
+ case "String[]":
+ return ConfigurationUtils.getConfigurationRepositoryKey((String[]) resource);
+ default:
+ throw new ConfigurationException("Unsupported resource type.");
+ }
+ }
+
+ private static <T> void moduleAddConfigWrapper(String moduleName, T resource) throws ConfigurationException {
+ AggregateConfiguration moduleConfig = MODULE_CONFIG_STORE.get(moduleName);
+ if (moduleConfig == null) {
+ moduleConfig = new AggregateConfiguration();
+ MODULE_CONFIG_STORE.put(moduleName, moduleConfig);
+ }
+ switch (resource.getClass().getSimpleName()) {
+ case "URL":
+ moduleConfig.addConfig((URL) resource);
+ break;
+ case "File":
+ moduleConfig.addConfig((File) resource);
+ break;
+ default:
+ throw new ConfigurationException("Unsupported resource type.");
+ }
+ }
+
+ private void parseConfigSubKeys(String subKey, String keyPrefix, String tenantId, String namespace, Map<Object, Object> targetMap) {
+ String value = getAsString(tenantId, namespace, subKey);
+ if (!isBlank(keyPrefix) && subKey.startsWith(keyPrefix + ".")) {
+ subKey = subKey.substring(keyPrefix.trim().length() + 1);
+ }
+ while (subKey.contains(".")) {
+ String subSubKey = subKey.substring(0, subKey.indexOf('.'));
+ subKey = subKey.substring(subKey.indexOf('.') + 1);
+ if (!targetMap.containsKey(subSubKey)) {
+ Map<Object, Object> subMap = new HashMap<>();
+ targetMap.put(subSubKey, subMap);
+ targetMap = subMap;
+ } else {
+ targetMap = (Map<Object, Object>) targetMap.get(subSubKey);
+ }
+ }
+ targetMap.put(subKey, value);
+ }
+
protected <T> T getInternal(String tenant, String namespace, String key, Class<T> clazz, Hint... hints) {
int processingHints = Hint.DEFAULT.value();
if (hints != null) {
@@ -303,50 +330,16 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
throw new IllegalArgumentException("clazz is null.");
}
- if (clazz.isPrimitive()) {
+ if (ConfigurationUtils.isAPrimitive(clazz)) {
clazz = getWrapperClass(clazz);
}
try {
- if (ConfigurationUtils.isWrapperClass(clazz) || clazz.isPrimitive()) {
- Object obj = ConfigurationUtils.getProperty(
- ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace), key, processingHints);
- if (obj != null) {
- if (ConfigurationUtils.isCollection(obj.toString())) {
- obj = ConfigurationUtils.getCollectionString(obj.toString());
- }
- String value = obj.toString().split(",")[0];
- value = ConfigurationUtils.processVariablesIfPresent(tenant, namespace, value);
- return (T) getValue(value, clazz.isPrimitive() ? getWrapperClass(clazz) : clazz, processingHints);
- } else {
- return null;
- }
- } else if (clazz.isArray() && (clazz.getComponentType().isPrimitive() || ConfigurationUtils.isWrapperClass(
- clazz.getComponentType()))) {
- Object obj = ConfigurationUtils.getProperty(
- ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace), key, processingHints);
- if (obj != null) {
- Class componentClass = clazz.getComponentType();
- if (clazz.getComponentType().isPrimitive()) {
- componentClass = getWrapperClass(clazz.getComponentType());
- }
- String collString = ConfigurationUtils.getCollectionString(obj.toString());
- ArrayList<String> tempCollection = new ArrayList<>();
- for (String itemValue : collString.split(",")) {
- tempCollection.add(ConfigurationUtils.processVariablesIfPresent(tenant, namespace, itemValue));
- }
- Collection<T> collection =
- convert(ConfigurationUtils.getCollectionString(Arrays.toString(tempCollection.toArray())),
- componentClass, processingHints);
- if (clazz.getComponentType().isPrimitive()) {
- return (T) ConfigurationUtils.getPrimitiveArray(collection, clazz.getComponentType());
- } else {
- return (T) collection.toArray(getZeroLengthArrayFor(getWrapperClass(clazz.getComponentType())));
- }
- } else {
- return null;
- }
+ if (ConfigurationUtils.isWrapperClass(clazz)) {
+ return getWrapperTypeValue(tenant, namespace, key, clazz, processingHints);
+ } else if (ConfigurationUtils.isAPrimitivesOrWrappersArray(clazz)) {
+ return getArrayTypeValue(tenant, namespace, key, clazz, processingHints);
} else if (clazz.isAnnotationPresent(Config.class)) {
- return read(tenant, namespace, clazz, isBlank(key) ? "" : (key + "."), hints);
+ return getAnnotatedTypeValue(tenant, namespace, clazz, isBlank(key) ? "" : (key + "."), hints);
} else {
throw new IllegalArgumentException(
"Only primitive classes, wrapper classes, corresponding array classes and any "
@@ -365,6 +358,51 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
return null;
}
+ private <T> T getWrapperTypeValue(String tenant, String namespace, String key, Class<T> clazz, int processingHints) throws Exception {
+ Object obj = ConfigurationUtils.getProperty(
+ ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace), key, processingHints);
+ if (obj != null) {
+ if (ConfigurationUtils.isCollection(obj.toString())) {
+ obj = ConfigurationUtils.getCollectionString(obj.toString());
+ }
+ String value = ConfigurationUtils.processVariablesIfPresent(
+ tenant,
+ namespace,
+ obj.toString().split(",")[0]
+ );
+ return (T) getTypeValue(value, clazz, processingHints);
+ }
+ return null;
+ }
+
+ private <T> T getArrayTypeValue(String tenant, String namespace, String key, Class<T> clazz, int processingHints) throws Exception {
+ Object obj = ConfigurationUtils.getProperty(
+ ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace), key, processingHints);
+ if (obj != null) {
+ Class componentType = clazz.getComponentType();
+ if (ConfigurationUtils.isAPrimitivesArray(clazz)) {
+ componentType = getWrapperClass(componentType);
+ }
+ String collString = ConfigurationUtils.getCollectionString(obj.toString());
+ ArrayList<String> tempCollection = new ArrayList<>();
+ for (String itemValue : collString.split(",")) {
+ tempCollection.add(ConfigurationUtils.processVariablesIfPresent(tenant, namespace, itemValue));
+ }
+ Collection<T> collection = convert(
+ ConfigurationUtils.getCollectionString(Arrays.toString(tempCollection.toArray())),
+ (Class<T>) componentType,
+ processingHints
+ );
+ if (ConfigurationUtils.isAPrimitivesArray(clazz)) {
+ return (T) ConfigurationUtils.getPrimitiveArray(collection, componentType);
+ } else {
+ return (T) collection.toArray(getZeroLengthArrayFor(getWrapperClass(componentType)));
+ }
+ } else {
+ return null;
+ }
+ }
+
private static String calculateNamespace(String namespace) {
if (isBlank(namespace)) {
@@ -383,7 +421,7 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
return tenant.toUpperCase();
}
- private <T> T read(String tenant, String namespace, Class<T> clazz, String keyPrefix, Hint... hints)
+ private <T> T getAnnotatedTypeValue(String tenant, String namespace, Class<T> clazz, String keyPrefix, Hint... hints)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Config confAnnotation = clazz.getAnnotation(Config.class);
@@ -396,53 +434,72 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
Config fieldConfAnnotation = field.getAnnotation(Config.class);
+ Class<?> fieldType = field.getType();
if (fieldConfAnnotation != null) {
- if (field.getType().isPrimitive() || ConfigurationUtils.isWrapperClass(field.getType()) || (
- field.getType().isArray() && (field.getType().getComponentType().isPrimitive()
- || ConfigurationUtils.isWrapperClass(
- field.getType().getComponentType())))
- || field.getType().getAnnotation(Config.class) != null) {
- field.set(objToReturn,
- get(tenant, namespace, keyPrefix + fieldConfAnnotation.key(), field.getType(), hints));
- } else if (Collection.class.isAssignableFrom(field.getType())) {
- Object obj = get(tenant, namespace, keyPrefix + fieldConfAnnotation.key(),
- ConfigurationUtils.getArrayClass(ConfigurationUtils.getCollectionGenericType(field)),
- hints);
- if (obj != null) {
- List list = Arrays.asList((Object[]) obj);
- Class clazzToInstantiate;
- if (field.getType().isInterface()) {
- clazzToInstantiate = ConfigurationUtils.getConcreteCollection(field.getType()).getClass();
- } else if (Modifier.isAbstract(field.getType().getModifiers())) {
- clazzToInstantiate =
- ConfigurationUtils.getCompatibleCollectionForAbstractDef(field.getType())
- .getClass();
- } else {
- clazzToInstantiate = field.getType();
- }
- Constructor construct = getConstructorWithArguments(clazzToInstantiate, Collection.class);
-
- if (construct != null) {
- construct.setAccessible(true);
- field.set(objToReturn, construct.newInstance(list));
- } else {
- construct = getConstructorWithArguments(clazzToInstantiate, Integer.class,
- Boolean.class, Collection.class);
- if (construct != null) {
- construct.setAccessible(true);
- field.set(objToReturn, construct.newInstance(list.size(), true, list));
- }
- }
- }
- } else if (Map.class.isAssignableFrom(field.getType())) {
- field.set(objToReturn, generateMap(tenant, namespace, keyPrefix + fieldConfAnnotation.key()));
+ if (ConfigurationUtils.isAPrimitiveOrWrapper(fieldType) ||
+ ConfigurationUtils.isAPrimitivesOrWrappersArray(fieldType)) {
+ setPrimitiveField(field, objToReturn, tenant, namespace, keyPrefix, hints);
+ }
+ if (ConfigurationUtils.isACollection(fieldType)) {
+ setCollectionField(field, objToReturn, tenant, namespace, keyPrefix, hints);
+ }
+ if (ConfigurationUtils.isAMap(fieldType)) {
+ setMapField(field, objToReturn, tenant, namespace, keyPrefix);
}
}
}
return objToReturn;
}
- private Constructor getConstructorWithArguments(Class clazz, Class... classes) {
+ private void setPrimitiveField(Field field, Object objToReturn, String tenant, String namespace, String keyPrefix, Hint[] hints)
+ throws IllegalAccessException {
+ String fieldConfAnnotationKey = field.getAnnotation(Config.class).key();
+ Class<?> fieldType = field.getType();
+ field.set(objToReturn, get(tenant, namespace, keyPrefix + fieldConfAnnotationKey, fieldType, hints));
+ }
+
+ private void setMapField(Field field, Object objToReturn, String tenant, String namespace, String keyPrefix)
+ throws IllegalAccessException {
+ String fieldConfAnnotationKey = field.getAnnotation(Config.class).key();
+ field.set(objToReturn, generateMap(tenant, namespace, keyPrefix + fieldConfAnnotationKey));
+ }
+
+ private void setCollectionField(Field field, Object objToReturn, String tenant, String namespace, String keyPrefix, Hint[] hints)
+ throws IllegalAccessException, InvocationTargetException, InstantiationException {
+ String fieldConfAnnotationKey = field.getAnnotation(Config.class).key();
+ Class<?> fieldType = field.getType();
+ Object obj = get(tenant, namespace, keyPrefix + fieldConfAnnotationKey,
+ ConfigurationUtils.getArrayClass(ConfigurationUtils.getCollectionGenericType(field)),
+ hints);
+ if (obj != null) {
+ List<Object> list = Arrays.asList((Object[]) obj);
+ Class clazzToInstantiate;
+ if (fieldType.isInterface()) {
+ clazzToInstantiate = ConfigurationUtils.getConcreteCollection(fieldType).getClass();
+ } else if (Modifier.isAbstract(fieldType.getModifiers())) {
+ clazzToInstantiate =
+ ConfigurationUtils.getCompatibleCollectionForAbstractDef(fieldType)
+ .getClass();
+ } else {
+ clazzToInstantiate = fieldType;
+ }
+ Constructor construct = getConstructorWithArguments(clazzToInstantiate, Collection.class);
+
+ if (construct != null) {
+ construct.setAccessible(true);
+ field.set(objToReturn, construct.newInstance(list));
+ } else {
+ construct = getConstructorWithArguments(clazzToInstantiate, Integer.class,
+ Boolean.class, Collection.class);
+ if (construct != null) {
+ construct.setAccessible(true);
+ field.set(objToReturn, construct.newInstance(list.size(), true, list));
+ }
+ }
+ }
+ }
+
+ private Constructor getConstructorWithArguments(Class<?> clazz, Class<?>... classes) {
try {
return clazz.getDeclaredConstructor(classes);
} catch (Exception exception) {
@@ -451,7 +508,7 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
}
}
- private Class getWrapperClass(Class clazz) {
+ private Class getWrapperClass(Class<?> clazz) {
if (byte.class == clazz) {
return Byte.class;
} else if (short.class == clazz) {
@@ -472,101 +529,82 @@ public class ConfigurationImpl implements org.onap.config.api.Configuration {
return clazz;
}
- private <T> T getValue(Object obj, Class<T> clazz, int processingHint) {
-
+ private <T> T getTypeValue(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(
- NON_CONFIG_RESOURCE.locate(obj.toString().substring(1).trim()));
- if (contents == null) {
- contents = ConfigurationUtils.getFileContents(obj.toString().substring(1).trim());
- }
- if (contents != null) {
- obj = contents;
- }
- }
- return (T) obj.toString();
- } else if (Number.class.isAssignableFrom(clazz)) {
- Double doubleValue = Double.valueOf(obj.toString());
- switch (clazz.getName()) {
- case "java.lang.Byte":
- Byte byteVal = doubleValue.byteValue();
- return (T) byteVal;
- case "java.lang.Short":
- Short shortVal = doubleValue.shortValue();
- return (T) shortVal;
- case "java.lang.Integer":
- Integer intVal = doubleValue.intValue();
- return (T) intVal;
- case "java.lang.Long":
- Long longVal = doubleValue.longValue();
- return (T) longVal;
- case "java.lang.Float":
- Float floatVal = doubleValue.floatValue();
- return (T) floatVal;
- case "java.lang.Double":
- return (T) doubleValue;
- default:
- }
- } else if (Boolean.class.equals(clazz)) {
+ return getValueForStringType(obj, processingHint);
+ }
+ if (Number.class.isAssignableFrom(clazz)) {
+ return getValueForNumbersType(obj, clazz);
+ }
+ if (Boolean.class.equals(clazz)) {
return (T) Boolean.valueOf(obj.toString());
- } else if (Character.class.equals(clazz)) {
+ }
+ if (Character.class.equals(clazz)) {
return (T) Character.valueOf(obj.toString().charAt(0));
}
return null;
}
+ private <T> T getValueForStringType(Object obj, int processingHint) {
+ if (obj.toString().startsWith("@") && ConfigurationUtils.isExternalLookup(processingHint)) {
+ String subString = obj.toString().substring(1).trim();
+ String contents = ConfigurationUtils.getFileContents(
+ NON_CONFIG_RESOURCE.locate(subString));
+ if (contents == null) {
+ contents = ConfigurationUtils.getFileContents(subString);
+ }
+ if (contents != null) {
+ obj = contents;
+ }
+ }
+ return (T) obj.toString();
+ }
+
+ private <T> T getValueForNumbersType(Object obj, Class<T> clazz) {
+ Double doubleValue = Double.valueOf(obj.toString());
+ switch (clazz.getName()) {
+ case "java.lang.Byte":
+ Byte byteVal = doubleValue.byteValue();
+ return (T) byteVal;
+ case "java.lang.Short":
+ Short shortVal = doubleValue.shortValue();
+ return (T) shortVal;
+ case "java.lang.Integer":
+ Integer intVal = doubleValue.intValue();
+ return (T) intVal;
+ case "java.lang.Long":
+ Long longVal = doubleValue.longValue();
+ return (T) longVal;
+ case "java.lang.Float":
+ Float floatVal = doubleValue.floatValue();
+ return (T) floatVal;
+ case "java.lang.Double":
+ return (T) doubleValue;
+ default:
+ return null;
+ }
+ }
+
private <T> T[] getZeroLengthArrayFor(Class<T> clazz) {
- Object obj = null;
- if (clazz == int.class) {
- obj = new int[] {};
- } else if (clazz == byte.class) {
- obj = new byte[] {};
- } else if (clazz == short.class) {
- obj = new short[] {};
- } else if (clazz == long.class) {
- obj = new long[] {};
- } else if (clazz == float.class) {
- obj = new float[] {};
- } else if (clazz == double.class) {
- obj = new double[] {};
- } else if (clazz == boolean.class) {
- obj = new boolean[] {};
- } else if (clazz == char.class) {
- obj = new char[] {};
- } else if (clazz == Byte.class) {
- obj = new Byte[] {};
- } else if (clazz == Short.class) {
- obj = new Short[] {};
- } else if (clazz == Integer.class) {
- obj = new Integer[] {};
- } else if (clazz == Long.class) {
- obj = new Long[] {};
- } else if (clazz == Float.class) {
- obj = new Float[] {};
- } else if (clazz == Double.class) {
- obj = new Double[] {};
- } else if (clazz == Boolean.class) {
- obj = new Boolean[] {};
- } else if (clazz == Character.class) {
- obj = new Character[] {};
- } else if (clazz == String.class) {
- obj = new String[] {};
- }
- return (T[]) obj;
+ Object objToReturn = null;
+ if (ConfigurationUtils.isAPrimitive(clazz)) {
+ objToReturn = ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), clazz);
+ } else if (ConfigurationUtils.isWrapperClass(clazz)) {
+ objToReturn = ConfigurationUtils.getWrappersArray(Collections.emptyList(), clazz);
+ }
+ return (T[]) objToReturn;
}
private <T> Collection<T> convert(String commaSeparatedValues, Class<T> clazz, int processingHints) {
ArrayList<T> collection = new ArrayList<>();
for (String value : commaSeparatedValues.split(",")) {
try {
- T type1 = getValue(value, clazz, processingHints);
+ T type1 = getTypeValue(value, clazz, processingHints);
if (type1 != null) {
collection.add(type1);
}
diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/java/org/onap/config/ConfigurationUtilsTest.java b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/java/org/onap/config/ConfigurationUtilsTest.java
index dab8946883..cfb27d53db 100644
--- a/common/onap-common-configuration-management/onap-configuration-management-core/src/test/java/org/onap/config/ConfigurationUtilsTest.java
+++ b/common/onap-common-configuration-management/onap-configuration-management-core/src/test/java/org/onap/config/ConfigurationUtilsTest.java
@@ -20,6 +20,7 @@
package org.onap.config;
import static java.util.stream.Collectors.toList;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotNull;
@@ -36,7 +37,9 @@ import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Deque;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -77,7 +80,7 @@ public class ConfigurationUtilsTest {
@Test
public void testCommaListWithNullAndEmptyStrings() {
- List list = Arrays.asList(null, "", " ");
+ List<String> list = Arrays.asList(null, "", " ");
String commaSeparatedList = ConfigurationUtils.getCommaSeparatedList(list);
assertTrue(commaSeparatedList.isEmpty());
}
@@ -101,12 +104,12 @@ public class ConfigurationUtilsTest {
@Test
public void testCastingArray() {
int arraySize = 2;
- final Class[] primitiveType = new Class[]{boolean.class, byte.class,
+ final Class<?>[] primitiveType = new Class[]{boolean.class, byte.class,
double.class, float.class, int.class, long.class, short.class};
- for (Class clazz: primitiveType) {
- Class expectedResultClass = Array.newInstance(clazz, 0).getClass();
- List defaultCollection = IntStream.range(0, arraySize).mapToObj(i ->
+ for (Class<?> clazz : primitiveType) {
+ Class<?> expectedResultClass = Array.newInstance(clazz, 0).getClass();
+ List<?> defaultCollection = IntStream.range(0, arraySize).mapToObj(i ->
ConfigurationUtils.getDefaultFor(clazz)).collect(toList());
Object resultArray = ConfigurationUtils.getPrimitiveArray(defaultCollection, clazz);
@@ -119,7 +122,7 @@ public class ConfigurationUtilsTest {
@Test(expected = IllegalArgumentException.class)
public void testGetCompatibleCollection() {
- final Map<Class, Class> testClasses = Stream.of(new Class[][] {
+ final Map<Class<?>, Class<?>> testClasses = Stream.of(new Class<?>[][]{
{BlockingQueue.class, LinkedBlockingQueue.class},
{TransferQueue.class, LinkedTransferQueue.class},
{Deque.class, ArrayDeque.class},
@@ -130,9 +133,9 @@ public class ConfigurationUtilsTest {
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));
testClasses.forEach((entryClass, expResultClass) -> {
- Class resultClass = ConfigurationUtils.getCompatibleCollectionForAbstractDef(entryClass).getClass();
- assertEquals(expResultClass, resultClass);
- }
+ Class<?> resultClass = ConfigurationUtils.getCompatibleCollectionForAbstractDef(entryClass).getClass();
+ assertEquals(expResultClass, resultClass);
+ }
);
ConfigurationUtils.getCompatibleCollectionForAbstractDef(Collection.class);
@@ -140,6 +143,54 @@ public class ConfigurationUtilsTest {
}
@Test
+ public void testGetPrimitivesArrayZeroLength() {
+ assertArrayEquals(new int[0], (int[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), int.class));
+ assertArrayEquals(new byte[0], (byte[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), byte.class));
+ assertArrayEquals(new short[0], (short[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), short.class));
+ assertArrayEquals(new long[0], (long[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), long.class));
+ assertArrayEquals(new double[0], (double[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), double.class), 0);
+ assertArrayEquals(new float[0], (float[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), float.class), 0);
+ assertArrayEquals(new boolean[0], (boolean[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), boolean.class));
+ assertArrayEquals(new char[0], (char[]) ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), char.class));
+ assertNull(ConfigurationUtils.getPrimitiveArray(Collections.emptyList(), Integer.class));
+ }
+
+ @Test
+ public void testGetWrappersArrayZeroLength() {
+ assertArrayEquals(new Integer[0], (Integer[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Integer.class));
+ assertArrayEquals(new Byte[0], (Byte[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Byte.class));
+ assertArrayEquals(new Short[0], (Short[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Short.class));
+ assertArrayEquals(new Long[0], (Long[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Long.class));
+ assertArrayEquals(new Double[0], (Double[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Double.class));
+ assertArrayEquals(new Float[0], (Float[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Float.class));
+ assertArrayEquals(new Boolean[0], (Boolean[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Boolean.class));
+ assertArrayEquals(new Character[0], (Character[]) ConfigurationUtils.getWrappersArray(Collections.emptyList(), Character.class));
+ assertNull(ConfigurationUtils.getWrappersArray(Collections.emptyList(), boolean.class));
+ }
+
+ @Test
+ public void testPrimitivesArrayNonZeroLength() {
+ List<Integer> list = new ArrayList<>();
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ list.add(4);
+ list.add(5);
+ assertArrayEquals(new int[]{1, 2, 3, 4, 5}, (int[]) ConfigurationUtils.getPrimitiveArray(list, int.class));
+ }
+
+ @Test
+ public void testWrappersArrayNonZeroLength() {
+ List<Integer> list = new ArrayList<>();
+ list.add(1);
+ list.add(2);
+ list.add(3);
+ list.add(4);
+ list.add(5);
+ assertArrayEquals(new Integer[]{1, 2, 3, 4, 5}, (Integer[]) ConfigurationUtils.getWrappersArray(list, Integer.class));
+ }
+
+ @Test
public void testGetAllFilesRecursiveIncludeAll() throws IOException {
Path tmpRoot = TestUtil.createTestDirsStructure(TMP_DIR_PREFIX);
Collection<File> allFiles = ConfigurationUtils.getAllFiles(tmpRoot.toFile(), true, false);
@@ -207,6 +258,46 @@ public class ConfigurationUtilsTest {
assertEquals(TEST_NAME_SPACE, ConfigurationUtils.getProperty(config, Constants.NAMESPACE_KEY, Hint.NODE_SPECIFIC.value()));
}
+ @Test
+ public void testIsAMap() {
+ assertTrue(ConfigurationUtils.isAMap(HashMap.class));
+ assertFalse(ConfigurationUtils.isAMap(ArrayList.class));
+ }
+
+ @Test
+ public void testIsACollection() {
+ assertTrue(ConfigurationUtils.isACollection(ArrayList.class));
+ assertFalse(ConfigurationUtils.isACollection(HashMap.class));
+ }
+
+ @Test
+ public void testIsAPrimitiveOrWrapper() {
+ assertTrue(ConfigurationUtils.isAPrimitiveOrWrapper(int.class));
+ assertTrue(ConfigurationUtils.isAPrimitiveOrWrapper(Integer.class));
+ assertFalse(ConfigurationUtils.isAPrimitiveOrWrapper(HashMap.class));
+ }
+
+ @Test
+ public void testIsAPrimitivesArray() {
+ assertTrue(ConfigurationUtils.isAPrimitivesArray(int[].class));
+ assertFalse(ConfigurationUtils.isAPrimitivesArray(Integer[].class));
+ assertFalse(ConfigurationUtils.isAPrimitivesArray(HashMap[].class));
+ }
+
+ @Test
+ public void testIsAWrapperArray() {
+ assertTrue(ConfigurationUtils.isAWrappersArray(Integer[].class));
+ assertFalse(ConfigurationUtils.isAWrappersArray(int[].class));
+ assertFalse(ConfigurationUtils.isAWrappersArray(HashMap[].class));
+ }
+
+ @Test
+ public void testIsAPrimitivesOrWrapperArray() {
+ assertTrue(ConfigurationUtils.isAPrimitivesOrWrappersArray(int[].class));
+ assertTrue(ConfigurationUtils.isAPrimitivesOrWrappersArray(Integer[].class));
+ assertFalse(ConfigurationUtils.isAPrimitivesOrWrappersArray(HashMap[].class));
+ }
+
private ConfigurationRepository populateTestBaseConfig() {
BaseConfiguration inputConfig = new PropertiesConfiguration();
inputConfig.setProperty(Constants.NAMESPACE_KEY, TEST_NAME_SPACE);
@@ -220,8 +311,8 @@ public class ConfigurationUtilsTest {
private ConfigurationRepository populateTestCompositeConfig() {
CompositeConfiguration inputCompositeConfig = new CompositeConfiguration();
- Configuration inputConfig1= new BaseConfiguration();
- Configuration inputConfig2= new BaseConfiguration();
+ Configuration inputConfig1 = new BaseConfiguration();
+ Configuration inputConfig2 = new BaseConfiguration();
inputConfig1.setProperty(Constants.NAMESPACE_KEY, TEST_NAME_SPACE);
inputCompositeConfig.addConfiguration(inputConfig1);
inputCompositeConfig.addConfigurationFirst(inputConfig2);