From fe4623d1cddefe53df417d18115b69cc9265ec6e Mon Sep 17 00:00:00 2001 From: Dmitry Puzikov Date: Fri, 29 Nov 2019 09:57:27 +0100 Subject: Fixed sonar issues Refactored overcomplicated methods by splitting into the more simple. Remove redundant conditional checks. Move common checks into the utils class. Fixed raw types usage where it is possible. Add some tests. Fixed typos in test names. Fixed lost switch branch. Issue-ID: SDC-2698 Signed-off-by: Dmitry Puzikov Change-Id: Ifb5887401be4b397267b2f922cc9ad3f01c757f6 --- .../org/onap/config/impl/ConfigurationImpl.java | 690 +++++++++++---------- 1 file changed, 364 insertions(+), 326 deletions(-) (limited to 'common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl') 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 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 moduleConfigStore = new HashMap<>(); - List classpathResources = ConfigurationUtils.getAllClassPathResources(); - Predicate 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 filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); - Predicate 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 tenantsRoot = ConfigurationUtils.getAllFiles(root, false, true); - Collection filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); - Predicate 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 filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); - Predicate 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 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 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 get(String tenant, String namespace, String key, Class 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 Map populateMap(String tenantId, String namespace, String key, Class clazz) { - - tenantId = calculateTenant(tenantId); - namespace = calculateNamespace(namespace); + final String calculatedTenantId = calculateTenant(tenantId); + final String calculatedNamespace = calculateNamespace(namespace); Map map = new HashMap<>(); Iterator 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 keys; + public Map generateMap(String tenantId, String namespace, String key) { + final String calculatedTenantId = calculateTenant(tenantId); + final String calculatedNamespace = calculateNamespace(namespace); + Map parentMap = new HashMap<>(); + Iterator 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 classpathResources = ConfigurationUtils.getAllClassPathResources(); + Predicate predicate = ConfigurationUtils::isConfig; + Map> resources = classpathResources.stream().collect(Collectors.partitioningBy(predicate)); + List configResources = resources.get(true); + List nonConfigResources = resources.get(false); + AtomicReference 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 successFlagHolder = new AtomicReference<>(true); + if (!isBlank(configLocation)) { + File root = new File(configLocation); + Collection filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); + Predicate filePredicate = ConfigurationUtils::isConfig; + Map> resources = filesystemResources.stream().collect(Collectors.partitioningBy(filePredicate)); + List configResources = resources.get(true); + List 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 successFlagHolder = new AtomicReference<>(true); + if (!isBlank(tenantConfigLocation)) { + File root = new File(tenantConfigLocation); + Collection tenantsRoot = ConfigurationUtils.getAllFiles(root, false, true); + Collection filesystemResources = ConfigurationUtils.getAllFiles(root, true, false); + + Map> resources = filesystemResources.stream().collect(Collectors.partitioningBy(ConfigurationUtils::isConfig)); + Collection tenantResources = resources.get(true); + + tenantResources.forEach(configFile -> { + AtomicReference moduleNameHolder = new AtomicReference<>(ConfigurationUtils.getNamespace(configFile)); + Predicate startsWithRootPredicate = tenantRoot -> configFile.getAbsolutePath().startsWith(tenantRoot.getAbsolutePath()); + Collection matchesTenantRoot = tenantsRoot.stream().filter(startsWithRootPredicate).collect(Collectors.toCollection(ArrayList::new)); + AtomicReference 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 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 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 modules = configs.keySet(); + modules.forEach( + m -> ConfigurationRepository.lookup().populateConfiguration(m, configs.get(m).getFinalConfiguration()) + ); + } + + private static 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 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 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 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 subMap = new HashMap<>(); + targetMap.put(subSubKey, subMap); + targetMap = subMap; + } else { + targetMap = (Map) targetMap.get(subSubKey); + } + } + targetMap.put(subKey, value); + } + protected T getInternal(String tenant, String namespace, String key, Class 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 tempCollection = new ArrayList<>(); - for (String itemValue : collString.split(",")) { - tempCollection.add(ConfigurationUtils.processVariablesIfPresent(tenant, namespace, itemValue)); - } - Collection 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 getWrapperTypeValue(String tenant, String namespace, String key, Class 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 getArrayTypeValue(String tenant, String namespace, String key, Class 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 tempCollection = new ArrayList<>(); + for (String itemValue : collString.split(",")) { + tempCollection.add(ConfigurationUtils.processVariablesIfPresent(tenant, namespace, itemValue)); + } + Collection collection = convert( + ConfigurationUtils.getCollectionString(Arrays.toString(tempCollection.toArray())), + (Class) 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 read(String tenant, String namespace, Class clazz, String keyPrefix, Hint... hints) + private T getAnnotatedTypeValue(String tenant, String namespace, Class 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 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 getValue(Object obj, Class clazz, int processingHint) { - + private T getTypeValue(Object obj, Class 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 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 getValueForNumbersType(Object obj, Class 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[] getZeroLengthArrayFor(Class 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 Collection convert(String commaSeparatedValues, Class clazz, int processingHints) { ArrayList 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); } -- cgit 1.2.3-korg