ConfigurationFactory.java

package com.tradecloud.infrastructure.configuration;

import java.io.IOException;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.DynamicCombinedConfiguration;
import org.apache.commons.configuration.MultiFileHierarchicalConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.reloading.InvariantReloadingStrategy;
import org.apache.commons.configuration.tree.OverrideCombiner;
import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
import org.apache.log4j.Logger;
import org.springframework.core.io.Resource;

/**
 * Factory that creates a MultiTenant configuration
 * {@link DynamicCombinedConfiguration} to support MultiTenant configuration.
 */
public final class ConfigurationFactory {

    private static Logger logger = Logger.getLogger(ConfigurationFactory.class);

    /**
     * Base path of configuration resources.
     */
    private Resource basePath;

    public ConfigurationFactory(final Resource basePath) {
        this.basePath = basePath;
    }

    /**
     * @return combined configuration.
     * @throws ConfigurationException
     *             when the configuration file can't be loaded.
     * @throws IOException
     *             when the basePath can't be read.
     */
    public Configuration createInstance() throws ConfigurationException, IOException {
        DynamicCombinedConfiguration config = new DynamicCombinedConfiguration(new OverrideCombiner());
        config.setKeyPattern("${ctx:client}");

        config.setDelimiterParsingDisabled(true);
        // config.setForceReloadCheck(true);

        config.setForceReloadCheck(false);
        config.setExpressionEngine(new XPathExpressionEngine());

        MultiFileHierarchicalConfiguration multiFileonfig = new MultiFileHierarchicalConfiguration();
        String clientPattern = basePath.getURL().toExternalForm() + "${ctx:client}.xml";

        logger.debug("clientPattern:" + clientPattern);

        multiFileonfig.setFilePattern(clientPattern);
        multiFileonfig.setAutoSave(false);
        InvariantReloadingStrategy reloadStrategy = new InvariantReloadingStrategy();
        multiFileonfig.setReloadingStrategy(reloadStrategy);
        config.addConfiguration(multiFileonfig, "clientConfig", null);

        String defaultPattern = basePath.getURL().toExternalForm() + "default.xml";
        XMLConfiguration defaultConfig = new XMLConfiguration(defaultPattern);
        defaultConfig.setReloadingStrategy(reloadStrategy);
        config.addConfiguration(defaultConfig, "defaultConfig", null);
        return config;
    }

}