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/11/29 21:53:46 UTC
svn commit: r1546643 - 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 Nov 29 20:53:46 2013
New Revision: 1546643
URL: http://svn.apache.org/r1546643
Log:
CombinedBuilderProperties now supports DefaultParametersHandler objects.
The intension is to use the same mechanism for specifying default values for
child configuration sources as is used for normal parameter objects.
Modified:
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderParametersImpl.java
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderProperties.java
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedBuilderParametersImpl.java
Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderParametersImpl.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderParametersImpl.java?rev=1546643&r1=1546642&r2=1546643&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderParametersImpl.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderParametersImpl.java Fri Nov 29 20:53:46 2013
@@ -28,6 +28,8 @@ import org.apache.commons.configuration.
import org.apache.commons.configuration.builder.BasicBuilderParameters;
import org.apache.commons.configuration.builder.BuilderParameters;
import org.apache.commons.configuration.builder.ConfigurationBuilder;
+import org.apache.commons.configuration.builder.DefaultParametersHandler;
+import org.apache.commons.configuration.builder.DefaultParametersManager;
/**
* <p>
@@ -67,6 +69,9 @@ public class CombinedBuilderParametersIm
/** A list with default parameters for child configuration sources. */
private final Collection<BuilderParameters> childParameters;
+ /** The manager for default handlers. */
+ private DefaultParametersManager childDefaultParametersManager;
+
/** The base path for configuration sources to be loaded. */
private String basePath;
@@ -344,6 +349,64 @@ public class CombinedBuilderParametersIm
}
/**
+ * Returns the {@code DefaultParametersManager} object for initializing
+ * parameter objects for child configuration sources. This method never
+ * returns <b>null</b>. If no manager was set, a new instance is created
+ * right now.
+ *
+ * @return the {@code DefaultParametersManager} for child configuration
+ * sources
+ */
+ public DefaultParametersManager getChildDefaultParametersManager()
+ {
+ if (childDefaultParametersManager == null)
+ {
+ childDefaultParametersManager = new DefaultParametersManager();
+ }
+ return childDefaultParametersManager;
+ }
+
+ /**
+ * {@inheritDoc} This implementation stores the passed in manager object. An
+ * already existing manager object (either explicitly set or created on
+ * demand) is overridden. This also removes all default handlers registered
+ * before!
+ */
+ public CombinedBuilderParametersImpl setChildDefaultParametersManager(
+ DefaultParametersManager manager)
+ {
+ childDefaultParametersManager = manager;
+ return this;
+ }
+
+ /**
+ * {@inheritDoc} This implementation registers the passed in handler at an
+ * internal {@link DefaultParametersManager} instance. If none was set, a
+ * new instance is created now.
+ */
+ public <D> CombinedBuilderParametersImpl registerChildDefaultsHandler(
+ Class<D> paramClass, DefaultParametersHandler<? super D> handler)
+ {
+ getChildDefaultParametersManager().registerDefaultsHandler(paramClass,
+ handler);
+ return this;
+ }
+
+ /**
+ * {@inheritDoc} This implementation registers the passed in handler at an
+ * internal {@link DefaultParametersManager} instance. If none was set, a
+ * new instance is created now.
+ */
+ public <D> CombinedBuilderParametersImpl registerChildDefaultsHandler(
+ Class<D> paramClass, DefaultParametersHandler<? super D> handler,
+ Class<?> startClass)
+ {
+ getChildDefaultParametersManager().registerDefaultsHandler(paramClass,
+ handler, startClass);
+ return this;
+ }
+
+ /**
* {@inheritDoc} This implementation returns a map which contains this
* object itself under a specific key. The static {@code fromParameters()}
* method can be used to extract an instance from a parameters map.
Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderProperties.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderProperties.java?rev=1546643&r1=1546642&r2=1546643&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderProperties.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/combined/CombinedBuilderProperties.java Fri Nov 29 20:53:46 2013
@@ -19,6 +19,8 @@ package org.apache.commons.configuration
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.configuration.builder.BuilderParameters;
import org.apache.commons.configuration.builder.ConfigurationBuilder;
+import org.apache.commons.configuration.builder.DefaultParametersHandler;
+import org.apache.commons.configuration.builder.DefaultParametersManager;
/**
* <p>
@@ -111,4 +113,58 @@ public interface CombinedBuilderProperti
* @return a reference to this object for method chaining
*/
T addChildParameters(BuilderParameters params);
+
+ /**
+ * Sets a {@code DefaultParametersManager} object responsible for managing the default
+ * parameter handlers to be applied on child configuration sources. When creating
+ * builders for child configuration sources their parameters are initialized using
+ * this {@code DefaultParametersManager} instance. This way, meaningful defaults can
+ * be set. Note that calling this method overrides all
+ * {@code DefaultParametersHandler} objects previously set by one of the
+ * {@code registerChildDefaultsHandler()} methods! So either use this method if a
+ * pre-configured manager object is to be set or call the
+ * {@code registerChildDefaultHandler()} methods with the handlers to be registered
+ * (in the latter case, it is not necessary to set a {@code DefaultParametersManager}
+ * explicitly; a default one is created behind the scenes).
+ *
+ * @param manager the {@code DefaultParametersManager}
+ * @return a reference to this object for method chaining
+ */
+ T setChildDefaultParametersManager(DefaultParametersManager manager);
+
+ /**
+ * Registers a {@code DefaultParametersHandler} for child configuration sources. With
+ * this method an arbitrary number of handler objects can be set. When creating
+ * builders for child configuration sources their parameters are initialized by
+ * invoking all matching {@code DefaultParametersHandler}s on them. So, basically the
+ * same mechanism is used for the initialization of parameters for child configuration
+ * sources as for normal parameter objects.
+ *
+ * @param <D> the type of the handler to be registered
+ * @param paramClass the parameter class supported by the handler
+ * @param handler the {@code DefaultParametersHandler} to be registered
+ * @return a reference to this object for method chaining
+ * @see DefaultParametersManager#registerDefaultsHandler(Class,
+ * DefaultParametersHandler)
+ */
+ <D> T registerChildDefaultsHandler(Class<D> paramClass,
+ DefaultParametersHandler<? super D> handler);
+
+ /**
+ * Registers a {@code DefaultParametersHandler} for child configuration sources
+ * derived from the given start class. This method works like the overloaded variant,
+ * but limits the application of the defaults handler to specific child configuration
+ * sources.
+ *
+ * @param <D> the type of the handler to be registered
+ * @param paramClass the parameter class supported by the handler
+ * @param handler the {@code DefaultParametersHandler} to be registered
+ * @param startClass an optional start class in the hierarchy of parameter objects for
+ * which this handler should be applied
+ * @return a reference to this object for method chaining
+ * @see DefaultParametersManager#registerDefaultsHandler(Class,
+ * DefaultParametersHandler, Class)
+ */
+ <D> T registerChildDefaultsHandler(Class<D> paramClass,
+ DefaultParametersHandler<? super D> handler, Class<?> startClass);
}
Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedBuilderParametersImpl.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedBuilderParametersImpl.java?rev=1546643&r1=1546642&r2=1546643&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedBuilderParametersImpl.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedBuilderParametersImpl.java Fri Nov 29 20:53:46 2013
@@ -34,8 +34,11 @@ import org.apache.commons.configuration.
import org.apache.commons.configuration.builder.BasicConfigurationBuilder;
import org.apache.commons.configuration.builder.BuilderParameters;
import org.apache.commons.configuration.builder.ConfigurationBuilder;
+import org.apache.commons.configuration.builder.DefaultParametersHandler;
+import org.apache.commons.configuration.builder.DefaultParametersManager;
import org.apache.commons.configuration.builder.PropertiesBuilderParametersImpl;
import org.apache.commons.configuration.builder.XMLBuilderParametersImpl;
+import org.apache.commons.configuration.builder.fluent.FileBasedBuilderParameters;
import org.apache.commons.configuration.tree.ExpressionEngine;
import org.easymock.EasyMock;
import org.junit.Test;
@@ -390,4 +393,71 @@ public class TestCombinedBuilderParamete
assertTrue("Got child parameters", params.getDefaultChildParameters()
.isEmpty());
}
+
+ /**
+ * Tests whether a default parameters manager is dynamically created if it has not
+ * been set.
+ */
+ @Test
+ public void testGetChildDefaultParametersManagerUndefined() {
+ CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
+ assertNotNull("No default manager", params.getChildDefaultParametersManager());
+ }
+
+ /**
+ * Tests whether a default parameters manager can be set and queried.
+ */
+ @Test
+ public void testGetChildDefaultParametersManagerSpecific() {
+ DefaultParametersManager manager = EasyMock
+ .createMock(DefaultParametersManager.class);
+ EasyMock.replay(manager);
+ CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
+ assertSame("Wrong result", params,
+ params.setChildDefaultParametersManager(manager));
+ assertSame("Wrong manager", manager, params.getChildDefaultParametersManager());
+ }
+
+ /**
+ * Creates a mock for a defaults handler.
+ * @return the handler mock
+ */
+ private static DefaultParametersHandler<BuilderParameters> createDefaultsHandlerMock()
+ {
+ @SuppressWarnings("unchecked")
+ DefaultParametersHandler<BuilderParameters> mock = EasyMock.createMock(DefaultParametersHandler.class);
+ return mock;
+ }
+
+ /**
+ * Tests whether a defaults handler for a child source can be registered.
+ */
+ @Test
+ public void testRegisterChildDefaultsHandler()
+ {
+ DefaultParametersManager manager = EasyMock.createMock(DefaultParametersManager.class);
+ DefaultParametersHandler<BuilderParameters> handler = createDefaultsHandlerMock();
+ manager.registerDefaultsHandler(BuilderParameters.class, handler);
+ EasyMock.replay(manager, handler);
+ CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
+ params.setChildDefaultParametersManager(manager);
+ assertSame("Wrong result", params, params.registerChildDefaultsHandler(BuilderParameters.class, handler));
+ EasyMock.verify(manager);
+ }
+
+ /**
+ * Tests whether a defaults handler for a child source with a class restriction can be registered.
+ */
+ @Test
+ public void testRegisterChildDefaultsHandlerWithStartClass()
+ {
+ DefaultParametersManager manager = EasyMock.createMock(DefaultParametersManager.class);
+ DefaultParametersHandler<BuilderParameters> handler = createDefaultsHandlerMock();
+ manager.registerDefaultsHandler(BuilderParameters.class, handler, FileBasedBuilderParameters.class);
+ EasyMock.replay(manager, handler);
+ CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
+ params.setChildDefaultParametersManager(manager);
+ assertSame("Wrong result", params, params.registerChildDefaultsHandler(BuilderParameters.class, handler, FileBasedBuilderParameters.class));
+ EasyMock.verify(manager);
+ }
}