Author: oheger
Date: Sun Mar 9 21:03:34 2014
New Revision: 1575766
URL: http://svn.apache.org/r1575766
Log:
InMemoryNodeModel now supports clearTree() on a tracked node.
The implementation is analogous to clearProperty().
Modified:
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/InMemoryNodeModel.java
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModelTrackedNodes.java
Modified:
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/InMemoryNodeModel.java
URL:
http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/InMemoryNodeModel.java?rev=1575766&r1=1575765&r2=1575766&view=diff
==============================================================================
---
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/InMemoryNodeModel.java
(original)
+++
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/InMemoryNodeModel.java
Sun Mar 9 21:03:34 2014
@@ -195,7 +195,24 @@ public class InMemoryNodeModel implement
* after subtrees have been removed. If this is the case, such nodes are
* removed, too.
*/
- public void clearTree(final String key,
+ public void clearTree(String key, NodeKeyResolver<ImmutableNode> resolver)
+ {
+ clearTree(key, null, resolver);
+ }
+
+ /**
+ * Clears a whole sub tree using a tracked node as root node. This method
+ * works like the normal {@code clearTree()} method, but the origin of the
+ * operation (also for the interpretation of the passed in key) is a
tracked
+ * node identified by the passed in {@code NodeSelector}. The selector can
+ * be <b>null</b>, then the root node is assumed.
+ *
+ * @param key the key
+ * @param selector the {@code NodeSelector} defining the root node (or
+ * <b>null</b>)
+ * @param resolver the {@code NodeKeyResolver}
+ */
+ public void clearTree(final String key, NodeSelector selector,
final NodeKeyResolver<ImmutableNode> resolver)
{
updateModel(new TransactionInitializer()
@@ -203,9 +220,8 @@ public class InMemoryNodeModel implement
public boolean initTransaction(ModelTransaction tx)
{
TreeData currentStructure = tx.getCurrentData();
- for (QueryResult<ImmutableNode> result : resolver
- .resolveKey(currentStructure.getRootNode(), key,
- tx.getCurrentData()))
+ for (QueryResult<ImmutableNode> result : resolver.resolveKey(
+ tx.getQueryRoot(), key, currentStructure))
{
if (result.isAttributeResult())
{
@@ -227,7 +243,7 @@ public class InMemoryNodeModel implement
}
return true;
}
- }, null, resolver);
+ }, selector, resolver);
}
/**
Modified:
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModelTrackedNodes.java
URL:
http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModelTrackedNodes.java?rev=1575766&r1=1575765&r2=1575766&view=diff
==============================================================================
---
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModelTrackedNodes.java
(original)
+++
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModelTrackedNodes.java
Sun Mar 9 21:03:34 2014
@@ -23,6 +23,9 @@ import static org.junit.Assert.assertSam
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import java.util.HashSet;
+import java.util.Set;
+
import org.apache.commons.configuration.ex.ConfigurationRuntimeException;
import org.easymock.EasyMock;
import org.junit.Before;
@@ -290,6 +293,34 @@ public class TestInMemoryNodeModelTracke
}
/**
+ * Helper method for checking whether the expected field node was removed.
+ *
+ * @param nodeFields the fields node
+ * @param idx the index of the removed field
+ */
+ private static void checkForRemovedField(ImmutableNode nodeFields, int idx)
+ {
+ assertEquals("Field not removed",
+ NodeStructureHelper.fieldsLength(1) - 1, nodeFields
+ .getChildren().size());
+ Set<String> expectedNames = new HashSet<String>();
+ Set<String> actualNames = new HashSet<String>();
+ for (int i = 0; i < NodeStructureHelper.fieldsLength(1); i++)
+ {
+ if (idx != i)
+ {
+ expectedNames.add(NodeStructureHelper.field(1, i));
+ }
+ }
+ for (ImmutableNode field : nodeFields.getChildren())
+ {
+ ImmutableNode nodeName = field.getChildren().get(0);
+ actualNames.add(String.valueOf(nodeName.getValue()));
+ }
+ assertEquals("Wrong field names", expectedNames, actualNames);
+ }
+
+ /**
* Tests whether clearProperty() can operate on a tracked node.
*/
@Test
@@ -300,17 +331,11 @@ public class TestInMemoryNodeModelTracke
model.clearProperty("fields.field(0).name", selector, resolver);
ImmutableNode nodeFields =
NodeStructureHelper.nodeForKey(model,
"tables/table(1)/fields");
- assertEquals("Field not removed",
- NodeStructureHelper.fieldsLength(1) - 1, nodeFields
- .getChildren().size());
- ImmutableNode nodeName =
- NodeStructureHelper.nodeForKey(nodeFields, "field(0)/name");
- assertEquals("Wrong node value cleared",
- NodeStructureHelper.field(1, 1), nodeName.getValue());
+ checkForRemovedField(nodeFields, 0);
}
/**
- * Tests a clearProperty() on a tracked node which is detached.
+ * Tests a clearProperty() operation on a tracked node which is detached.
*/
@Test
public void testClearPropertyOnDetachedNode()
@@ -323,12 +348,37 @@ public class TestInMemoryNodeModelTracke
ImmutableNode nodeFields =
NodeStructureHelper.nodeForKey(model.getTrackedNode(selector),
"fields");
- assertEquals("Field not removed",
- NodeStructureHelper.fieldsLength(1) - 1, nodeFields
- .getChildren().size());
- ImmutableNode nodeName =
- NodeStructureHelper.nodeForKey(nodeFields, "field(0)/name");
- assertEquals("Wrong node value cleared",
- NodeStructureHelper.field(1, 1), nodeName.getValue());
+ checkForRemovedField(nodeFields, 0);
+ }
+
+ /**
+ * Tests whether clearTree() can operate on a tracked node.
+ */
+ @Test
+ public void testClearTreeOnTrackedNode()
+ {
+ NodeKeyResolver<ImmutableNode> resolver = createResolver();
+ model.trackNode(selector, resolver);
+ model.clearTree("fields.field(1)", selector, resolver);
+ ImmutableNode nodeFields =
+ NodeStructureHelper.nodeForKey(model,
"tables/table(1)/fields");
+ checkForRemovedField(nodeFields, 1);
+ }
+
+ /**
+ * Tests a clearTree() operation on a tracked node which is detached.
+ */
+ @Test
+ public void testClearTreeOnDetachedNode()
+ {
+ NodeKeyResolver<ImmutableNode> resolver = createResolver();
+ initDetachedNode(resolver);
+ ImmutableNode rootNode = model.getRootNode();
+ model.clearTree("fields.field(1)", selector, resolver);
+ assertSame("Model root was changed", rootNode, model.getRootNode());
+ ImmutableNode nodeFields =
+ NodeStructureHelper.nodeForKey(model.getTrackedNode(selector),
+ "fields");
+ checkForRemovedField(nodeFields, 1);
}
}