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:55:59 UTC

svn commit: r1488573 - /commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/

Author: oheger
Date: Sat Jun  1 19:55:58 2013
New Revision: 1488573

URL: http://svn.apache.org/r1488573
Log:
Added an optimize flag to the beginRead() and beginWrite() methods.

This allows derived classes that override these methods to perform special
optimization. This is needed for instance for CombinedConfiguration; this
class has methods which need synchronized access, but do not require the
full combined configuration to be constructed. The alternative would be
to call the Synchronizer directly, but this is a source of trouble as it
circumvents the standard mechanisms for obtaining and releasing locks.

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/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/DynamicCombinedConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/INIConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PropertiesConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/SubnodeConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLConfiguration.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=1488573&r1=1488572&r2=1488573&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 Sat Jun  1 19:55:58 2013
@@ -618,10 +618,10 @@ public abstract class AbstractConfigurat
         switch (mode)
         {
         case READ:
-            beginRead();
+            beginRead(false);
             break;
         case WRITE:
-            beginWrite();
+            beginWrite(false);
             break;
         default:
             throw new IllegalArgumentException("Unsupported LockMode: " + mode);
@@ -655,13 +655,22 @@ public abstract class AbstractConfigurat
      * Notifies this configuration's {@link Synchronizer} that a read operation
      * is about to start. This method is called by all methods which access this
      * configuration in a read-only mode. Subclasses may override it to perform
-     * additional actions before this read operation. <strong>In any case the
+     * additional actions before this read operation. The boolean
+     * <em>optimize</em> argument can be evaluated by overridden methods in
+     * derived classes. Some operations which require a lock do not need a fully
+     * initialized configuration object. By setting this flag to
+     * <strong>true</strong>, such operations can give a corresponding hint. An
+     * overridden implementation of {@code beginRead()} can then decide to skip
+     * some initialization steps. All basic operations in this class (and most
+     * of the basic {@code Configuration} implementations) call this method with
+     * a parameter value of <strong>false</strong>. <strong>In any case the
      * inherited method must be called! Otherwise, proper synchronization is not
      * guaranteed.</strong>
      *
+     * @param optimize a flag whether optimization can be performed
      * @since 2.0
      */
-    protected void beginRead()
+    protected void beginRead(boolean optimize)
     {
         getSynchronizer().beginRead();
     }
@@ -685,13 +694,16 @@ public abstract class AbstractConfigurat
      * Notifies this configuration's {@link Synchronizer} that an update
      * operation is about to start. This method is called by all methods which
      * modify this configuration. Subclasses may override it to perform
-     * additional operations before an update. <strong>In any case the inherited
-     * method must be called! Otherwise, proper synchronization is not
-     * guaranteed.</strong>
+     * additional operations before an update. For a description of the boolean
+     * <em>optimize</em> argument refer to the documentation of
+     * {@code beginRead()}. <strong>In any case the inherited method must be
+     * called! Otherwise, proper synchronization is not guaranteed.</strong>
      *
+     * @param optimize a flag whether optimization can be performed
+     * @see #beginRead(boolean)
      * @since 2.0
      */
-    protected void beginWrite()
+    protected void beginWrite(boolean optimize)
     {
         getSynchronizer().beginWrite();
     }
@@ -713,7 +725,7 @@ public abstract class AbstractConfigurat
 
     public final void addProperty(String key, Object value)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             fireEvent(EVENT_ADD_PROPERTY, key, value, true);
@@ -811,7 +823,7 @@ public abstract class AbstractConfigurat
 
     public final void setProperty(String key, Object value)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             fireEvent(EVENT_SET_PROPERTY, key, value, true);
@@ -858,7 +870,7 @@ public abstract class AbstractConfigurat
      */
     public final void clearProperty(String key)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             fireEvent(EVENT_CLEAR_PROPERTY, key, null, true);
@@ -882,7 +894,7 @@ public abstract class AbstractConfigurat
 
     public final void clear()
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             fireEvent(EVENT_CLEAR, null, null, true);
@@ -952,7 +964,7 @@ public abstract class AbstractConfigurat
      */
     public final Iterator<String> getKeys()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return getKeysInternal();
@@ -972,7 +984,7 @@ public abstract class AbstractConfigurat
      */
     public final Iterator<String> getKeys(String prefix)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return getKeysInternal(prefix);
@@ -1017,7 +1029,7 @@ public abstract class AbstractConfigurat
      */
     public final Object getProperty(String key)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return getPropertyInternal(key);
@@ -1045,7 +1057,7 @@ public abstract class AbstractConfigurat
      */
     public final boolean isEmpty()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return isEmptyInternal();
@@ -1072,7 +1084,7 @@ public abstract class AbstractConfigurat
      */
     public final boolean containsKey(String key)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return containsKeyInternal(key);

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=1488573&r1=1488572&r2=1488573&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:55:58 2013
@@ -257,7 +257,7 @@ public class BaseHierarchicalConfigurati
             throw new IllegalArgumentException("Root node must not be null!");
         }
 
-        beginWrite();
+        beginWrite(false);
         try
         {
             setRootNodeInternal(rootNode);
@@ -287,7 +287,7 @@ public class BaseHierarchicalConfigurati
      */
     public final String getRootElementName()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return getRootElementNameInternal();
@@ -456,7 +456,7 @@ public class BaseHierarchicalConfigurati
             return;
         }
 
-        beginWrite();
+        beginWrite(false);
         try
         {
             fireEvent(EVENT_ADD_NODES, key, nodes, true);
@@ -550,7 +550,7 @@ public class BaseHierarchicalConfigurati
     @Override
     public Configuration subset(String prefix)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             Collection<ConfigurationNode> nodes = fetchNodeList(prefix);
@@ -666,7 +666,7 @@ public class BaseHierarchicalConfigurati
     public SubnodeConfiguration configurationAt(String key,
             boolean supportUpdates)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             List<ConfigurationNode> nodes = fetchNodeList(key);
@@ -752,7 +752,7 @@ public class BaseHierarchicalConfigurati
      */
     public List<SubnodeConfiguration> configurationsAt(String key)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             List<ConfigurationNode> nodes = fetchNodeList(key);
@@ -790,7 +790,7 @@ public class BaseHierarchicalConfigurati
      */
     public List<SubnodeConfiguration> childConfigurationsAt(String key)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             List<ConfigurationNode> nodes = fetchNodeList(key);
@@ -1062,7 +1062,7 @@ public class BaseHierarchicalConfigurati
      */
     public final void clearTree(String key)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             fireEvent(EVENT_CLEAR_TREE, key, null, true);
@@ -1180,7 +1180,7 @@ public class BaseHierarchicalConfigurati
      */
     public final int getMaxIndex(String key)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return getMaxIndexInternal(key);
@@ -1216,7 +1216,7 @@ public class BaseHierarchicalConfigurati
     @Override
     public Object clone()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             BaseHierarchicalConfiguration copy = (BaseHierarchicalConfiguration) super

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=1488573&r1=1488572&r2=1488573&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 Sat Jun  1 19:55:58 2013
@@ -679,7 +679,7 @@ public class CombinedConfiguration exten
     @Override
     public Object clone()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             CombinedConfiguration copy = (CombinedConfiguration) super.clone();
@@ -729,7 +729,7 @@ public class CombinedConfiguration exten
             throw new IllegalArgumentException("Key must not be null!");
         }
 
-        beginRead();
+        beginRead(false);
         try
         {
             List<ConfigurationNode> nodes = fetchNodeList(key);
@@ -763,7 +763,7 @@ public class CombinedConfiguration exten
      * is available. If not, it is constructed by requesting a write lock.
      */
     @Override
-    protected void beginRead()
+    protected void beginRead(boolean optimize)
     {
         boolean lockObtained = false;
         do
@@ -777,7 +777,7 @@ public class CombinedConfiguration exten
             {
                 // release read lock and try to obtain a write lock
                 endRead();
-                beginWrite(); // this constructs the root node
+                beginWrite(false); // this constructs the root node
                 endWrite();
             }
         } while (!lockObtained);
@@ -788,7 +788,7 @@ public class CombinedConfiguration exten
      * is available. If not, it is constructed now.
      */
     @Override
-    protected void beginWrite()
+    protected void beginWrite(boolean optimize)
     {
         writeLock();
         try
@@ -940,7 +940,7 @@ public class CombinedConfiguration exten
      */
     private void readLock()
     {
-        super.beginRead();
+        super.beginRead(false);
     }
 
     /**
@@ -950,7 +950,7 @@ public class CombinedConfiguration exten
      */
     private void writeLock()
     {
-        super.beginWrite();
+        super.beginWrite(false);
     }
 
     /**

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=1488573&r1=1488572&r2=1488573&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 Sat Jun  1 19:55:58 2013
@@ -170,7 +170,7 @@ implements Cloneable
      */
     public void addConfiguration(Configuration config, boolean asInMemory)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             if (!configList.contains(config))
@@ -217,7 +217,7 @@ implements Cloneable
      */
     public void removeConfiguration(Configuration config)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             // Make sure that you can't remove the inMemoryConfiguration from
@@ -240,7 +240,7 @@ implements Cloneable
      */
     public int getNumberOfConfigurations()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return configList.size();
@@ -434,7 +434,7 @@ implements Cloneable
      */
     public Configuration getConfiguration(int index)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return configList.get(index);
@@ -453,7 +453,7 @@ implements Cloneable
      */
     public Configuration getInMemoryConfiguration()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return inMemoryConfiguration;

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=1488573&r1=1488572&r2=1488573&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 Sat Jun  1 19:55:58 2013
@@ -201,7 +201,7 @@ public class DynamicCombinedConfiguratio
     public void addConfiguration(Configuration config, String name,
             String at)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             ConfigData cd = new ConfigData(config, name, at);
@@ -225,7 +225,7 @@ public class DynamicCombinedConfiguratio
     @Override
     public int getNumberOfConfigurations()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return configurations.size();
@@ -247,7 +247,7 @@ public class DynamicCombinedConfiguratio
     @Override
     public Configuration getConfiguration(int index)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             ConfigData cd = configurations.get(index);
@@ -269,7 +269,7 @@ public class DynamicCombinedConfiguratio
     @Override
     public Configuration getConfiguration(String name)
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return namedConfigurations.get(name);
@@ -291,7 +291,7 @@ public class DynamicCombinedConfiguratio
     @Override
     public Set<String> getConfigurationNames()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return namedConfigurations.keySet();
@@ -329,7 +329,7 @@ public class DynamicCombinedConfiguratio
     @Override
     public boolean removeConfiguration(Configuration config)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             for (int index = 0; index < getNumberOfConfigurations(); index++)
@@ -358,7 +358,7 @@ public class DynamicCombinedConfiguratio
     @Override
     public Configuration removeConfigurationAt(int index)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             ConfigData cd = configurations.remove(index);
@@ -884,7 +884,7 @@ public class DynamicCombinedConfiguratio
         // The double-checked works here due to the Thread guarantees of ConcurrentMap.
         if (config == null)
         {
-            beginWrite();
+            beginWrite(false);
             try
             {
                 config = configs.get(key);

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/INIConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/INIConfiguration.java?rev=1488573&r1=1488572&r2=1488573&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/INIConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/INIConfiguration.java Sat Jun  1 19:55:58 2013
@@ -723,7 +723,7 @@ public class INIConfiguration extends Ba
         boolean globalSection = false;
         boolean inSection = false;
 
-        beginRead();
+        beginRead(false);
         try
         {
             for (ConfigurationNode node : getRootNode().getChildren())
@@ -795,7 +795,7 @@ public class INIConfiguration extends Ba
                 // the passed in key does not map to exactly one node
                 // obtain the node for the section, create it on demand
                 // (creation of a SubnodeConfiguration has to be synchronized)
-                beginWrite();
+                beginWrite(false);
                 try
                 {
                     return createAndInitializeSubnodeConfiguration(
@@ -841,7 +841,7 @@ public class INIConfiguration extends Ba
     {
         ViewNode parent = new ViewNode();
 
-        beginWrite();
+        beginWrite(false);
         try
         {
             for (ConfigurationNode node : getRootNode().getChildren())

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PropertiesConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PropertiesConfiguration.java?rev=1488573&r1=1488572&r2=1488573&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PropertiesConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PropertiesConfiguration.java Sat Jun  1 19:55:58 2013
@@ -308,7 +308,7 @@ public class PropertiesConfiguration ext
      */
     public String getHeader()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return getLayout().getHeaderComment();
@@ -327,7 +327,7 @@ public class PropertiesConfiguration ext
      */
     public void setHeader(String header)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             getLayout().setHeaderComment(header);
@@ -347,7 +347,7 @@ public class PropertiesConfiguration ext
      */
     public String getFooter()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return getLayout().getFooterComment();
@@ -367,7 +367,7 @@ public class PropertiesConfiguration ext
      */
     public void setFooter(String footer)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             getLayout().setFooterComment(footer);

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/SubnodeConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/SubnodeConfiguration.java?rev=1488573&r1=1488572&r2=1488573&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/SubnodeConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/SubnodeConfiguration.java Sat Jun  1 19:55:58 2013
@@ -192,7 +192,7 @@ public class SubnodeConfiguration extend
      */
     public String getSubnodeKey()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return subnodeKey;
@@ -213,7 +213,7 @@ public class SubnodeConfiguration extend
      */
     public void setSubnodeKey(String subnodeKey)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             this.subnodeKey = subnodeKey;
@@ -237,7 +237,7 @@ public class SubnodeConfiguration extend
      */
     public void clearAndDetachFromParent()
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             clearInternal();

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=1488573&r1=1488572&r2=1488573&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 Sat Jun  1 19:55:58 2013
@@ -338,7 +338,7 @@ public class XMLConfiguration extends Ba
      */
     public String getPublicID()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return publicID;
@@ -359,7 +359,7 @@ public class XMLConfiguration extends Ba
      */
     public void setPublicID(String publicID)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             this.publicID = publicID;
@@ -380,7 +380,7 @@ public class XMLConfiguration extends Ba
      */
     public String getSystemID()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return systemID;
@@ -401,7 +401,7 @@ public class XMLConfiguration extends Ba
      */
     public void setSystemID(String systemID)
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             this.systemID = systemID;
@@ -500,7 +500,7 @@ public class XMLConfiguration extends Ba
      */
     public Document getDocument()
     {
-        beginRead();
+        beginRead(false);
         try
         {
             return document;
@@ -984,7 +984,7 @@ public class XMLConfiguration extends Ba
      */
     public void validate() throws ConfigurationException
     {
-        beginWrite();
+        beginWrite(false);
         try
         {
             Transformer transformer = createTransformer();