Author: oheger
Date: Tue Jun 12 13:04:45 2007
New Revision: 546620
URL: http://svn.apache.org/viewvc?view=rev&rev=546620
Log:
CONFIGURATION-277: AbstractConfiguration.clear() now catches potential
UnsupportedOperationExceptions during the iteration over the existing properties
Added:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java
(with props)
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractConfiguration.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/viewvc/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractConfiguration.java?view=diff&rev=546620&r1=546619&r2=546620
==============================================================================
---
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
Tue Jun 12 13:04:45 2007
@@ -504,17 +504,34 @@
{
fireEvent(EVENT_CLEAR, null, null, true);
setDetailEvents(false);
+ boolean useIterator = true;
try
{
Iterator it = getKeys();
while (it.hasNext())
{
String key = (String) it.next();
- it.remove();
+ if (useIterator)
+ {
+ try
+ {
+ it.remove();
+ }
+ catch (UnsupportedOperationException usoex)
+ {
+ useIterator = false;
+ }
+ }
+
+ if (useIterator && containsKey(key))
+ {
+ useIterator = false;
+ }
- if (containsKey(key))
+ if (!useIterator)
{
- // workaround for Iterators that do not remove the
property on calling remove()
+ // workaround for Iterators that do not remove the property
+ // on calling remove() or do not support remove() at all
clearProperty(key);
}
}
Added:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java?view=auto&rev=546620
==============================================================================
---
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java
(added)
+++
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java
Tue Jun 12 13:04:45 2007
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.configuration;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.commons.collections.CollectionUtils;
+
+import junit.framework.TestCase;
+
+/**
+ * A test class for some of the basic functionality implemented by
+ * AbstractConfiguration.
+ *
+ * @version $Id$
+ */
+public class TestAbstractConfigurationBasicFeatures extends TestCase
+{
+ /**
+ * Tests the clear() implementation of AbstractConfiguration if the
iterator
+ * returned by getKeys() does not support the remove() operation.
+ */
+ public void testClearIteratorNoRemove()
+ {
+ AbstractConfiguration config = new TestConfigurationImpl(
+ new BaseConfiguration())
+ {
+ // return an iterator that does not support remove operations
+ public Iterator getKeys()
+ {
+ Collection keyCol = new ArrayList();
+ CollectionUtils.addAll(keyCol, getUnderlyingConfiguration()
+ .getKeys());
+ Object[] keys = keyCol.toArray();
+ return Arrays.asList(keys).iterator();
+ }
+ };
+ for (int i = 0; i < 20; i++)
+ {
+ config.addProperty("key" + i, "value" + i);
+ }
+ config.clear();
+ assertTrue("Configuration not empty", config.isEmpty());
+ }
+
+ /**
+ * A test configuration implementation. This implementation inherits
+ * directly from AbstractConfiguration. For implementing the required
+ * functionality another implementation of AbstractConfiguration is used;
+ * all methods that need to be implemented delegate to this wrapped
+ * configuration.
+ */
+ static class TestConfigurationImpl extends AbstractConfiguration
+ {
+ /** Stores the underlying configuration. */
+ private AbstractConfiguration config;
+
+ public AbstractConfiguration getUnderlyingConfiguration()
+ {
+ return config;
+ }
+
+ public TestConfigurationImpl(AbstractConfiguration wrappedConfig)
+ {
+ config = wrappedConfig;
+ }
+
+ protected void addPropertyDirect(String key, Object value)
+ {
+ config.addPropertyDirect(key, value);
+ }
+
+ public boolean containsKey(String key)
+ {
+ return config.containsKey(key);
+ }
+
+ public Iterator getKeys()
+ {
+ return config.getKeys();
+ }
+
+ public Object getProperty(String key)
+ {
+ return config.getProperty(key);
+ }
+
+ public boolean isEmpty()
+ {
+ return config.isEmpty();
+ }
+
+ protected void clearPropertyDirect(String key)
+ {
+ config.clearPropertyDirect(key);
+ }
+ }
+}
Propchange:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestAbstractConfigurationBasicFeatures.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?view=diff&rev=546620&r1=546619&r2=546620
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Tue Jun 12
13:04:45 2007
@@ -23,6 +23,11 @@
<body>
<release version="1.5-SNAPSHOT" date="in SVN" description="">
+ <action dev="oheger" type="add" issue="CONFIGURATION-277">
+ The base implementation of clear() in AbstractConfiguration now checks
+ for a potential UnsupportedOperationException when iterating over the
+ existing properties.
+ </action>
<action dev="oheger" type="fix" issue="CONFIGURATION-280"
due-to="Roman Kurmanowytsch">
Using file-based configurations in auto-save mode together with a
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]