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;
+        }
+    }
 }


Reply via email to