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()); + } }