public void reloadApplicationDescriptions(String applicationDescriptionsConfigFile) throws IOException {
        applicationsMap = new ConcurrentHashMap<String, Application>();
        classLoaderMap = new ConcurrentHashMap<String, ClassLoader>();
        applicationPathMap = new ConcurrentHashMap<String, String>();

        domainApplicationsMap = new ConcurrentHashMap<String, List<String>>();
        domainDefaultApplicationMap = new ConcurrentHashMap<String, String>();
        domainNameList = new ArrayList<String>();
        Properties properties = new Properties();

        properties.load(new FileReader(applicationDescriptionsConfigFile));

        // there should be domains key in properties
        if (properties.containsKey("domains")) {
            // read(remove) domains key
            // split with comma
            String[] domainNames = String.valueOf(properties.remove("domains")).split(",");
            // for each domain, check for .applications (remove)
            for (String domainName : domainNames) {
                if (domainName == null || domainName.trim().isEmpty()) {
                    continue;
                }
                domainNameList.add(domainName);
                if (properties.containsKey(domainName + ".applications")) {
                    // add each domain's applications to domainApplicationsMap
                    String[] applicationNames = String.valueOf(properties.remove(domainName + ".applications")).split(",");
                    for (String applicationName : applicationNames) {
                        if (!domainApplicationsMap.containsKey(domainName)) {
                            domainApplicationsMap.put(domainName, new ArrayList<String>());
                        }
                        domainApplicationsMap.get(domainName).add(applicationName);
                    }
                }
                // for each domain, check for .default (remove)
                if (properties.containsKey(domainName + ".default")) {
                    // add each domain with its default application to domainDefaultApplicationMap
                    String defaultApplication = String.valueOf(properties.remove(domainName + ".default"));
                    domainDefaultApplicationMap.put(domainName, defaultApplication);
                }
            }
        }
        for (String propertyName : properties.stringPropertyNames()) {
            applicationPathMap.put(propertyName.trim(), (String.valueOf(properties.get(propertyName))).trim());
        }
    }