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/06/01 21:58:45 UTC

svn commit: r1488580 - in /commons/proper/configuration/trunk/src: main/java/org/apache/commons/configuration/BaseHierarchicalConfiguration.java test/java/org/apache/commons/configuration/TestHierarchicalConfiguration.java

Author: oheger
Date: Sat Jun  1 19:58:45 2013
New Revision: 1488580

URL: http://svn.apache.org/r1488580
Log:
BaseHierarchicalConfiguration now implements the Initializable interface.

In initialize() internal data structures for managing SubnodeConfigurations are
initialized. So this initialization does not have to be performed lazily,
which makes concurrent access to SubnodeConfigurations possible without
having to use a fully functional Synchronizer.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseHierarchicalConfiguration.java
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestHierarchicalConfiguration.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseHierarchicalConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseHierarchicalConfiguration.java?rev=1488580&r1=1488579&r2=1488580&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseHierarchicalConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseHierarchicalConfiguration.java Sat Jun  1 19:58:45 2013
@@ -145,7 +145,7 @@ import org.apache.commons.configuration.
  * @version $Id$
  */
 public class BaseHierarchicalConfiguration extends AbstractConfiguration
-    implements Serializable, Cloneable, HierarchicalConfiguration
+    implements Serializable, Cloneable, HierarchicalConfiguration, Initializable
 {
     /**
      * Constant for the clear tree event.
@@ -234,6 +234,18 @@ public class BaseHierarchicalConfigurati
     }
 
     /**
+     * Performs special initialization of this configuration. This
+     * implementation ensures that internal data structures for managing
+     * {@code SubnodeConfiguration} objects are initialized. If this is done
+     * directly after the creation of an instance, this instance can be accessed
+     * in a read-only manner without requiring a specific {@code Synchronizer}.
+     */
+    public void initialize()
+    {
+        ensureSubConfigManagementDataSetUp();
+    }
+
+    /**
      * Returns the root node of this hierarchical configuration.
      *
      * @return the root node
@@ -880,10 +892,7 @@ public class BaseHierarchicalConfigurati
         String subnodeKey = supportUpdates ? key : null;
         SubnodeConfiguration sub = createSubnodeConfiguration(node, subnodeKey);
 
-        if (changeListener == null)
-        {
-            setUpSubConfigManagementData();
-        }
+        ensureSubConfigManagementDataSetUp();
         sub.addConfigurationListener(changeListener);
         sub.initSubConfigManagementData(subConfigs, changeListener);
         sub.setSynchronizer(getSynchronizer());
@@ -913,6 +922,18 @@ public class BaseHierarchicalConfigurati
     }
 
     /**
+     * Ensures that internal data structures for managing associated
+     * {@code SubnodeConfiguration} objects are initialized.
+     */
+    private void ensureSubConfigManagementDataSetUp()
+    {
+        if (changeListener == null)
+        {
+            setUpSubConfigManagementData();
+        }
+    }
+
+    /**
      * Initializes internal data structures for managing associated
      * {@code SubnodeConfiguration} objects.
      */

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestHierarchicalConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestHierarchicalConfiguration.java?rev=1488580&r1=1488579&r2=1488580&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestHierarchicalConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestHierarchicalConfiguration.java Sat Jun  1 19:58:45 2013
@@ -1157,6 +1157,35 @@ public class TestHierarchicalConfigurati
     }
 
     /**
+     * Tests the initialize() method. We can only test that a new configuration
+     * listener was added.
+     */
+    @Test
+    public void testInitialize()
+    {
+        Collection<ConfigurationListener> listeners =
+                config.getConfigurationListeners();
+        config.initialize();
+        assertEquals("No new listener added", listeners.size() + 1, config
+                .getConfigurationListeners().size());
+    }
+
+    /**
+     * Tests that calling initialize() multiple times does not initialize
+     * internal structures more than once.
+     */
+    @Test
+    public void testInitializeTwice()
+    {
+        Collection<ConfigurationListener> listeners =
+                config.getConfigurationListeners();
+        config.initialize();
+        config.initialize();
+        assertEquals("Too many listener added", listeners.size() + 1, config
+                .getConfigurationListeners().size());
+    }
+
+    /**
      * Helper method for testing the getKeys(String) method.
      *
      * @param prefix the key to pass into getKeys()