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 2017/08/31 17:51:39 UTC

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

Author: oheger
Date: Thu Aug 31 17:51:39 2017
New Revision: 1806832

URL: http://svn.apache.org/viewvc?rev=1806832&view=rev
Log:
[CONFIGURATION-670] Reworked SubnodeConfiguration.getNodeModel().

The new implementation returns a model object with the correct root node
set. A new method, getRootNodeModel(), has been added that simulates the
original behavior; it always returns the model of the top-level
hierarchical configuration.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/SubnodeConfiguration.java
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestBaseHierarchicalConfigurationSynchronization.java
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/SubnodeConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/SubnodeConfiguration.java?rev=1806832&r1=1806831&r2=1806832&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/SubnodeConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/SubnodeConfiguration.java Thu Aug 31 17:51:39 2017
@@ -18,6 +18,7 @@ package org.apache.commons.configuration
 
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.commons.configuration2.tree.InMemoryNodeModel;
+import org.apache.commons.configuration2.tree.InMemoryNodeModelSupport;
 import org.apache.commons.configuration2.tree.NodeModel;
 import org.apache.commons.configuration2.tree.NodeSelector;
 import org.apache.commons.configuration2.tree.TrackedNodeModel;
@@ -174,14 +175,42 @@ public class SubnodeConfiguration extend
     }
 
     /**
-     * {@inheritDoc} This implementation returns the node model of the parent
-     * configuration. This is necessary because this sub configuration does not
-     * have an {@code InMemoryNodeModel} object.
+     * {@inheritDoc} This implementation returns a newly created node model
+     * with the correct root node set. Note that this model is not used for
+     * property access, but only made available to clients that need to
+     * operate on the node structure of this {@code SubnodeConfiguration}.
+     * Be aware that the implementation of this method is not very efficient.
      */
     @Override
     public InMemoryNodeModel getNodeModel()
     {
-        return getParent().getNodeModel();
+        ImmutableNode root =
+                getParent().getNodeModel().getTrackedNode(getRootSelector());
+        return new InMemoryNodeModel(root);
+    }
+
+    /**
+     * Returns the node model of the root configuration.
+     * {@code SubnodeConfiguration} instances created from a hierarchical
+     * configuration operate on the same node model, using different nodes as
+     * their local root nodes. With this method the top-level node model can be
+     * obtained. It works even in constellations where a
+     * {@code SubnodeConfiguration} has been created from another
+     * {@code SubnodeConfiguration}.
+     *
+     * @return the root node model
+     * @since 2.2
+     */
+    public InMemoryNodeModel getRootNodeModel()
+    {
+        if (getParent() instanceof SubnodeConfiguration)
+        {
+            return ((SubnodeConfiguration) getParent()).getRootNodeModel();
+        }
+        else
+        {
+            return getParent().getNodeModel();
+        }
     }
 
     /**
@@ -221,6 +250,17 @@ public class SubnodeConfiguration extend
     }
 
     /**
+     * {@inheritDoc} This implementation makes sure that the correct node model
+     * (the one of the parent) is used for the new sub configuration.
+     */
+    @Override
+    protected SubnodeConfiguration createSubConfigurationForTrackedNode(
+            NodeSelector selector, InMemoryNodeModelSupport parentModelSupport)
+    {
+        return super.createSubConfigurationForTrackedNode(selector, getParent());
+    }
+
+    /**
      * Convenience method that returns the tracked model used by this sub
      * configuration.
      *

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestBaseHierarchicalConfigurationSynchronization.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestBaseHierarchicalConfigurationSynchronization.java?rev=1806832&r1=1806831&r2=1806832&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestBaseHierarchicalConfigurationSynchronization.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestBaseHierarchicalConfigurationSynchronization.java Thu Aug 31 17:51:39 2017
@@ -185,8 +185,8 @@ public class TestBaseHierarchicalConfigu
     private static boolean isDetached(HierarchicalConfiguration<ImmutableNode> c)
     {
         assertTrue("Not a sub configuration", c instanceof SubnodeConfiguration);
-        return ((InMemoryNodeModel) c.getNodeModel())
-                .isTrackedNodeDetached(((SubnodeConfiguration) c)
+        InMemoryNodeModel nodeModel = ((SubnodeConfiguration) c).getRootNodeModel();
+        return nodeModel.isTrackedNodeDetached(((SubnodeConfiguration) c)
                         .getRootSelector());
     }
 

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java?rev=1806832&r1=1806831&r2=1806832&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java Thu Aug 31 17:51:39 2017
@@ -519,4 +519,18 @@ public class TestSubnodeConfiguration
         config.close();
         EasyMock.verify(model);
     }
+
+    /**
+     * Tests whether a correct node model is returned for the sub
+     * configuration. This test is related to CONFIGURATION-670.
+     */
+    @Test
+    public void testGetNodeModel()
+    {
+        setUpSubnodeConfig();
+        InMemoryNodeModel nodeModel = config.getNodeModel();
+
+        assertEquals("Wrong root node", "table",
+                nodeModel.getNodeHandler().getRootNode().getNodeName());
+    }
 }