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 2013/04/02 21:06:46 UTC

svn commit: r1463688 - 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: Tue Apr  2 19:06:45 2013
New Revision: 1463688

URL: http://svn.apache.org/r1463688
Log:
CombinedConfigurationBuilder now evaluates default parameters for child
configuration sources and initializes child parameter objects correspondingly.

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=1463688&r1=1463687&r2=1463688&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 Tue Apr  2 19:06:45 2013
@@ -27,10 +27,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.beanutils.PropertyUtils;
 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.ConfigurationRuntimeException;
 import org.apache.commons.configuration.FileSystem;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.SubnodeConfiguration;
@@ -991,6 +993,8 @@ public class CombinedConfigurationBuilde
      */
     protected void initChildBuilderParameters(BuilderParameters params)
     {
+        initDefaultChildParameters(params);
+
         if (params instanceof BasicBuilderParameters)
         {
             initChildBasicParameters((BasicBuilderParameters) params);
@@ -1116,6 +1120,29 @@ public class CombinedConfigurationBuilde
     }
 
     /**
+     * Copies all matching default parameters for child configuration sources to
+     * the passed in parameters object. This implementation iterates over all
+     * default parameters object of the current combined builder parameters. If
+     * the passed in object is assignment compatible with one of these objects,
+     * all properties are copied.
+     *
+     * @param params the parameters to be initialized
+     * @throws ConfigurationRuntimeException if an error occurs when copying
+     *         properties
+     */
+    private void initDefaultChildParameters(BuilderParameters params)
+    {
+        for (BuilderParameters p : currentParameters
+                .getDefaultChildParameters())
+        {
+            if (p.getClass().isInstance(params))
+            {
+                copyProperties(params, p);
+            }
+        }
+    }
+
+    /**
      * 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 and
@@ -1299,6 +1326,30 @@ public class CombinedConfigurationBuilde
     }
 
     /**
+     * Copies all properties from one parameters object to another one. This
+     * method copies all data contained in the parameters map. In addition,
+     * properties with get and set methods are also copied.
+     *
+     * @param dest the destination parameters object
+     * @param src the source parameters object
+     * @throws ConfigurationRuntimeException if an error occurs
+     */
+    private static void copyProperties(BuilderParameters dest,
+            BuilderParameters src)
+    {
+        try
+        {
+            PropertyUtils.copyProperties(dest, src.getParameters());
+            PropertyUtils.copyProperties(dest, src);
+        }
+        catch (Exception e)
+        {
+            // Handle all reflection-related exceptions the same way
+            throw new ConfigurationRuntimeException(e);
+        }
+    }
+
+    /**
      * Creates the map with the default configuration builder providers.
      *
      * @return the map with default providers

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=1463688&r1=1463687&r2=1463688&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 Tue Apr  2 19:06:45 2013
@@ -40,6 +40,7 @@ import org.apache.commons.configuration.
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationAssert;
 import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.ConfigurationRuntimeException;
 import org.apache.commons.configuration.ConfigurationUtils;
 import org.apache.commons.configuration.DefaultFileSystem;
 import org.apache.commons.configuration.DynamicCombinedConfiguration;
@@ -54,8 +55,11 @@ import org.apache.commons.configuration.
 import org.apache.commons.configuration.builder.ConfigurationBuilder;
 import org.apache.commons.configuration.builder.FileBasedBuilderParametersImpl;
 import org.apache.commons.configuration.builder.FileBasedConfigurationBuilder;
+import org.apache.commons.configuration.builder.HierarchicalBuilderParametersImpl;
+import org.apache.commons.configuration.builder.PropertiesBuilderParametersImpl;
 import org.apache.commons.configuration.builder.ReloadingFileBasedConfigurationBuilder;
 import org.apache.commons.configuration.builder.XMLBuilderParametersImpl;
+import org.apache.commons.configuration.builder.fluent.Parameters;
 import org.apache.commons.configuration.event.ConfigurationErrorListener;
 import org.apache.commons.configuration.event.ConfigurationListener;
 import org.apache.commons.configuration.interpol.ConfigurationInterpolator;
@@ -64,6 +68,7 @@ import org.apache.commons.configuration.
 import org.apache.commons.configuration.reloading.ReloadingController;
 import org.apache.commons.configuration.reloading.ReloadingControllerSupport;
 import org.apache.commons.configuration.resolver.CatalogResolver;
+import org.apache.commons.configuration.tree.ExpressionEngine;
 import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
 import org.easymock.EasyMock;
 import org.junit.After;
@@ -959,6 +964,78 @@ public class TestCombinedConfigurationBu
     }
 
     /**
+     * Tests whether default child properties in the combined builder's
+     * configuration are inherited by child parameter objects.
+     */
+    @Test
+    public void testInitChildBuilderParametersDefaultChildProperties()
+            throws ConfigurationException
+    {
+        final Long defRefresh = 60000L;
+        final Long xmlRefresh = 30000L;
+        builder.configure(Parameters
+                .combined()
+                .setDefinitionBuilderParameters(
+                        Parameters.fileBased().setFile(TEST_FILE))
+                .addChildParameters(
+                        new FileBasedBuilderParametersImpl()
+                                .setReloadingRefreshDelay(defRefresh)
+                                .setThrowExceptionOnMissing(true))
+                .addChildParameters(
+                        new XMLBuilderParametersImpl()
+                                .setValidating(false)
+                                .setExpressionEngine(
+                                        new XPathExpressionEngine())
+                                .setReloadingRefreshDelay(xmlRefresh)));
+        builder.getConfiguration();
+        XMLBuilderParametersImpl params = new XMLBuilderParametersImpl();
+        builder.initChildBuilderParameters(params);
+        assertTrue(
+                "Wrong expression engine",
+                params.getParameters().get("expressionEngine") instanceof XPathExpressionEngine);
+        assertEquals("Validating flag not set", Boolean.FALSE, params
+                .getParameters().get("validating"));
+        assertEquals("Wrong XML refresh", xmlRefresh,
+                params.getReloadingRefreshDelay());
+        assertEquals("Basic flag not set", Boolean.TRUE, params.getParameters()
+                .get("throwExceptionOnMissing"));
+
+        PropertiesBuilderParametersImpl params2 =
+                new PropertiesBuilderParametersImpl();
+        builder.initChildBuilderParameters(params2);
+        assertEquals("Wrong default refresh", defRefresh,
+                params2.getReloadingRefreshDelay());
+    }
+
+    /**
+     * Tests whether exceptions on initializing default child properties are
+     * handled.
+     */
+    @Test(expected = ConfigurationRuntimeException.class)
+    public void testInitChildBuilderParametersDefaultChildPropertiesEx()
+            throws ConfigurationException
+    {
+        builder.configure(Parameters
+                .combined()
+                .setDefinitionBuilderParameters(
+                        Parameters.fileBased().setFile(TEST_FILE))
+                .addChildParameters(
+                        new HierarchicalBuilderParametersImpl()
+                                .setExpressionEngine(new XPathExpressionEngine())));
+        builder.getConfiguration();
+        XMLBuilderParametersImpl params = new XMLBuilderParametersImpl()
+        {
+            @Override
+            public HierarchicalBuilderParametersImpl setExpressionEngine(
+                    ExpressionEngine engine)
+            {
+                throw new ConfigurationRuntimeException("Test exception");
+            }
+        };
+        builder.initChildBuilderParameters(params);
+    }
+
+    /**
      * Tests whether a Lookup object can be declared in the definition
      * configuration.
      */