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