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 2014/07/31 22:06:25 UTC

svn commit: r1614982 - /commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractHierarchicalConfiguration.java

Author: oheger
Date: Thu Jul 31 20:06:24 2014
New Revision: 1614982

URL: http://svn.apache.org/r1614982
Log:
Removed calls to getRootNode() in AbstractHierarchicalConfiguration.

Using this method in this way can lead to subtile race conditions. A node model
may replace its root node at any time. Therefore, it should only be accessed
via the model's node handler. This is always in sync with the root node and
allows thread-safe access.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractHierarchicalConfiguration.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractHierarchicalConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractHierarchicalConfiguration.java?rev=1614982&r1=1614981&r2=1614982&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractHierarchicalConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/AbstractHierarchicalConfiguration.java Thu Jul 31 20:06:24 2014
@@ -217,7 +217,8 @@ public abstract class AbstractHierarchic
      */
     protected String getRootElementNameInternal()
     {
-        return getModel().getNodeHandler().nodeName(getRootNode());
+        NodeHandler<T> nodeHandler = getModel().getNodeHandler();
+        return nodeHandler.nodeName(nodeHandler.getRootNode());
     }
 
     /**
@@ -406,7 +407,7 @@ public abstract class AbstractHierarchic
     @Override
     protected boolean isEmptyInternal()
     {
-        return !nodeDefined(getRootNode());
+        return !nodeDefined(getModel().getNodeHandler().getRootNode());
     }
 
     /**
@@ -620,8 +621,9 @@ public abstract class AbstractHierarchic
     protected Iterator<String> getKeysInternal()
     {
         DefinedKeysVisitor visitor = new DefinedKeysVisitor();
-        NodeTreeWalker.INSTANCE.walkDFS(getRootNode(), visitor,
-                getModel().getNodeHandler());
+        NodeHandler<T> nodeHandler = getModel().getNodeHandler();
+        NodeTreeWalker.INSTANCE.walkDFS(nodeHandler.getRootNode(), visitor,
+                nodeHandler);
 
         return visitor.getKeyList().iterator();
     }
@@ -754,7 +756,8 @@ public abstract class AbstractHierarchic
      */
     protected List<QueryResult<T>> fetchNodeList(String key)
     {
-        return resolveKey(getRootNode(), key, getModel().getNodeHandler());
+        NodeHandler<T> nodeHandler = getModel().getNodeHandler();
+        return resolveKey(nodeHandler.getRootNode(), key, nodeHandler);
     }
 
     /**