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/05/05 22:12:05 UTC

svn commit: r1479367 - in /commons/proper/configuration/trunk/src: main/java/org/apache/commons/configuration/ test/java/org/apache/commons/configuration/

Author: oheger
Date: Sun May  5 20:12:03 2013
New Revision: 1479367

URL: http://svn.apache.org/r1479367
Log:
Made method clear() final in AbstractConfiguration.

There is now a new protected clearDirect() method which performs the actual
work. This is done to prevent subclasses from breaking basic functionality
like event handling or synchronization.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseHierarchicalConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CombinedConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CompositeConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DataConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DatabaseConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/EnvironmentConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLConfiguration.java
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestAbstractConfigurationSynchronization.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractConfiguration.java Sun May  5 20:12:03 2013
@@ -74,7 +74,18 @@ import org.apache.commons.logging.impl.N
  * <li>Basic event support. Whenever this configuration is modified registered
  * event listeners are notified. Refer to the various {@code EVENT_XXX}
  * constants to get an impression about which event types are supported.</li>
+ * <li>Support for proper synchronization based on the {@link Synchronizer}
+ * interface.</li>
  * </ul></p>
+ * <p>
+ * Most methods defined by the {@code Configuration} interface are already
+ * implemented in this class. Many method implementations perform basic
+ * book-keeping tasks (e.g. firing events, handling synchronization), and then
+ * delegate to other (protected) methods executing the actual work. Subclasses
+ * override these protected methods to define or adapt behavior. The public
+ * entry point methods are final to prevent subclasses from breaking basic
+ * functionality.
+ * </p>
  *
  * @author <a href="mailto:ksh@scand.com">Konstantin Shaposhnikov </a>
  * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen </a>
@@ -728,55 +739,67 @@ public abstract class AbstractConfigurat
      */
     protected abstract void clearPropertyDirect(String key);
 
-    public void clear()
+    public final void clear()
     {
         getSynchronizer().beginWrite();
         try
         {
             fireEvent(EVENT_CLEAR, null, null, true);
-            setDetailEvents(false);
-            boolean useIterator = true;
-            try
+            clearInternal();
+            fireEvent(EVENT_CLEAR, null, null, false);
+        }
+        finally
+        {
+            getSynchronizer().endWrite();
+        }
+    }
+
+    /**
+     * Clears the whole configuration. This method is called by {@code clear()}
+     * after some preparations have been made. This base implementation uses
+     * the iterator provided by {@code getKeys()} to remove every single
+     * property. Subclasses should override this method if there is a more
+     * efficient way of clearing the configuration.
+     */
+    protected void clearInternal()
+    {
+        setDetailEvents(false);
+        boolean useIterator = true;
+        try
+        {
+            Iterator<String> it = getKeys();
+            while (it.hasNext())
             {
-                Iterator<String> it = getKeys();
-                while (it.hasNext())
+                String key = it.next();
+                if (useIterator)
                 {
-                    String key = it.next();
-                    if (useIterator)
+                    try
                     {
-                        try
-                        {
-                            it.remove();
-                        }
-                        catch (UnsupportedOperationException usoex)
-                        {
-                            useIterator = false;
-                        }
+                        it.remove();
                     }
-
-                    if (useIterator && containsKey(key))
+                    catch (UnsupportedOperationException usoex)
                     {
                         useIterator = false;
                     }
+                }
 
-                    if (!useIterator)
-                    {
-                        // workaround for Iterators that do not remove the
-                        // property
-                        // on calling remove() or do not support remove() at all
-                        clearProperty(key);
-                    }
+                if (useIterator && containsKey(key))
+                {
+                    useIterator = false;
+                }
+
+                if (!useIterator)
+                {
+                    // workaround for Iterators that do not remove the
+                    // property
+                    // on calling remove() or do not support remove() at all
+                    clearProperty(key);
                 }
             }
-            finally
-            {
-                setDetailEvents(true);
-            }
-            fireEvent(EVENT_CLEAR, null, null, false);
         }
         finally
         {
-            getSynchronizer().endWrite();
+            setDetailEvents(true);
         }
     }
 

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/BaseConfiguration.java Sun May  5 20:12:03 2013
@@ -138,11 +138,9 @@ public class BaseConfiguration extends A
     }
 
     @Override
-    public void clear()
+    protected void clearInternal()
     {
-        fireEvent(EVENT_CLEAR, null, null, true);
         store.clear();
-        fireEvent(EVENT_CLEAR, null, null, false);
     }
 
     /**

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=1479367&r1=1479366&r2=1479367&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 Sun May  5 20:12:03 2013
@@ -806,13 +806,11 @@ public class BaseHierarchicalConfigurati
      * the root node.
      */
     @Override
-    public void clear()
+    protected void clearInternal()
     {
-        fireEvent(EVENT_CLEAR, null, null, true);
         getRootNode().removeAttributes();
         getRootNode().removeChildren();
         getRootNode().setValue(null);
-        fireEvent(EVENT_CLEAR, null, null, false);
     }
 
     /**

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=1479367&r1=1479366&r2=1479367&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 May  5 20:12:03 2013
@@ -631,12 +631,10 @@ public class CombinedConfiguration exten
      * Clears this configuration. All contained configurations will be removed.
      */
     @Override
-    public void clear()
+    protected void clearInternal()
     {
-        fireEvent(EVENT_CLEAR, null, null, true);
         configurations = new ArrayList<ConfigData>();
         namedConfigurations = new HashMap<String, Configuration>();
-        fireEvent(EVENT_CLEAR, null, null, false);
         invalidate();
     }
 

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CompositeConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CompositeConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CompositeConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/CompositeConfiguration.java Sun May  5 20:12:03 2013
@@ -222,7 +222,7 @@ implements Cloneable
      * configuration is created; the old one is lost.
      */
     @Override
-    public void clear()
+    protected void clearInternal()
     {
         configList.clear();
         // recreate the in memory configuration

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DataConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DataConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DataConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DataConfiguration.java Sun May  5 20:12:03 2013
@@ -141,12 +141,6 @@ public class DataConfiguration extends A
         }
     }
 
-    @Override
-    public void addProperty(String key, Object value)
-    {
-        getConfiguration().addProperty(key, value);
-    }
-
     public boolean isEmpty()
     {
         return configuration.isEmpty();

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DatabaseConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DatabaseConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DatabaseConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DatabaseConfiguration.java Sun May  5 20:12:03 2013
@@ -519,9 +519,8 @@ public class DatabaseConfiguration exten
      * will be undefined.
      */
     @Override
-    public void clear()
+    protected void clearInternal()
     {
-        fireEvent(EVENT_CLEAR, null, null, true);
         new JdbcOperation<Void>(EVENT_CLEAR, null, null)
         {
             @Override
@@ -532,7 +531,6 @@ public class DatabaseConfiguration exten
                 return null;
             }
         }.execute();
-        fireEvent(EVENT_CLEAR, null, null, false);
     }
 
     /**

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java Sun May  5 20:12:03 2013
@@ -336,7 +336,7 @@ public class DynamicCombinedConfiguratio
     }
 
     @Override
-    public void clear()
+    protected void clearInternal()
     {
         if (configs != null)
         {

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/EnvironmentConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/EnvironmentConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/EnvironmentConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/EnvironmentConfiguration.java Sun May  5 20:12:03 2013
@@ -84,7 +84,7 @@ public class EnvironmentConfiguration ex
      * an exception.
      */
     @Override
-    public void clear()
+    protected void clearInternal()
     {
         throw new UnsupportedOperationException("EnvironmentConfiguration is read-only!");
     }

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java Sun May  5 20:12:03 2013
@@ -89,7 +89,7 @@ public class PatternSubtreeConfiguration
     }
 
     @Override
-    public void clear()
+    protected void clearInternal()
     {
         getConfig().clear();
     }

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLConfiguration.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLConfiguration.java Sun May  5 20:12:03 2013
@@ -468,9 +468,9 @@ public class XMLConfiguration extends Ba
      * was loaded from a file, the associated DOM document is also cleared.
      */
     @Override
-    public void clear()
+    protected void clearInternal()
     {
-        super.clear();
+        super.clearInternal();
         getRootNode().setReference(null);
         document = null;
     }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestAbstractConfigurationSynchronization.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestAbstractConfigurationSynchronization.java?rev=1479367&r1=1479366&r2=1479367&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestAbstractConfigurationSynchronization.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestAbstractConfigurationSynchronization.java Sun May  5 20:12:03 2013
@@ -101,8 +101,6 @@ public class TestAbstractConfigurationSy
      * Tests the correct synchronization of clear().
      */
     @Test
-    @Ignore
-    // TODO prevent subclasses from overriding clear()
     public void testClearSynchronized()
     {
         config.clear();