Code formatting of configuration framework
[sdc.git] / common / onap-common-configuration-management / onap-configuration-management-core / src / main / java / org / onap / config / ConfigurationUtils.java
index 953ee15..528941b 100644 (file)
@@ -81,16 +81,10 @@ import org.onap.config.type.ConfigurationType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/**
- * The type Configuration utils.
- */
 public class ConfigurationUtils {
+
     private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationUtils.class);
     private static final String CONFIGURATION_TYPE_NOT_SUPPORTED = "Configuration type not supported:";
-
-    private ConfigurationUtils() {
-    }
-
     private static final Map<Class, Class> ARRAY_CLASS_MAP;
 
     static {
@@ -107,11 +101,9 @@ public class ConfigurationUtils {
         ARRAY_CLASS_MAP = Collections.unmodifiableMap(arrayTypes);
     }
 
-    /**
-     * Gets thread factory.
-     *
-     * @return the thread factory
-     */
+    private ConfigurationUtils() {
+    }
+
     public static ThreadFactory getThreadFactory() {
         return r1 -> {
             Thread thread = Executors.privilegedThreadFactory().newThread(r1);
@@ -120,14 +112,6 @@ public class ConfigurationUtils {
         };
     }
 
-    /**
-     * Gets all files.
-     *
-     * @param file          the file
-     * @param recursive     the recursive
-     * @param onlyDirectory the only directory
-     * @return the all files
-     */
     public static Collection<File> getAllFiles(File file, boolean recursive, boolean onlyDirectory) {
         ArrayList<File> collection = new ArrayList<>();
         if (file.isDirectory() && file.exists()) {
@@ -146,206 +130,81 @@ public class ConfigurationUtils {
         return collection;
     }
 
-    /**
-     * Gets comma saperated list.
-     *
-     * @param list the list
-     * @return the comma separated list
-     */
-    public static String getCommaSeparatedList(List list) {
-        return ((Stream<String>) list.stream().filter(o -> o != null && !o.toString().trim().isEmpty()).map(o -> o.toString().trim())).collect(Collectors.joining(","));
-    }
-
-    /**
-     * Gets comma saperated list.
-     *
-     * @param list the list
-     * @return the comma saperated list
-     */
     public static String getCommaSeparatedList(String[] list) {
-        return getCommaSeparatedList(list == null ? Arrays.asList() : Arrays.asList(list));
+        return getCommaSeparatedList(list == null ? Collections.emptyList() : Arrays.asList(list));
     }
 
-    /**
-     * Gets config type.
-     *
-     * @param url the url
-     * @return the config type
-     */
-    public static ConfigurationType getConfigType(URL url) {
-        return Enum.valueOf(ConfigurationType.class,
-                url.getFile().substring(url.getFile().lastIndexOf('.') + 1).toUpperCase());
-    }
-
-    /**
-     * Gets config type.
-     *
-     * @param file the file
-     * @return the config type
-     */
-    public static ConfigurationType getConfigType(File file) {
-        return Enum.valueOf(ConfigurationType.class,
-                file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf('.') + 1)
-                        .toUpperCase());
+    public static String getCommaSeparatedList(List list) {
+        return ((Stream<String>) list.stream().filter(o -> o != null && !o.toString().trim().isEmpty())
+                                         .map(o -> o.toString().trim())).collect(Collectors.joining(","));
     }
 
-    /**
-     * Is config boolean.
-     *
-     * @param url the url
-     * @return the boolean
-     */
     public static boolean isConfig(URL url) {
         return isConfig(url.getFile());
     }
 
-    /**
-     * Is config boolean.
-     *
-     * @param file the file
-     * @return the boolean
-     */
-    public static boolean isConfig(File file) {
-        return file != null && file.exists() && isConfig(file.getName());
-    }
-
-    /**
-     * Is config boolean.
-     *
-     * @param file the file
-     * @return the boolean
-     */
     public static boolean isConfig(String file) {
         file = file.toUpperCase().substring(file.lastIndexOf('!') + 1);
         file = file.substring(file.lastIndexOf('/') + 1);
         return file.matches(
-                "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE
-                        + "|" + ConfigurationMode.UNION + ")){0,1}" + "\\.("
-                        + ConfigurationType.PROPERTIES.name() + "|" + ConfigurationType.XML.name() + "|"
-                        + ConfigurationType.JSON.name() + "|" + ConfigurationType.YAML.name() + ")$")
-                || file.matches("CONFIG(.)*\\.(" + ConfigurationType.PROPERTIES.name() + "|"
-                + ConfigurationType.XML.name() + "|" + ConfigurationType.JSON.name() + "|"
-                + ConfigurationType.YAML.name() + ")$");
-    }
-
-    /**
-     * Gets namespace.
-     *
-     * @param url the url
-     * @return the namespace
-     */
-    public static String getNamespace(URL url) {
-
-        Optional<String> namespace = getConfiguration(url).flatMap(ConfigurationUtils::getNamespace).map(String::toUpperCase);
-
-        return namespace.orElseGet(() -> getNamespace(url.getFile().toUpperCase()));
+                "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE + "|"
+                        + ConfigurationMode.UNION + ")){0,1}" + "\\.(" + ConfigurationType.PROPERTIES.name() + "|"
+                        + ConfigurationType.XML.name() + "|" + ConfigurationType.JSON.name() + "|"
+                        + ConfigurationType.YAML.name() + ")$") || file.matches(
+                "CONFIG(.)*\\.(" + ConfigurationType.PROPERTIES.name() + "|" + ConfigurationType.XML.name() + "|"
+                        + ConfigurationType.JSON.name() + "|" + ConfigurationType.YAML.name() + ")$");
     }
 
-    /**
-     * Gets namespace.
-     *
-     * @param file the file
-     * @return the namespace
-     */
-    public static String getNamespace(File file) {
-        Optional<String> namespace = getConfiguration(file)
-                .flatMap(ConfigurationUtils::getNamespace)
-                .map(String::toUpperCase);
-        return namespace.orElseGet(() -> getNamespace(file.getName().toUpperCase()));
+    public static boolean isConfig(File file) {
+        return file != null && file.exists() && isConfig(file.getName());
     }
 
     private static Optional<String> getNamespace(Configuration config) {
-        return ofNullable(config)
-                .flatMap(configuration -> ofNullable(configuration.getString(Constants.NAMESPACE_KEY)))
-                .map(String::toUpperCase);
+        return ofNullable(config).flatMap(configuration -> ofNullable(configuration.getString(Constants.NAMESPACE_KEY)))
+                       .map(String::toUpperCase);
     }
 
-    /**
-     * Gets namespace.
-     *
-     * @param file the file
-     * @return the namespace
-     */
-    public static String getNamespace(String file) {
-        file = file.toUpperCase().substring(file.lastIndexOf('!') + 1);
-        file = file.substring(file.lastIndexOf('/') + 1);
-        Pattern pattern = Pattern.compile(
-                "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE
-                        + "|" + ConfigurationMode.UNION + ")){0,1}" + "\\.("
-                        + ConfigurationType.PROPERTIES.name() + "|" + ConfigurationType.XML.name() + "|"
-                        + ConfigurationType.JSON.name() + "|" + ConfigurationType.YAML.name() + ")$");
-        Matcher matcher = pattern.matcher(file);
-        boolean b1 = matcher.matches();
-        if (b1) {
-            if (matcher.group(1) != null) {
-                String moduleName = matcher.group(1).substring(1);
-                return moduleName.equalsIgnoreCase(ConfigurationMode.OVERRIDE.name())
-                        || moduleName.equalsIgnoreCase(ConfigurationMode.UNION.name())
-                        || moduleName.equalsIgnoreCase(ConfigurationMode.MERGE.name())
-                        ? Constants.DEFAULT_NAMESPACE : moduleName;
-            } else {
-                return Constants.DEFAULT_NAMESPACE;
-            }
-        } else if (isConfig(file)) {
-            return Constants.DEFAULT_NAMESPACE;
-        }
-
-        return null;
-    }
-
-    /**
-     * Gets merge strategy.
-     *
-     * @param url the url
-     * @return the merge strategy
-     */
     public static ConfigurationMode getMergeStrategy(URL url) {
-        Optional<ConfigurationMode> configurationMode = getConfiguration(url).flatMap(ConfigurationUtils::getMergeStrategy).flatMap(ConfigurationUtils::convertConfigurationMode);
+        Optional<ConfigurationMode> configurationMode =
+                getConfiguration(url).flatMap(ConfigurationUtils::getMergeStrategy)
+                        .flatMap(ConfigurationUtils::convertConfigurationMode);
         return configurationMode.orElseGet(() -> getMergeStrategy(url.getFile().toUpperCase()));
     }
 
-    private static Optional<ConfigurationMode> convertConfigurationMode(String configMode) {
-        ConfigurationMode configurationMode = null;
+    public static Optional<FileBasedConfiguration> getConfiguration(URL url) {
+        FileBasedConfiguration builder = null;
         try {
-            configurationMode = ConfigurationMode.valueOf(configMode);
-        } catch (Exception exception) {
-            LOGGER.error("Could not find convert {} into configuration mode", configMode);
+            ConfigurationType configType = ConfigurationUtils.getConfigType(url);
+            switch (configType) {
+                case PROPERTIES:
+                    builder = new Configurations().fileBased(PropertiesConfiguration.class, url);
+                    break;
+                case XML:
+                    builder = new Configurations().fileBased(XMLConfiguration.class, url);
+                    break;
+                case JSON:
+                    builder = new Configurations().fileBased(JsonConfiguration.class, url);
+                    break;
+                case YAML:
+                    builder = new Configurations().fileBased(YamlConfiguration.class, url);
+                    break;
+                default:
+                    throw new ConfigurationException(CONFIGURATION_TYPE_NOT_SUPPORTED + configType);
+            }
+        } catch (ConfigurationException exception) {
+            exception.printStackTrace();
         }
-        return Optional.ofNullable(configurationMode);
-    }
-
-    private static Optional<String> getMergeStrategy(Configuration config) {
-        return ofNullable(config)
-                .flatMap(configuration -> ofNullable(configuration.getString(Constants.MODE_KEY)))
-                .map(String::toUpperCase);
-    }
-
-
-    /**
-     * Gets merge strategy.
-     *
-     * @param file the file
-     * @return the merge strategy
-     */
-    public static ConfigurationMode getMergeStrategy(File file) {
-        Optional<ConfigurationMode> configurationMode = getConfiguration(file).flatMap(ConfigurationUtils::getMergeStrategy).flatMap(ConfigurationUtils::convertConfigurationMode);
-        return configurationMode.orElseGet(() -> getMergeStrategy(file.getName().toUpperCase()));
+        return ofNullable(builder);
     }
 
-    /**
-     * Gets merge strategy.
-     *
-     * @param file the file
-     * @return the merge strategy
-     */
     public static ConfigurationMode getMergeStrategy(String file) {
         file = file.toUpperCase().substring(file.lastIndexOf('!') + 1);
         file = file.substring(file.lastIndexOf('/') + 1);
         Pattern pattern = Pattern.compile(
-                "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE
-                        + "|" + ConfigurationMode.UNION + ")){0,1}" + "\\.("
-                        + ConfigurationType.PROPERTIES.name() + "|" + ConfigurationType.XML.name() + "|"
-                        + ConfigurationType.JSON.name() + "|" + ConfigurationType.YAML.name() + ")$");
+                "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE + "|"
+                        + ConfigurationMode.UNION + ")){0,1}" + "\\.(" + ConfigurationType.PROPERTIES.name() + "|"
+                        + ConfigurationType.XML.name() + "|" + ConfigurationType.JSON.name() + "|"
+                        + ConfigurationType.YAML.name() + ")$");
         Matcher matcher = pattern.matcher(file);
         boolean b1 = matcher.matches();
         if (b1) {
@@ -365,44 +224,33 @@ public class ConfigurationUtils {
         return null;
     }
 
-    /**
-     * Gets configuration.
-     *
-     * @param url the url
-     * @return the configuration
-     */
-    public static Optional<FileBasedConfiguration> getConfiguration(URL url) {
-        FileBasedConfiguration builder = null;
+    public static ConfigurationType getConfigType(URL url) {
+        return Enum.valueOf(ConfigurationType.class,
+                url.getFile().substring(url.getFile().lastIndexOf('.') + 1).toUpperCase());
+    }
+
+    private static Optional<ConfigurationMode> convertConfigurationMode(String configMode) {
+        ConfigurationMode configurationMode = null;
         try {
-            ConfigurationType configType = ConfigurationUtils.getConfigType(url);
-            switch (configType) {
-                case PROPERTIES:
-                    builder = new Configurations().fileBased(PropertiesConfiguration.class, url);
-                    break;
-                case XML:
-                    builder = new Configurations().fileBased(XMLConfiguration.class, url);
-                    break;
-                case JSON:
-                    builder = new Configurations().fileBased(JsonConfiguration.class, url);
-                    break;
-                case YAML:
-                    builder = new Configurations().fileBased(YamlConfiguration.class, url);
-                    break;
-                default:
-                    throw new ConfigurationException(CONFIGURATION_TYPE_NOT_SUPPORTED + configType);
-            }
-        } catch (ConfigurationException exception) {
-            exception.printStackTrace();
+            configurationMode = ConfigurationMode.valueOf(configMode);
+        } catch (Exception exception) {
+            LOGGER.error("Could not find convert {} into configuration mode", configMode);
         }
-        return ofNullable(builder);
+        return Optional.ofNullable(configurationMode);
+    }
+
+    private static Optional<String> getMergeStrategy(Configuration config) {
+        return ofNullable(config).flatMap(configuration -> ofNullable(configuration.getString(Constants.MODE_KEY)))
+                       .map(String::toUpperCase);
+    }
+
+    public static ConfigurationMode getMergeStrategy(File file) {
+        Optional<ConfigurationMode> configurationMode =
+                getConfiguration(file).flatMap(ConfigurationUtils::getMergeStrategy)
+                        .flatMap(ConfigurationUtils::convertConfigurationMode);
+        return configurationMode.orElseGet(() -> getMergeStrategy(file.getName().toUpperCase()));
     }
 
-    /**
-     * Gets configuration.
-     *
-     * @param file the file
-     * @return the configuration
-     */
     public static Optional<FileBasedConfiguration> getConfiguration(File file) {
         FileBasedConfiguration builder = null;
         try {
@@ -429,12 +277,11 @@ public class ConfigurationUtils {
         return ofNullable(builder);
     }
 
-    /**
-     * Gets collection generic type.
-     *
-     * @param field the field
-     * @return the collection generic type
-     */
+    public static ConfigurationType getConfigType(File file) {
+        return Enum.valueOf(ConfigurationType.class,
+                file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf('.') + 1).toUpperCase());
+    }
+
     public static Class getCollectionGenericType(Field field) {
         Type type = field.getGenericType();
 
@@ -442,74 +289,44 @@ public class ConfigurationUtils {
 
             ParameterizedType paramType = (ParameterizedType) type;
             Type[] arr = paramType.getActualTypeArguments();
-
-            for (Type tp : arr) {
-                Class<?> clzz = (Class<?>) tp;
-                if (isWrapperClass(clzz)) {
-                    return clzz;
+            if (arr.length > 0) {
+                Class<?> clazz = (Class<?>) arr[0];
+                if (isWrapperClass(clazz)) {
+                    return clazz;
                 } else {
-                    throw new RuntimeException("Collection of type " + clzz.getName() + " not supported.");
+                    throw new RuntimeException("Collection of type " + clazz.getName() + " not supported.");
                 }
             }
         }
+
         return String[].class;
     }
 
+    public static boolean isWrapperClass(Class clazz) {
+        return clazz == String.class || clazz == Boolean.class || clazz == Character.class
+                       || Number.class.isAssignableFrom(clazz);
+    }
 
-    /**
-     * Gets array class.
-     *
-     * @param clazz the clazz
-     * @return the array class
-     */
     public static Class getArrayClass(Class clazz) {
         return ARRAY_CLASS_MAP.getOrDefault(clazz, null);
     }
 
-    /**
-     * Gets all class path resources.
-     *
-     * @return the all class path resources
-     */
     public static List<URL> getAllClassPathResources() {
         return CPScanner.scanResources(new ResourceFilter());
     }
 
-    /**
-     * Gets configuration builder.
-     *
-     * @param url the url
-     * @return the configuration builder
-     */
     public static BasicConfigurationBuilder<FileBasedConfiguration> getConfigurationBuilder(URL url) {
         ConfigurationType configType = ConfigurationUtils.getConfigType(url);
-        ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> builder = getFileBasedConfigurationReloadingFileBasedConfigurationBuilder(
-                configType);
-        builder.configure(new Parameters().fileBased().setURL(url)
-                .setListDelimiterHandler(new DefaultListDelimiterHandler(',')));
+        ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> builder =
+                getFileBasedConfigurationReloadingFileBasedConfigurationBuilder(configType);
+        builder.configure(
+                new Parameters().fileBased().setURL(url).setListDelimiterHandler(new DefaultListDelimiterHandler(',')));
         return builder;
     }
 
-    /**
-     * Gets configuration builder.
-     *
-     * @param file     the file
-     * @param autoSave the auto save
-     * @return the configuration builder
-     */
-    public static BasicConfigurationBuilder<FileBasedConfiguration> getConfigurationBuilder(File file,
-                                                                                            boolean autoSave) {
-        ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> builder;
-        ConfigurationType configType = ConfigurationUtils.getConfigType(file);
-        builder = getFileBasedConfigurationReloadingFileBasedConfigurationBuilder(configType);
-        builder.configure(new Parameters().fileBased().setFile(file)
-                .setListDelimiterHandler(new DefaultListDelimiterHandler(',')));
-        builder.setAutoSave(autoSave);
-        return builder;
-    }
+    private static ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>
+            getFileBasedConfigurationReloadingFileBasedConfigurationBuilder(ConfigurationType configType) {
 
-    private static ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> getFileBasedConfigurationReloadingFileBasedConfigurationBuilder(
-            ConfigurationType configType) {
         ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> builder;
         switch (configType) {
             case PROPERTIES:
@@ -530,30 +347,28 @@ public class ConfigurationUtils {
         return builder;
     }
 
-    /**
-     * Read t.
-     *
-     * @param <T>       the type parameter
-     * @param config    the config
-     * @param clazz     the clazz
-     * @param keyPrefix the key prefix
-     * @return the t
-     * @throws Exception the exception
-     */
-    public static <T> T read(Configuration config, Class<T> clazz, String keyPrefix)
-            throws Exception {
-        Config confAnnot =
-                clazz.getAnnotation(Config.class);
-        if (confAnnot != null) {
-            keyPrefix += (confAnnot.key() + ".");
+    public static BasicConfigurationBuilder<FileBasedConfiguration> getConfigurationBuilder(File file,
+            boolean autoSave) {
+        ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> builder;
+        ConfigurationType configType = ConfigurationUtils.getConfigType(file);
+        builder = getFileBasedConfigurationReloadingFileBasedConfigurationBuilder(configType);
+        builder.configure(new Parameters().fileBased().setFile(file)
+                                  .setListDelimiterHandler(new DefaultListDelimiterHandler(',')));
+        builder.setAutoSave(autoSave);
+        return builder;
+    }
+
+    public static <T> T read(Configuration config, Class<T> clazz, String keyPrefix) throws Exception {
+        Config confAnnotation = clazz.getAnnotation(Config.class);
+        if (confAnnotation != null) {
+            keyPrefix += (confAnnotation.key() + ".");
         }
         T objToReturn = clazz.newInstance();
         for (Field field : clazz.getDeclaredFields()) {
-            Config fieldConfAnnot =
-                    field.getAnnotation(Config.class);
-            if (fieldConfAnnot != null) {
+            Config fieldAnnotation = field.getAnnotation(Config.class);
+            if (fieldAnnotation != null) {
                 field.setAccessible(true);
-                field.set(objToReturn, config.getProperty(keyPrefix + fieldConfAnnot.key()));
+                field.set(objToReturn, config.getProperty(keyPrefix + fieldAnnotation.key()));
             } else if (field.getType().getAnnotation(Config.class) != null) {
                 field.set(objToReturn, read(config, field.getType(), keyPrefix));
             }
@@ -561,42 +376,6 @@ public class ConfigurationUtils {
         return objToReturn;
     }
 
-    /**
-     * Gets property.
-     *
-     * @param config          the config
-     * @param key             the key
-     * @param processingHints the processing hints
-     * @return the property
-     */
-    public static Object getProperty(Configuration config, String key, int processingHints) {
-        if (!isDirectLookup(processingHints)) {
-            if (config instanceof AgglomerateConfiguration) {
-                return ((AgglomerateConfiguration) config).getPropertyValue(key);
-            } else if (config instanceof CompositeConfiguration) {
-                CompositeConfiguration conf = (CompositeConfiguration) config;
-                for (int i = 0; i < conf.getNumberOfConfigurations(); i++) {
-                    if (conf.getConfiguration(i) instanceof AgglomerateConfiguration) {
-                        return ((AgglomerateConfiguration) conf.getConfiguration(i)).getPropertyValue(key);
-                    } else if (isNodeSpecific(processingHints)) {
-                        Object obj = conf.getConfiguration(i).getProperty(key);
-                        if (obj != null) {
-                            return obj;
-                        }
-                    }
-                }
-            }
-        }
-        return config.getProperty(key);
-    }
-
-    /**
-     * Gets primitive array.
-     *
-     * @param collection the collection
-     * @param clazz      the clazz
-     * @return the primitive array
-     */
     public static Object getPrimitiveArray(Collection collection, Class clazz) {
         if (clazz == int.class) {
             int[] array = new int[collection.size()];
@@ -657,23 +436,6 @@ public class ConfigurationUtils {
         return null;
     }
 
-    /**
-     * Is wrapper class boolean.
-     *
-     * @param clazz the clazz
-     * @return the boolean
-     */
-    public static boolean isWrapperClass(Class clazz) {
-        return clazz == String.class || clazz == Boolean.class || clazz == Character.class
-                || Number.class.isAssignableFrom(clazz);
-    }
-
-    /**
-     * Gets collection string.
-     *
-     * @param input the input
-     * @return the collection string
-     */
     public static String getCollectionString(String input) {
         Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
         Matcher matcher = pattern.matcher(input);
@@ -683,26 +445,6 @@ public class ConfigurationUtils {
         return input;
     }
 
-    /**
-     * Is collection boolean.
-     *
-     * @param input the input
-     * @return the boolean
-     */
-    public static boolean isCollection(String input) {
-        Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
-        Matcher matcher = pattern.matcher(input);
-        return matcher.matches();
-    }
-
-    /**
-     * Process variables if present string.
-     *
-     * @param tenant    the tenant
-     * @param namespace the namespace
-     * @param data      the data
-     * @return the string
-     */
     public static String processVariablesIfPresent(String tenant, String namespace, String data) {
         Pattern pattern = Pattern.compile("^.*\\$\\{(.*)\\}.*");
         Matcher matcher = pattern.matcher(data);
@@ -727,12 +469,6 @@ public class ConfigurationUtils {
         }
     }
 
-    /**
-     * Gets file contents.
-     *
-     * @param path the path
-     * @return the file contents
-     */
     public static String getFileContents(String path) {
         try {
             if (path != null) {
@@ -744,12 +480,6 @@ public class ConfigurationUtils {
         return null;
     }
 
-    /**
-     * Gets file contents.
-     *
-     * @param path the path
-     * @return the file contents
-     */
     public static String getFileContents(Path path) {
         try {
             if (path != null) {
@@ -761,40 +491,6 @@ public class ConfigurationUtils {
         return null;
     }
 
-    /**
-     * Gets concrete collection.
-     *
-     * @param clazz the clazz
-     * @return the concrete collection
-     */
-    public static Collection getConcreteCollection(Class clazz) {
-        switch (clazz.getName()) {
-            case "java.util.Collection":
-            case "java.util.List":
-                return new ArrayList<>();
-            case "java.util.Set":
-                return new HashSet<>();
-            case "java.util.SortedSet":
-                return new TreeSet<>();
-            case "java.util.Queue":
-                return new ConcurrentLinkedQueue<>();
-            case "java.util.Deque":
-                return new ArrayDeque<>();
-            case "java.util.concurrent.TransferQueue":
-                return new LinkedTransferQueue<>();
-            case "java.util.concurrent.BlockingQueue":
-                return new LinkedBlockingQueue<>();
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * Gets default for.
-     *
-     * @param clazz the clazz
-     * @return the default for
-     */
     public static Object getDefaultFor(Class clazz) {
         if (byte.class == clazz) {
             return new Byte("0");
@@ -814,12 +510,6 @@ public class ConfigurationUtils {
         return (char) 0;
     }
 
-    /**
-     * Gets compatible collection for abstract def.
-     *
-     * @param clazz the clazz
-     * @return the compatible collection for abstract def
-     */
     public static Collection getCompatibleCollectionForAbstractDef(Class clazz) {
         if (BlockingQueue.class.isAssignableFrom(clazz)) {
             return getConcreteCollection(BlockingQueue.class);
@@ -845,12 +535,33 @@ public class ConfigurationUtils {
         return null;
     }
 
-    /**
-     * Gets configuration repository key.
-     *
-     * @param array the array
-     * @return the configuration repository key
-     */
+    public static Collection getConcreteCollection(Class clazz) {
+        switch (clazz.getName()) {
+            case "java.util.Collection":
+            case "java.util.List":
+                return new ArrayList<>();
+            case "java.util.Set":
+                return new HashSet<>();
+            case "java.util.SortedSet":
+                return new TreeSet<>();
+            case "java.util.Queue":
+                return new ConcurrentLinkedQueue<>();
+            case "java.util.Deque":
+                return new ArrayDeque<>();
+            case "java.util.concurrent.TransferQueue":
+                return new LinkedTransferQueue<>();
+            case "java.util.concurrent.BlockingQueue":
+                return new LinkedBlockingQueue<>();
+            default:
+                return null;
+        }
+    }
+
+    public static String getConfigurationRepositoryKey(File file) {
+        return getConfigurationRepositoryKey(
+                ConfigurationUtils.getNamespace(file).split(Constants.TENANT_NAMESPACE_SEPARATOR));
+    }
+
     public static String getConfigurationRepositoryKey(String[] array) {
         Deque<String> stack = new ArrayDeque<>();
         stack.push(Constants.DEFAULT_TENANT);
@@ -858,44 +569,61 @@ public class ConfigurationUtils {
             stack.push(element);
         }
         String toReturn = stack.pop();
-        return stack.pop() + Constants.KEY_ELEMENTS_DELEMETER + toReturn;
+        return stack.pop() + Constants.KEY_ELEMENTS_DELIMETER + toReturn;
     }
 
-    /**
-     * Gets configuration repository key.
-     *
-     * @param file the file
-     * @return the configuration repository key
-     */
-    public static String getConfigurationRepositoryKey(File file) {
-        return getConfigurationRepositoryKey(
-                ConfigurationUtils.getNamespace(file).split(Constants.TENANT_NAMESPACE_SAPERATOR));
+    public static String getNamespace(File file) {
+        Optional<String> namespace =
+                getConfiguration(file).flatMap(ConfigurationUtils::getNamespace).map(String::toUpperCase);
+        return namespace.orElseGet(() -> getNamespace(file.getName().toUpperCase()));
+    }
+
+    public static String getNamespace(String file) {
+        file = file.toUpperCase().substring(file.lastIndexOf('!') + 1);
+        file = file.substring(file.lastIndexOf('/') + 1);
+        Pattern pattern = Pattern.compile(
+                "CONFIG(-\\w*){0,1}(-" + "(" + ConfigurationMode.OVERRIDE + "|" + ConfigurationMode.MERGE + "|"
+                        + ConfigurationMode.UNION + ")){0,1}" + "\\.(" + ConfigurationType.PROPERTIES.name() + "|"
+                        + ConfigurationType.XML.name() + "|" + ConfigurationType.JSON.name() + "|"
+                        + ConfigurationType.YAML.name() + ")$");
+        Matcher matcher = pattern.matcher(file);
+        boolean b1 = matcher.matches();
+        if (b1) {
+            if (matcher.group(1) != null) {
+                String moduleName = matcher.group(1).substring(1);
+                return moduleName.equalsIgnoreCase(ConfigurationMode.OVERRIDE.name()) || moduleName.equalsIgnoreCase(
+                        ConfigurationMode.UNION.name()) || moduleName.equalsIgnoreCase(ConfigurationMode.MERGE.name())
+                               ? Constants.DEFAULT_NAMESPACE : moduleName;
+            } else {
+                return Constants.DEFAULT_NAMESPACE;
+            }
+        } else if (isConfig(file)) {
+            return Constants.DEFAULT_NAMESPACE;
+        }
+
+        return null;
     }
 
-    /**
-     * Gets configuration repository key.
-     *
-     * @param url the url
-     * @return the configuration repository key
-     */
     public static String getConfigurationRepositoryKey(URL url) {
         return getConfigurationRepositoryKey(
-                ConfigurationUtils.getNamespace(url).split(Constants.TENANT_NAMESPACE_SAPERATOR));
+                ConfigurationUtils.getNamespace(url).split(Constants.TENANT_NAMESPACE_SEPARATOR));
+    }
+
+    public static String getNamespace(URL url) {
+
+        Optional<String> namespace =
+                getConfiguration(url).flatMap(ConfigurationUtils::getNamespace).map(String::toUpperCase);
+
+        return namespace.orElseGet(() -> getNamespace(url.getFile().toUpperCase()));
     }
 
-    /**
-     * To map linked hash map.
-     *
-     * @param config the config
-     * @return the linked hash map
-     */
     public static LinkedHashMap toMap(Configuration config) {
         Iterator<String> iterator = config.getKeys();
         LinkedHashMap<String, String> map = new LinkedHashMap<>();
         while (iterator.hasNext()) {
             String key = iterator.next();
-            if (!(key.equals(Constants.MODE_KEY) || key.equals(Constants.NAMESPACE_KEY)
-                    || key.equals(Constants.LOAD_ORDER_KEY))) {
+            if (!(key.equals(Constants.MODE_KEY) || key.equals(Constants.NAMESPACE_KEY) || key.equals(
+                    Constants.LOAD_ORDER_KEY))) {
                 map.put(key, config.getProperty(key).toString());
             }
         }
@@ -903,13 +631,6 @@ public class ConfigurationUtils {
         return map;
     }
 
-    /**
-     * Diff map.
-     *
-     * @param orig   the orig
-     * @param latest the latest
-     * @return the map
-     */
     public static Map diff(LinkedHashMap orig, LinkedHashMap latest) {
         orig = new LinkedHashMap<>(orig);
         latest = new LinkedHashMap<>(latest);
@@ -930,54 +651,52 @@ public class ConfigurationUtils {
         return new HashMap<>(latest);
     }
 
-    /**
-     * Is array boolean.
-     *
-     * @param tenant          the tenant
-     * @param namespace       the namespace
-     * @param key             the key
-     * @param processingHints the processing hints
-     * @return the boolean
-     * @throws Exception the exception
-     */
-    public static boolean isArray(String tenant, String namespace, String key, int processingHints)
-            throws Exception {
+    public static boolean isArray(String tenant, String namespace, String key, int processingHints) throws Exception {
         Object obj = ConfigurationUtils
-                .getProperty(ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace), key,
-                        processingHints);
+                             .getProperty(ConfigurationRepository.lookup().getConfigurationFor(tenant, namespace), key,
+                                     processingHints);
         return (obj != null) && ConfigurationUtils.isCollection(obj.toString());
     }
 
-    /**
-     * Is direct lookup boolean.
-     *
-     * @param hints the hints
-     * @return the boolean
-     */
-    public static boolean isDirectLookup(int hints) {
-        return (hints & LATEST_LOOKUP.value()) == LATEST_LOOKUP.value();
+    public static Object getProperty(Configuration config, String key, int processingHints) {
+        if (!isDirectLookup(processingHints)) {
+            if (config instanceof AgglomerateConfiguration) {
+                return ((AgglomerateConfiguration) config).getPropertyValue(key);
+            } else if (config instanceof CompositeConfiguration) {
+                CompositeConfiguration conf = (CompositeConfiguration) config;
+                for (int i = 0; i < conf.getNumberOfConfigurations(); i++) {
+                    if (conf.getConfiguration(i) instanceof AgglomerateConfiguration) {
+                        return ((AgglomerateConfiguration) conf.getConfiguration(i)).getPropertyValue(key);
+                    } else if (isNodeSpecific(processingHints)) {
+                        Object obj = conf.getConfiguration(i).getProperty(key);
+                        if (obj != null) {
+                            return obj;
+                        }
+                    }
+                }
+            }
+        }
+        return config.getProperty(key);
     }
 
-    /**
-     * Is external lookup boolean.
-     *
-     * @param hints the hints
-     * @return the boolean
-     */
-    public static boolean isExternalLookup(int hints) {
-        return (hints & EXTERNAL_LOOKUP.value()) == EXTERNAL_LOOKUP.value();
+    public static boolean isCollection(String input) {
+        Pattern pattern = Pattern.compile("^\\[(.*)\\]$");
+        Matcher matcher = pattern.matcher(input);
+        return matcher.matches();
+    }
+
+    public static boolean isDirectLookup(int hints) {
+        return (hints & LATEST_LOOKUP.value()) == LATEST_LOOKUP.value();
     }
 
-    /**
-     * Is node specific boolean.
-     *
-     * @param hints the hints
-     * @return the boolean
-     */
     public static boolean isNodeSpecific(int hints) {
         return (hints & NODE_SPECIFIC.value()) == NODE_SPECIFIC.value();
     }
 
+    public static boolean isExternalLookup(int hints) {
+        return (hints & EXTERNAL_LOOKUP.value()) == EXTERNAL_LOOKUP.value();
+    }
+
     public static boolean isZeroLengthArray(Class clazz, Object obj) {
         if (clazz.isArray() && clazz.getComponentType().isPrimitive()) {
             if (clazz.getComponentType() == int.class) {
@@ -1002,12 +721,6 @@ public class ConfigurationUtils {
         return false;
     }
 
-    /**
-     * Checks if value is blank
-     *
-     * @param value
-     * @return
-     */
     public static boolean isBlank(String value) {
         return value == null || value.trim().length() == 0;
     }