All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springmodules.commons.configuration.CommonsConfigurationFactoryBean Maven / Gradle / Ivy

/**
 * Created on Feb 13, 2006
 *
 * $Id: CommonsConfigurationFactoryBean.java,v 1.2 2009/08/04 09:31:47 andress Exp $
 * $Revision: 1.2 $
 */
package org.springmodules.commons.configuration;

import java.net.URL;

import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationConverter;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.event.ConfigurationListener;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;

/**
 * FactoryBean which wraps a Commons CompositeConfiguration object for usage
 * with PropertiesLoaderSupport. This allows the configuration object to behave
 * like a normal java.util.Properties object which can be passed on to
 * setProperties() method allowing PropertyOverrideConfigurer and
 * PropertyPlaceholderConfigurer to take advantage of Commons Configuration.
 * 
 * Internally a CompositeConfiguration object is used for merging multiple
 * Configuration objects.
 * 
 * @see java.util.Properties
 * @see org.springframework.core.io.support.PropertiesLoaderSupport
 * 
 * @author Costin Leau
 * 
 */
public class CommonsConfigurationFactoryBean implements InitializingBean, FactoryBean {

	private CompositeConfiguration configuration;
	
	private ConfigurationListener listener = null;

	private Configuration[] configurations;

	private Resource[] locations;

	private boolean throwExceptionOnMissing = true;

	public CommonsConfigurationFactoryBean() {
	}

	public CommonsConfigurationFactoryBean(Configuration configuration) {
		Assert.notNull(configuration, "Configuration is mandatory");
		this.configuration = new CompositeConfiguration(configuration);
	}

	/**
	 * @see org.springframework.beans.factory.FactoryBean#getObject()
	 */
	public java.util.Properties getObject() throws Exception {
		return (configuration != null) ? ConfigurationConverter.getProperties(configuration) : null;
	}

	/**
	 * @see org.springframework.beans.factory.FactoryBean#getObjectType()
	 */
	public Class getObjectType() {
		return java.util.Properties.class;
	}

	/**
	 * @see org.springframework.beans.factory.FactoryBean#isSingleton()
	 */
	public boolean isSingleton() {
		return true;
	}

	/**
	 * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
	 */
	public void afterPropertiesSet() throws Exception {
		if (configuration == null && (configurations == null || configurations.length == 0)
				&& (locations == null || locations.length == 0))
			throw new IllegalArgumentException("no configuration object or location specified");

		if (configuration == null)
			configuration = new CompositeConfiguration();
		
		if( null != listener ){
		    configuration.removeConfigurationListener( listener );
		    configuration.addConfigurationListener( listener );
		}

		configuration.setThrowExceptionOnMissing(throwExceptionOnMissing);

		if (configurations != null) {
			for (int i = 0; i < configurations.length; i++) {
				configuration.addConfiguration(configurations[i]);
			}
		}
		
		if (locations != null) {
			for (int i = 0; i < locations.length; i++) {
				URL url = locations[i].getURL();
				Configuration props = new PropertiesConfiguration(url);
				configuration.addConfiguration(props);
			}
		}
	}

	/**
	 * @return Returns the configurations.
	 */
	public Configuration[] getConfigurations() {
		return configurations;
	}

	/**
	 * Set the commons configurations objects which will be used as properties.
	 * 
	 * @param configurations
	 */
	public void setConfigurations(Configuration[] configurations) {
		this.configurations = configurations;
	}

	public Resource[] getLocations() {
		return locations;
	}

	/**
	 * Shortcut for loading configuration from Spring resources. It will
	 * internally create a PropertiesConfiguration object based on the URL
	 * retrieved from the given Resources.
	 * 
	 * @param locations
	 */
	public void setLocations(Resource[] locations) {
		this.locations = locations;
	}

	public boolean isThrowExceptionOnMissing() {
		return throwExceptionOnMissing;
	}

	/**
	 * Set the underlying Commons CompositeConfiguration throwExceptionOnMissing
	 * flag.
	 * @param throwExceptionOnMissing
	 */
	public void setThrowExceptionOnMissing(boolean throwExceptionOnMissing) {
		this.throwExceptionOnMissing = throwExceptionOnMissing;
	}

	/**
	 * Getter for the underlying CompositeConfiguration object.
	 * 
	 * @return
	 */
	public CompositeConfiguration getConfiguration() {
		return configuration;
	}
	
	public void setConfigurationListener( ConfigurationListener listener ){
	    this.listener = listener;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy