Author: oheger
Date: Sat Jun 1 19:58:15 2013
New Revision: 1488579
URL: http://svn.apache.org/r1488579
Log:
BasicConfigurationBuilder now supports the Initializable interface.
If a newly created result instance implements this interface, the initialize()
method is called after other initializations are done.
Modified:
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilder.java
Modified:
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java
URL:
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java?rev=1488579&r1=1488578&r2=1488579&view=diff
==============================================================================
---
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java
(original)
+++
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/BasicConfigurationBuilder.java
Sat Jun 1 19:58:15 2013
@@ -27,6 +27,7 @@ import org.apache.commons.configuration.
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.ConfigurationRuntimeException;
import org.apache.commons.configuration.ConfigurationUtils;
+import org.apache.commons.configuration.Initializable;
import org.apache.commons.configuration.beanutils.BeanDeclaration;
import org.apache.commons.configuration.beanutils.BeanHelper;
import org.apache.commons.configuration.beanutils.ConstructorArg;
@@ -52,6 +53,12 @@ import org.apache.commons.lang3.event.Ev
* {@code Configuration} instances with different properties can be created.
* </p>
* <p>
+ * If the newly created {@code Configuration} object implements the
+ * {@code Initializable} interface, its {@code initialize()} method is called
+ * after all initialization properties have been set. This way a concrete
+ * implementation class can perform arbitrary initialization steps.
+ * </p>
+ * <p>
* There are multiple options for setting up a {@code
BasicConfigurationBuilder}
* instance:
* <ul>
@@ -482,6 +489,7 @@ public class BasicConfigurationBuilder<T
{
BeanHelper.initBean(obj, getResultDeclaration());
registerEventListeners(obj);
+ handleInitializable(obj);
}
/**
@@ -681,4 +689,20 @@ public class BasicConfigurationBuilder<T
}
return filteredMap;
}
+
+ /**
+ * Performs special initialization of the result object. This method is
+ * called after parameters have been set on a newly created result
instance.
+ * If supported by the result class, the {@code initialize()} method is now
+ * called.
+ *
+ * @param obj the newly created result object
+ */
+ private void handleInitializable(T obj)
+ {
+ if (obj instanceof Initializable)
+ {
+ ((Initializable) obj).initialize();
+ }
+ }
}
Modified:
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilder.java
URL:
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilder.java?rev=1488579&r1=1488578&r2=1488579&view=diff
==============================================================================
---
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilder.java
(original)
+++
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestBasicConfigurationBuilder.java
Sat Jun 1 19:58:15 2013
@@ -30,10 +30,12 @@ import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.BaseHierarchicalConfiguration;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.ConfigurationRuntimeException;
+import org.apache.commons.configuration.Initializable;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.beanutils.BeanDeclaration;
@@ -512,6 +514,23 @@ public class TestBasicConfigurationBuild
}
/**
+ * Tests whether a configuration implementing {@code Initializable} is
+ * correctly handled.
+ */
+ @Test
+ public void testInitializableCalled() throws ConfigurationException
+ {
+ BasicConfigurationBuilder<InitializableConfiguration> builder =
+ new BasicConfigurationBuilder<InitializableConfiguration>(
+ InitializableConfiguration.class);
+ builder.configure(new BasicBuilderParameters()
+ .setThrowExceptionOnMissing(true));
+ InitializableConfiguration config = builder.getConfiguration();
+ assertEquals("Property not correctly initialized",
+ "Initialized with flag true", config.getInitProperty());
+ }
+
+ /**
* A test thread class for testing whether the builder's result object can
* be requested concurrently.
*/
@@ -585,4 +604,30 @@ public class TestBasicConfigurationBuild
throw new ConfigurationException("Initialization test exception!");
}
}
+
+ /**
+ * A test configuration implementation which also implements Initializable.
+ */
+ public static class InitializableConfiguration extends BaseConfiguration
+ implements Initializable
+ {
+ /** A property which is initialized if the builder works as expected.
*/
+ private String initProperty;
+
+ /**
+ * Sets the value of the initProperty member based on other flag
values.
+ * This tests whether the method is called after other properties have
+ * been set.
+ */
+ public void initialize()
+ {
+ initProperty =
+ "Initialized with flag " + isThrowExceptionOnMissing();
+ }
+
+ public String getInitProperty()
+ {
+ return initProperty;
+ }
+ }
}