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


Reply via email to