package no.finntech.commons.constretto; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.constretto.ConstrettoBuilder; import org.constretto.ConstrettoConfiguration; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; /** Provides cache and convenience methods around ConstrettoConfigurations * It is hardcoded to use Spring's DefaultResourceLoader. */ public final class ConstrettoConfigurationFactory { // Constants ----------------------------------------------------- private static final ConstrettoConfigurationFactory INI_FILES = new ConstrettoConfigurationFactory(new IniFileConstrettoConfigurationFactory()); private static final ConstrettoConfigurationFactory PROPERTIES = new ConstrettoConfigurationFactory(new PropertiesConstrettoConfigurationFactory()); private static final ResourceLoader LOADER = new DefaultResourceLoader(); private static final Log LOG = LogFactory.getLog(ConstrettoConfigurationFactory.class); // Attributes ---------------------------------------------------- private final Map instances = new HashMap(); private final ReentrantReadWriteLock instancesLock = new ReentrantReadWriteLock(); private final ConstrettoBuilderFactory builderFactory; // Static -------------------------------------------------------- public static ConstrettoConfiguration iniFile(final String resource){ return INI_FILES.configuration(resource); } public static ConstrettoConfiguration properties(final String resource){ return PROPERTIES.configuration(resource); } // Constructors -------------------------------------------------- private ConstrettoConfigurationFactory(final ConstrettoBuilderFactory builderFactory){ this.builderFactory = builderFactory; } // Public -------------------------------------------------------- // Package protected --------------------------------------------- // Protected ----------------------------------------------------- // Private ------------------------------------------------------- private ConstrettoConfiguration configuration(final String resource){ ConstrettoConfiguration configuration = null; // Look for existing instances try{ instancesLock.readLock().lock(); LOG.trace("instances.get(" + resource + ")"); configuration = instances.get(resource); }finally{ instancesLock.readLock().unlock(); } // construct a new instance if (null == configuration) { try{ instancesLock.writeLock().lock(); LOG.debug("creating configuration for " + resource); configuration = builderFactory.createConstrettoBuilder(resource).getConfiguration(); instances.put(resource, configuration); }finally{ instancesLock.writeLock().unlock(); } } return configuration; } // Inner classes ------------------------------------------------- private interface ConstrettoBuilderFactory{ ConstrettoBuilder createConstrettoBuilder(String resource); } private static final class IniFileConstrettoConfigurationFactory implements ConstrettoBuilderFactory{ @Override public ConstrettoBuilder createConstrettoBuilder(final String resource) { return new ConstrettoBuilder() .createIniFileConfigurationStore() .addResource(LOADER.getResource(resource)) .done(); } } private static final class PropertiesConstrettoConfigurationFactory implements ConstrettoBuilderFactory{ @Override public ConstrettoBuilder createConstrettoBuilder(final String resource) { return new ConstrettoBuilder() .createPropertiesStore() .addResource(LOADER.getResource(resource)) .done(); } } }