You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2012/12/28 21:26:18 UTC

svn commit: r1426621 - in /commons/proper/configuration/trunk/src: main/java/org/apache/commons/configuration/builder/combined/ test/java/org/apache/commons/configuration/builder/combined/

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.
      */