Author: ebourg
Date: Wed Mar  9 04:50:07 2005
New Revision: 156639

URL: http://svn.apache.org/viewcvs?view=rev&rev=156639
Log:
Fixed a ConcurrentModificationException thrown when calling clear() on a 
SubsetConfiguration applied to a BaseConfiguration.

Modified:
    
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractConfiguration.java
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDatabaseConfiguration.java
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubsetConfiguration.java
    jakarta/commons/proper/configuration/trunk/xdocs/changes.xml

Modified: 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractConfiguration.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractConfiguration.java?view=diff&r1=156638&r2=156639
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractConfiguration.java
 (original)
+++ 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractConfiguration.java
 Wed Mar  9 04:50:07 2005
@@ -261,7 +261,14 @@
         Iterator it = getKeys();
         while (it.hasNext())
         {
-            clearProperty((String) it.next());
+            String key = (String) it.next();
+            it.remove();
+
+            if (containsKey(key))
+            {
+                // workaround for Iterators that do not remove the property on 
calling remove()
+                clearProperty(key);
+            }
         }
     }
 

Modified: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDatabaseConfiguration.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDatabaseConfiguration.java?view=diff&r1=156638&r2=156639
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDatabaseConfiguration.java
 (original)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDatabaseConfiguration.java
 Wed Mar  9 04:50:07 2005
@@ -44,6 +44,8 @@
 {
     public final String DATABASE_DRIVER = "org.hsqldb.jdbcDriver";
     public final String DATABASE_URL = 
"jdbc:hsqldb:target/test-classes/testdb";
+    public final String DATABASE_USERNAME = "sa";
+    public final String DATABASE_PASSWORD = "";
 
     private static HsqlDB hsqlDB = null;
 
@@ -67,8 +69,8 @@
         BasicDataSource datasource = new BasicDataSource();
         datasource.setDriverClassName(DATABASE_DRIVER);
         datasource.setUrl(DATABASE_URL);
-        datasource.setUsername("sa");
-        datasource.setPassword("");
+        datasource.setUsername(DATABASE_USERNAME);
+        datasource.setPassword(DATABASE_PASSWORD);
 
         this.datasource = datasource;
         
@@ -118,7 +120,7 @@
 
     public void testGetPropertyDirectSingle()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
 
         assertEquals("property1", "value1", config.getProperty("key1"));
         assertEquals("property2", "value2", config.getProperty("key2"));
@@ -127,7 +129,7 @@
 
     public void testGetPropertyDirectMultiple()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
 
         assertEquals("property1", "value1", config.getProperty("key1"));
         assertEquals("property2", "value2", config.getProperty("key2"));
@@ -136,7 +138,7 @@
 
     public void testClearPropertySingle()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
         config.clearProperty("key");
 
         assertFalse("property not cleared", config.containsKey("key"));
@@ -144,7 +146,7 @@
 
     public void testClearPropertyMultiple()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
         config.clearProperty("key");
 
         assertFalse("property not cleared", config.containsKey("key"));
@@ -152,7 +154,7 @@
 
     public void testClearSingle()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
         config.clear();
 
         assertTrue("configuration is not cleared", config.isEmpty());
@@ -160,7 +162,7 @@
 
     public void testClearMultiple()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
         config.clear();
 
         assertTrue("configuration is not cleared", config.isEmpty());
@@ -168,7 +170,7 @@
 
     public void testGetKeysSingle()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
         Iterator it = config.getKeys();
 
         assertEquals("1st key", "key1", it.next());
@@ -177,7 +179,7 @@
 
     public void testGetKeysMultiple()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
         Iterator it = config.getKeys();
 
         assertEquals("1st key", "key1", it.next());
@@ -186,48 +188,59 @@
 
     public void testContainsKeySingle()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
         assertTrue("missing key1", config.containsKey("key1"));
         assertTrue("missing key2", config.containsKey("key2"));
     }
 
     public void testContainsKeyMultiple()
     {
-        DatabaseConfiguration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
+        Configuration config = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
         assertTrue("missing key1", config.containsKey("key1"));
         assertTrue("missing key2", config.containsKey("key2"));
     }
 
     public void testIsEmptySingle()
     {
-        DatabaseConfiguration config1 = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
+        Configuration config1 = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
         assertFalse("The configuration is empty", config1.isEmpty());
     }
 
     public void testIsEmptyMultiple()
     {
-        DatabaseConfiguration config1 = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
+        Configuration config1 = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "test");
         assertFalse("The configuration named 'test' is empty", 
config1.isEmpty());
 
-        DatabaseConfiguration config2 = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "testIsEmpty");
+        Configuration config2 = new DatabaseConfiguration(datasource, 
"configurations", "name", "key", "value", "testIsEmpty");
         assertTrue("The configuration named 'testIsEmpty' is not empty", 
config2.isEmpty());
     }
     
     public void testGetList()
     {
-        DatabaseConfiguration config1 = new DatabaseConfiguration(datasource, 
"configurationList", "key", "value");
+        Configuration config1 = new DatabaseConfiguration(datasource, 
"configurationList", "key", "value");
         List list = config1.getList("key3");
         assertEquals(3,list.size());
     }    
     
     public void testGetKeys()
     {
-        DatabaseConfiguration config1 = new DatabaseConfiguration(datasource, 
"configurationList", "key", "value");
+        Configuration config1 = new DatabaseConfiguration(datasource, 
"configurationList", "key", "value");
         Iterator i = config1.getKeys();
         assertTrue(i.hasNext());
         Object key = i.next();
         assertEquals("key3",key.toString());
         assertFalse(i.hasNext());
-    }     
+    }
+
+    public void testClearSubset()
+    {
+        Configuration config = new DatabaseConfiguration(datasource, 
"configuration", "key", "value");
+
+        Configuration subset = config.subset("key1");
+        subset.clear();
+
+        assertTrue("the subset is not empty", subset.isEmpty());
+        assertFalse("the parent configuration is empty", config.isEmpty());
+    }
 
 }

Modified: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubsetConfiguration.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubsetConfiguration.java?view=diff&r1=156638&r2=156639
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubsetConfiguration.java
 (original)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubsetConfiguration.java
 Wed Mar  9 04:50:07 2005
@@ -211,4 +211,17 @@
         }
         assertTrue(keys.isEmpty());
     }
+
+    public void testClear()
+    {
+        Configuration config = new BaseConfiguration();
+        config.setProperty("test.key1", "value1");
+        config.setProperty("testing.key2", "value1");
+
+        Configuration subset = config.subset("test");
+        subset.clear();
+
+        assertTrue("the subset is not empty", subset.isEmpty());
+        assertFalse("the parent configuration is empty", config.isEmpty());
+    }
 }

Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?view=diff&r1=156638&r2=156639
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Wed Mar  9 
04:50:07 2005
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!--
-   Copyright 2004 The Apache Software Foundation
+   Copyright 2004-2005 The Apache Software Foundation
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -22,7 +22,14 @@
 
   <body>
 
-    <release version="1.1-rc2" date="in CVS">
+    <release version="1.1" date="in CVS">
+      <action dev="ebourg" type="update" issue="33925">
+        Fixed a ConcurrentModificationException thrown when calling clear()
+        on a SubsetConfiguration applied to a BaseConfiguration.
+      </action>
+    </release>
+
+    <release version="1.1-rc2" date="2005-03-06">
       <action dev="oheger" type="update" issue="33814">
         Updated documentation for FileConfiguration's load() methods. Fixed a
         problem in XMLConfiguration with the output of the save() method when
@@ -42,7 +49,7 @@
       </action>
     </release>
 
-    <release version="1.1-rc1" date="2004-02-13">
+    <release version="1.1-rc1" date="2005-02-13">
       <action dev="oheger" type="add" issue="33475">
         ConfigurationFactory now always configures digester to use the context
         classloader. This avoids problems in application server environments,
@@ -183,9 +190,6 @@
         AppletConfiguration, ServletConfiguration, ServletContextConfiguration,
         ServletRequestConfiguration, ServletFilterConfiguration.
       </action>
-    </release>
-
-    <release version="1.0.1-dev" date="in CVS">
     </release>
 
     <release version="1.0" date="2004-10-11">



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to