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 2014/04/20 21:14:42 UTC

svn commit: r1588818 - in /commons/proper/configuration/branches/immutableNodes/src: main/java/org/apache/commons/configuration/tree/ test/java/org/apache/commons/configuration/tree/

Author: oheger
Date: Sun Apr 20 19:14:41 2014
New Revision: 1588818

URL: http://svn.apache.org/r1588818
Log:
NodeModel.clearTree() now returns information about removed elements.

This is necessary to correctly populate a CLEAR_TREE event for hierarchical
configurations. InMemoryNodeModel here returns a list with QueryResult objects
for the nodes or attributes selected by the key passed to clearTree().

Modified:
    commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/InMemoryNodeModel.java
    commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/NodeModel.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModel.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=1588818&r1=1588817&r2=1588818&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 Apr 20 19:14:41 2014
@@ -257,11 +257,13 @@ public class InMemoryNodeModel implement
     /**
      * {@inheritDoc} This implementation checks whether nodes become undefined
      * after subtrees have been removed. If this is the case, such nodes are
-     * removed, too.
+     * removed, too. Return value is a collection with {@code QueryResult}
+     * objects for the elements to be removed from the model.
      */
-    public void clearTree(String key, NodeKeyResolver<ImmutableNode> resolver)
+    public List<QueryResult<ImmutableNode>> clearTree(String key,
+            NodeKeyResolver<ImmutableNode> resolver)
     {
-        clearTree(key, null, resolver);
+        return clearTree(key, null, resolver);
     }
 
     /**
@@ -275,19 +277,25 @@ public class InMemoryNodeModel implement
      * @param selector the {@code NodeSelector} defining the root node (or
      *        <b>null</b>)
      * @param resolver the {@code NodeKeyResolver}
+     * @return a list with the results to be removed
      * @throws ConfigurationRuntimeException if the selector cannot be resolved
      */
-    public void clearTree(final String key, NodeSelector selector,
-            final NodeKeyResolver<ImmutableNode> resolver)
+    public List<QueryResult<ImmutableNode>> clearTree(final String key,
+            NodeSelector selector, final NodeKeyResolver<ImmutableNode> resolver)
     {
+        final List<QueryResult<ImmutableNode>> removedElements =
+                new LinkedList<QueryResult<ImmutableNode>>();
         updateModel(new TransactionInitializer()
         {
             public boolean initTransaction(ModelTransaction tx)
             {
                 boolean changes = false;
                 TreeData currentStructure = tx.getCurrentData();
-                for (QueryResult<ImmutableNode> result : resolver.resolveKey(
-                        tx.getQueryRoot(), key, currentStructure))
+                List<QueryResult<ImmutableNode>> results = resolver.resolveKey(
+                        tx.getQueryRoot(), key, currentStructure);
+                removedElements.clear();
+                removedElements.addAll(results);
+                for (QueryResult<ImmutableNode> result : results)
                 {
                     if (result.isAttributeResult())
                     {
@@ -311,6 +319,8 @@ public class InMemoryNodeModel implement
                 return changes;
             }
         }, selector, resolver);
+
+        return removedElements;
     }
 
     /**

Modified: commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/NodeModel.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/NodeModel.java?rev=1588818&r1=1588817&r2=1588818&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/NodeModel.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/NodeModel.java Sun Apr 20 19:14:41 2014
@@ -112,8 +112,9 @@ public interface NodeModel<T>
      *
      * @param key the key selecting the properties to be removed
      * @param resolver the {@code NodeKeyResolver}
+     * @return an object with information about the data removed
      */
-    void clearTree(String key, NodeKeyResolver<T> resolver);
+    Object clearTree(String key, NodeKeyResolver<T> resolver);
 
     /**
      * Clears the value of a property. This method is similar to

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModel.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModel.java?rev=1588818&r1=1588817&r2=1588818&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModel.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModel.java Sun Apr 20 19:14:41 2014
@@ -321,7 +321,7 @@ public class TestInMemoryNodeModel
                 Collections.singletonList(result));
         EasyMock.replay(resolver);
 
-        model.clearTree(KEY, resolver);
+        List<QueryResult<ImmutableNode>> removed = model.clearTree(KEY, resolver);
         ImmutableNode node = nodeForKey(model, "Homer/Ilias");
         assertEquals("Wrong number of children", 2, node.getChildren().size());
         for (ImmutableNode c : node.getChildren())
@@ -329,6 +329,8 @@ public class TestInMemoryNodeModel
             assertNotEquals("Node still found", result.getNode().getNodeName(),
                     c.getNodeName());
         }
+        assertEquals("Wrong number of removed elements", 1, removed.size());
+        assertTrue("Wrong removed element", removed.contains(result));
     }
 
     /**
@@ -477,17 +479,20 @@ public class TestInMemoryNodeModel
         NodeKeyResolver<ImmutableNode> resolver = createResolver();
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_PERSONAE_TREE);
         final String nodeName = "Puck";
+        QueryResult<ImmutableNode> result = QueryResult.createAttributeResult(
+                nodeForKey(model, nodeName),
+                NodeStructureHelper.ATTR_AUTHOR);
         EasyMock.expect(
                 resolver.resolveKey(ROOT_PERSONAE_TREE, KEY,
                         model.getNodeHandler())).andReturn(
-                Collections.singletonList(QueryResult.createAttributeResult(
-                        nodeForKey(model, nodeName),
-                        NodeStructureHelper.ATTR_AUTHOR)));
+                Collections.singletonList(result));
         EasyMock.replay(resolver);
 
-        model.clearTree(KEY, resolver);
+        List<QueryResult<ImmutableNode>> removed = model.clearTree(KEY, resolver);
         ImmutableNode node = nodeForKey(model, nodeName);
         assertTrue("Got still attributes", node.getAttributes().isEmpty());
+        assertEquals("Wrong number of removed elements", 1, removed.size());
+        assertTrue("Wrong removed element", removed.contains(result));
     }
 
     /**
@@ -539,7 +544,7 @@ public class TestInMemoryNodeModel
         EasyMock.replay(resolver);
 
         TreeData treeDataOld = model.getTreeData();
-        model.clearTree(KEY, resolver);
+        assertTrue("Elements removed", model.clearTree(KEY, resolver).isEmpty());
         assertNotNull("No root node", model.getNodeHandler().getRootNode());
         assertSame("Data was changed", treeDataOld, model.getTreeData());
     }