Author: oheger Date: Fri Dec 28 20:26:18 2012 New Revision: 1426621 URL: http://svn.apache.org/viewvc?rev=1426621&view=rev Log: CombinedConfigurationBuilder now supports interpolation over all child configuration sources.
Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedConfigurationBuilder.java commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedConfigurationBuilder.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedConfigurationBuilder.java?rev=1426621&r1=1426620&r2=1426621&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedConfigurationBuilder.java (original) +++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedConfigurationBuilder.java Fri Dec 28 20:26:18 2012 @@ -30,6 +30,7 @@ import org.apache.commons.configuration. import org.apache.commons.configuration.CombinedConfiguration; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.ConfigurationLookup; import org.apache.commons.configuration.FileSystem; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.commons.configuration.SubnodeConfiguration; @@ -510,6 +511,12 @@ public class CombinedConfigurationBuilde private CombinedConfiguration currentConfiguration; /** + * A {@code ConfigurationInterpolator} to be used as parent for all child + * configurations to enable cross-source interpolation. + */ + private ConfigurationInterpolator parentInterpolator; + + /** * Creates a new instance of {@code CombinedConfigurationBuilder}. No parameters * are set. */ @@ -739,6 +746,7 @@ public class CombinedConfigurationBuilde initSystemProperties(config, getBasePath()); registerConfiguredLookups(config, result); configureEntityResolver(config, currentXMLParameters); + setUpParentInterpolator(currentConfiguration, config); ConfigurationSourceData data = getSourceData(); createAndAddConfigurations(result, data.getOverrideBuilders(), data); @@ -1023,6 +1031,28 @@ public class CombinedConfigurationBuilde } /** + * Sets up a parent {@code ConfigurationInterpolator} object. This object + * has a default {@link Lookup} querying the resulting combined + * configuration. Thus interpolation works globally across all configuration + * sources. + * + * @param resultConfig the result configuration + * @param defConfig the definition configuration + */ + private void setUpParentInterpolator(Configuration resultConfig, + Configuration defConfig) + { + parentInterpolator = new ConfigurationInterpolator(); + parentInterpolator.addDefaultLookup(new ConfigurationLookup( + resultConfig)); + ConfigurationInterpolator defInterpolator = defConfig.getInterpolator(); + if (defInterpolator != null) + { + defInterpolator.setParentInterpolator(parentInterpolator); + } + } + + /** * Initializes the default base path for all file-based child configuration * sources. The base path can be explicitly defined in the parameters of * this builder. Otherwise, if the definition builder is a file-based @@ -1055,13 +1085,15 @@ public class CombinedConfigurationBuilde /** * Initializes basic builder parameters for a child configuration with * default settings set for this builder. This implementation ensures that - * all {@code Lookup} objects are propagated to child configurations. + * all {@code Lookup} objects are propagated to child configurations and + * interpolation is setup correctly. * * @param params the parameters object */ private void initChildBasicParameters(BasicBuilderParameters params) { params.setPrefixLookups(fetchPrefixLookups()); + params.setParentInterpolator(parentInterpolator); } /** Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java?rev=1426621&r1=1426620&r2=1426621&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java (original) +++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java Fri Dec 28 20:26:18 2012 @@ -41,6 +41,7 @@ import org.apache.commons.configuration. import org.apache.commons.configuration.FileSystem; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.configuration.SubnodeConfiguration; import org.apache.commons.configuration.XMLConfiguration; import org.apache.commons.configuration.XMLPropertiesConfiguration; import org.apache.commons.configuration.builder.BasicConfigurationBuilder; @@ -916,6 +917,31 @@ public class TestCombinedConfigurationBu } /** + * Tests whether variable substitution works across multiple child + * configurations and also in the definition configuration. + */ + @Test + public void testInterpolationOverMultipleSources() + throws ConfigurationException + { + File testFile = + ConfigurationAssert.getTestFile("testInterpolationBuilder.xml"); + factory.configure(new FileBasedBuilderParametersImpl().setFile(testFile)); + CombinedConfiguration combConfig = factory.getConfiguration(); + assertEquals("Wrong value", "abc-product", + combConfig.getString("products.product.desc")); + XMLConfiguration xmlConfig = + (XMLConfiguration) combConfig.getConfiguration("test"); + assertEquals("Wrong value from XML config", "abc-product", + xmlConfig.getString("products/product/desc")); + SubnodeConfiguration subConfig = + xmlConfig + .configurationAt("products/product[@name='abc']", true); + assertEquals("Wrong value from sub config", "abc-product", + subConfig.getString("desc")); + } + + /** * A test builder provider implementation for testing whether providers can * be defined in the definition file. */