Author: oheger Date: Sun Apr 27 16:50:19 2014 New Revision: 1590417 URL: http://svn.apache.org/r1590417 Log: [CONFIGURATION-572] Fixed a possible memory leak.
When a CombinedConfiguration is cleared it is now ensured that change listener registrations are removed for all child configurations. Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CombinedConfiguration.java commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestCombinedConfiguration.java Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CombinedConfiguration.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CombinedConfiguration.java?rev=1590417&r1=1590416&r2=1590417&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CombinedConfiguration.java (original) +++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CombinedConfiguration.java Sun Apr 27 16:50:19 2014 @@ -655,6 +655,7 @@ public class CombinedConfiguration exten @Override protected void clearInternal() { + unregisterListenerAtChildren(); initChildCollections(); invalidateInternal(); } @@ -972,6 +973,21 @@ public class CombinedConfiguration exten } /** + * Removes this combined configuration as listener from all child + * configurations. This method is called on a clear() operation. + */ + private void unregisterListenerAtChildren() + { + if (configurations != null) + { + for (ConfigData child : configurations) + { + unregisterListenerAt(child.getConfiguration()); + } + } + } + + /** * Returns the number of child configurations in this combined * configuration. The internal list of child configurations is accessed * without synchronization. Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestCombinedConfiguration.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestCombinedConfiguration.java?rev=1590417&r1=1590416&r2=1590417&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestCombinedConfiguration.java (original) +++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestCombinedConfiguration.java Sun Apr 27 16:50:19 2014 @@ -18,6 +18,7 @@ package org.apache.commons.configuration import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; @@ -450,6 +451,24 @@ public class TestCombinedConfiguration } /** + * Tests whether the combined configuration removes itself as change + * listener from the child configurations on a clear operation. This test is + * related to CONFIGURATION-572. + */ + @Test + public void testClearRemoveChildListener() + { + AbstractConfiguration child = setUpTestConfiguration(); + config.addConfiguration(child); + + config.clear(); + for (ConfigurationListener listener : child.getConfigurationListeners()) + { + assertNotEquals("Still registered", config, listener); + } + } + + /** * Prepares a test of the getSource() method. */ private void setUpSourceTest()