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