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/03/09 21:59:39 UTC

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

Author: oheger
Date: Sun Mar  9 20:59:39 2014
New Revision: 1575760

URL: http://svn.apache.org/r1575760
Log:
InMemoryNodeModel no longer implements the NodeHandler interface.

This caused a number of adaptations in other classes.

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/ModelTransaction.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestInMemoryNodeModel.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeSelector.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeTreeWalker.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestQueryResult.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationAttributePointer.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathContextFactory.java
    commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathExpressionEngine.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=1575760&r1=1575759&r2=1575760&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 20:59:39 2014
@@ -16,7 +16,6 @@
  */
 package org.apache.commons.configuration.tree;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -24,11 +23,9 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.commons.configuration.ex.ConfigurationRuntimeException;
-import org.apache.commons.lang3.StringUtils;
 
 /**
  * <p>
@@ -50,9 +47,17 @@ import org.apache.commons.lang3.StringUt
  * @version $Id$
  * @since 2.0
  */
-public class InMemoryNodeModel implements NodeHandler<ImmutableNode>,
-        NodeModel<ImmutableNode>
+public class InMemoryNodeModel implements NodeModel<ImmutableNode>
 {
+    /**
+     * A dummy node handler instance used in operations which require only a
+     * limited functionality.
+     */
+    private static final NodeHandler<ImmutableNode> DUMMY_HANDLER =
+            new TreeData(null,
+                    Collections.<ImmutableNode, ImmutableNode> emptyMap(),
+                    Collections.<ImmutableNode, ImmutableNode> emptyMap(), null);
+
     /** Stores information about the current nodes structure. */
     private final AtomicReference<TreeData> structure;
 
@@ -91,101 +96,7 @@ public class InMemoryNodeModel implement
      */
     public NodeHandler<ImmutableNode> getNodeHandler()
     {
-        return this;
-    }
-
-    public String nodeName(ImmutableNode node)
-    {
-        return node.getNodeName();
-    }
-
-    public Object getValue(ImmutableNode node)
-    {
-        return node.getValue();
-    }
-
-    /**
-     * {@inheritDoc} This implementation uses internal mapping information to
-     * determine the parent node of the given node. If the passed in node is the
-     * root node of this model, result is <b>null</b>. If the node is not part
-     * of this model, an exception is thrown. Otherwise, the parent node is
-     * returned.
-     *
-     * @throws IllegalArgumentException if the passed in node does not belong to
-     *         this model
-     */
-    public ImmutableNode getParent(ImmutableNode node)
-    {
-        return getTreeData().getParent(node);
-    }
-
-    public List<ImmutableNode> getChildren(ImmutableNode node)
-    {
-        return node.getChildren();
-    }
-
-    /**
-     * {@inheritDoc} This implementation returns an immutable list with all
-     * child nodes that have the specified name.
-     */
-    public List<ImmutableNode> getChildren(ImmutableNode node, String name)
-    {
-        List<ImmutableNode> result =
-                new ArrayList<ImmutableNode>(node.getChildren().size());
-        for (ImmutableNode c : node.getChildren())
-        {
-            if (StringUtils.equals(name, c.getNodeName()))
-            {
-                result.add(c);
-            }
-        }
-        return Collections.unmodifiableList(result);
-    }
-
-    public ImmutableNode getChild(ImmutableNode node, int index)
-    {
-        return node.getChildren().get(index);
-    }
-
-    public int indexOfChild(ImmutableNode parent, ImmutableNode child)
-    {
-        return parent.getChildren().indexOf(child);
-    }
-
-    public int getChildrenCount(ImmutableNode node, String name)
-    {
-        if (name == null)
-        {
-            return node.getChildren().size();
-        }
-        else
-        {
-            return getChildren(node, name).size();
-        }
-    }
-
-    public Set<String> getAttributes(ImmutableNode node)
-    {
-        return node.getAttributes().keySet();
-    }
-
-    public boolean hasAttributes(ImmutableNode node)
-    {
-        return !node.getAttributes().isEmpty();
-    }
-
-    public Object getAttributeValue(ImmutableNode node, String name)
-    {
-        return node.getAttributes().get(name);
-    }
-
-    /**
-     * {@inheritDoc} This implementation assumes that a node is defined if it
-     * has a value or has children or has attributes.
-     */
-    public boolean isDefined(ImmutableNode node)
-    {
-        return checkIfNodeDefined(node);
+        return getTreeData();
     }
 
     public void addProperty(final String key, final Iterable<?> values,
@@ -214,7 +125,7 @@ public class InMemoryNodeModel implement
                 {
                     List<QueryResult<ImmutableNode>> results =
                             resolver.resolveKey(tx.getCurrentData().getRoot(),
-                                    key, InMemoryNodeModel.this);
+                                    key, tx.getCurrentData());
                     if (results.size() == 1)
                     {
                         if (results.get(0).isAttributeResult())
@@ -227,7 +138,7 @@ public class InMemoryNodeModel implement
                     {
                         NodeAddData<ImmutableNode> addData =
                                 resolver.resolveAddKey(tx.getCurrentData()
-                                        .getRoot(), key, InMemoryNodeModel.this);
+                                        .getRoot(), key, tx.getCurrentData());
                         if (addData.isAttribute())
                         {
                             throw attributeKeyException(key);
@@ -256,7 +167,7 @@ public class InMemoryNodeModel implement
                 NodeUpdateData<ImmutableNode> updateData =
                         resolver.resolveUpdateKey(
                                 tx.getCurrentData().getRoot(), key, value,
-                                InMemoryNodeModel.this);
+                                tx.getCurrentData());
                 if (!updateData.getNewValues().isEmpty())
                 {
                     initializeAddTransaction(tx, key,
@@ -289,7 +200,7 @@ public class InMemoryNodeModel implement
                 TreeData currentStructure = tx.getCurrentData();
                 for (QueryResult<ImmutableNode> result : resolver
                         .resolveKey(currentStructure.getRoot(), key,
-                                InMemoryNodeModel.this))
+                                tx.getCurrentData()))
                 {
                     if (result.isAttributeResult())
                     {
@@ -318,13 +229,16 @@ public class InMemoryNodeModel implement
      * {@inheritDoc} If this operation leaves an affected node in an undefined
      * state, it is removed from the model.
      */
-    public void clearProperty(final String key, final NodeKeyResolver<ImmutableNode> resolver)
+    public void clearProperty(final String key,
+            final NodeKeyResolver<ImmutableNode> resolver)
     {
-        updateModel(new TransactionInitializer() {
-            public boolean initTransaction(ModelTransaction tx) {
+        updateModel(new TransactionInitializer()
+        {
+            public boolean initTransaction(ModelTransaction tx)
+            {
                 List<QueryResult<ImmutableNode>> results =
                         resolver.resolveKey(tx.getCurrentData().getRoot(), key,
-                                InMemoryNodeModel.this);
+                                tx.getCurrentData());
                 initializeClearTransaction(tx, results);
                 return true;
             }
@@ -382,7 +296,7 @@ public class InMemoryNodeModel implement
             TreeData current = structure.get();
             NodeTracker newTracker =
                     current.getNodeTracker().trackNode(current.getRoot(),
-                            selector, resolver, this);
+                            selector, resolver, current);
             done =
                     structure.compareAndSet(current,
                             current.updateNodeTracker(newTracker));
@@ -484,7 +398,7 @@ public class InMemoryNodeModel implement
                             parents.put(c, node);
                         }
                     }
-                }, this);
+                }, DUMMY_HANDLER);
     }
 
     /**
@@ -512,7 +426,8 @@ public class InMemoryNodeModel implement
             Iterable<?> values, NodeKeyResolver<ImmutableNode> resolver)
     {
         NodeAddData<ImmutableNode> addData =
-                resolver.resolveAddKey(tx.getCurrentData().getRoot(), key, this);
+                resolver.resolveAddKey(tx.getCurrentData().getRoot(), key,
+                        tx.getCurrentData());
         if (addData.isAttribute())
         {
             addAttributeProperty(tx, addData, values);

Modified: commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/ModelTransaction.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/ModelTransaction.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/ModelTransaction.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/ModelTransaction.java Sun Mar  9 20:59:39 2014
@@ -242,7 +242,7 @@ class ModelTransaction
         updateParentMapping();
         return new TreeData(newRoot, parentMapping,
                 replacedNodes, currentData.getNodeTracker().update(newRoot,
-                        getResolver(), model));
+                        getResolver(), getCurrentData()));
     }
 
     /**
@@ -402,7 +402,7 @@ class ModelTransaction
                         parentMapping.remove(node);
                         removeNodeFromReplacementMapping(node);
                     }
-                }, model);
+                }, getCurrentData());
     }
 
     /**

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java Sun Mar  9 20:59:39 2014
@@ -65,7 +65,7 @@ public class TestDefaultExpressionEngine
     public static void setUpBeforeClass()
     {
         root = setUpNodes();
-        handler = new InMemoryNodeModel(root);
+        handler = new InMemoryNodeModel(root).getNodeHandler();
     }
 
     @Before

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=1575760&r1=1575759&r2=1575760&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 Mar  9 20:59:39 2014
@@ -90,7 +90,7 @@ public class TestInMemoryNodeModel
     public void testGetNodeHandler()
     {
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_PERSONAE_TREE);
-        assertSame("Wrong node handler", model, model.getNodeHandler());
+        assertSame("Wrong node handler", model.getTreeData(), model.getNodeHandler());
     }
 
     /**
@@ -119,7 +119,7 @@ public class TestInMemoryNodeModel
                         "Homer/Ilias"), "location", false,
                         Collections.singleton("locations"));
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
-        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model))
+        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model.getNodeHandler()))
                 .andReturn(addData);
         EasyMock.replay(resolver);
         String[] locations = {
@@ -155,8 +155,9 @@ public class TestInMemoryNodeModel
                 new NodeAddData<ImmutableNode>(nodeForKey(ROOT_AUTHORS_TREE,
                         "Homer"), "work", false, null);
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
-        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(addData);
+        EasyMock.expect(
+                resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(addData);
         EasyMock.replay(resolver);
 
         model.addProperty(KEY, Collections.singleton("Odyssee"), resolver);
@@ -179,8 +180,9 @@ public class TestInMemoryNodeModel
                         "Homer/Ilias"), "location", false,
                         Collections.singleton("locations"));
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
-        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(addData);
+        EasyMock.expect(
+                resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(addData);
         EasyMock.replay(resolver);
         String[] locations = {
                 "Troja", "Beach", "Olympos"
@@ -206,13 +208,14 @@ public class TestInMemoryNodeModel
     private static void checkPathToRoot(InMemoryNodeModel model,
             ImmutableNode node, String... path)
     {
+        NodeHandler<ImmutableNode> handler = model.getNodeHandler();
         for (int i = path.length - 1; i >= 0; i--)
         {
-            node = model.getParent(node);
+            node = handler.getParent(node);
             assertEquals("Wrong node name", path[i], node.getNodeName());
         }
         assertSame("Wrong root node", model.getRootNode(),
-                model.getParent(node));
+                handler.getParent(node));
     }
 
     /**
@@ -227,8 +230,9 @@ public class TestInMemoryNodeModel
                         "Homer/Ilias"), "number", true, Arrays.asList("scenes",
                         "scene"));
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
-        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(addData);
+        EasyMock.expect(
+                resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(addData);
         EasyMock.replay(resolver);
 
         model.addProperty(KEY, Collections.singleton(1), resolver);
@@ -249,8 +253,9 @@ public class TestInMemoryNodeModel
                         NodeStructureHelper.author(0)), "year", true,
                         Arrays.asList("dateOfBirth"));
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
-        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(addData);
+        EasyMock.expect(
+                resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(addData);
         EasyMock.replay(resolver);
 
         final Integer year = 1564;
@@ -272,8 +277,9 @@ public class TestInMemoryNodeModel
                 new NodeAddData<ImmutableNode>(nodeForKey(ROOT_AUTHORS_TREE,
                         "Shakespeare/The Tempest"), "year", true, null);
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
-        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(addData);
+        EasyMock.expect(
+                resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(addData);
         EasyMock.replay(resolver);
 
         model.addProperty(KEY, Collections.singleton(1611), resolver);
@@ -309,8 +315,10 @@ public class TestInMemoryNodeModel
         QueryResult<ImmutableNode> result =
                 QueryResult.createNodeResult(nodeForKey(model,
                         "Homer/Ilias/Achilles"));
-        EasyMock.expect(resolver.resolveKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(Collections.singletonList(result));
+        EasyMock.expect(
+                resolver.resolveKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(
+                Collections.singletonList(result));
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
@@ -337,14 +345,16 @@ public class TestInMemoryNodeModel
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
         QueryResult<ImmutableNode> result =
                 QueryResult.createNodeResult(nodeForKey(model, pathToRemove));
-        EasyMock.expect(resolver.resolveKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(Collections.singletonList(result));
+        EasyMock.expect(
+                resolver.resolveKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(
+                Collections.singletonList(result));
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
         try
         {
-            model.getParent(nodeToCheck);
+            model.getNodeHandler().getParent(nodeToCheck);
             fail("Removed node still in parent mapping!");
         }
         catch (IllegalArgumentException iaex)
@@ -391,8 +401,10 @@ public class TestInMemoryNodeModel
         QueryResult<ImmutableNode> result =
                 QueryResult.createNodeResult(nodeForKey(model,
                         nodePathWithEndNode("Achilles", path)));
-        EasyMock.expect(resolver.resolveKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(Collections.singletonList(result));
+        EasyMock.expect(
+                resolver.resolveKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(
+                Collections.singletonList(result));
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
@@ -417,8 +429,9 @@ public class TestInMemoryNodeModel
         {
             results.add(QueryResult.createNodeResult(child));
         }
-        EasyMock.expect(resolver.resolveKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(results);
+        EasyMock.expect(
+                resolver.resolveKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(results);
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
@@ -444,13 +457,15 @@ public class TestInMemoryNodeModel
         ImmutableNode root =
                 new ImmutableNode.Builder(1).addChild(child).create();
         InMemoryNodeModel model = new InMemoryNodeModel(root);
-        EasyMock.expect(resolver.resolveKey(root, KEY, model)).andReturn(
-                Collections.singletonList(QueryResult.createNodeResult(child)));
+        EasyMock.expect(resolver.resolveKey(root, KEY, model.getNodeHandler()))
+                .andReturn(
+                        Collections.singletonList(QueryResult
+                                .createNodeResult(child)));
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
         assertFalse("Root node still defined",
-                model.isDefined(model.getRootNode()));
+                model.getNodeHandler().isDefined(model.getRootNode()));
     }
 
     /**
@@ -462,12 +477,12 @@ public class TestInMemoryNodeModel
         NodeKeyResolver<ImmutableNode> resolver = createResolver();
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_PERSONAE_TREE);
         final String nodeName = "Puck";
-        EasyMock.expect(resolver.resolveKey(ROOT_PERSONAE_TREE, KEY, model))
-                .andReturn(
-                        Collections.singletonList(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)));
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
@@ -492,8 +507,9 @@ public class TestInMemoryNodeModel
         results.add(QueryResult.createAttributeResult(orgNode,
                 NodeStructureHelper.ATTR_AUTHOR));
         results.add(QueryResult.createNodeResult(orgNode.getChildren().get(0)));
-        EasyMock.expect(resolver.resolveKey(ROOT_PERSONAE_TREE, KEY, model))
-                .andReturn(results);
+        EasyMock.expect(
+                resolver.resolveKey(ROOT_PERSONAE_TREE, KEY,
+                        model.getNodeHandler())).andReturn(results);
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
@@ -516,7 +532,8 @@ public class TestInMemoryNodeModel
     {
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
         model.clear();
-        assertFalse("Got still data", model.isDefined(model.getRootNode()));
+        assertFalse("Got still data",
+                model.getNodeHandler().isDefined(model.getRootNode()));
         assertEquals("Root name was changed", ROOT_AUTHORS_TREE.getNodeName(),
                 model.getRootNode().getNodeName());
     }
@@ -534,12 +551,14 @@ public class TestInMemoryNodeModel
         results.add(QueryResult.createNodeResult(nodeForKey(model,
                 NodeStructureHelper.author(0))));
         results.add(QueryResult.createNodeResult(ROOT_AUTHORS_TREE));
-        EasyMock.expect(resolver.resolveKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(results);
+        EasyMock.expect(
+                resolver.resolveKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(results);
         EasyMock.replay(resolver);
 
         model.clearTree(KEY, resolver);
-        assertFalse("Got still data", model.isDefined(model.getRootNode()));
+        assertFalse("Got still data",
+                model.getNodeHandler().isDefined(model.getRootNode()));
     }
 
     /**
@@ -559,12 +578,11 @@ public class TestInMemoryNodeModel
             EasyMock.expect(
                     resolver.resolveAddKey(
                             EasyMock.anyObject(ImmutableNode.class),
-                            EasyMock.eq(KEY), EasyMock.eq(model))).andAnswer(
-                    new IAnswer<NodeAddData<ImmutableNode>>()
-                    {
+                            EasyMock.eq(KEY),
+                            EasyMock.anyObject(TreeData.class))).andAnswer(
+                    new IAnswer<NodeAddData<ImmutableNode>>() {
                         public NodeAddData<ImmutableNode> answer()
-                                throws Throwable
-                        {
+                                throws Throwable {
                             assertSame("Wrong root node", model.getRootNode(),
                                     EasyMock.getCurrentArguments()[0]);
                             ImmutableNode addParent = nodeForKey(model, key);
@@ -602,7 +620,7 @@ public class TestInMemoryNodeModel
                 new InMemoryNodeModel(NodeStructureHelper.ROOT_AUTHORS_TREE);
         EasyMock.expect(
                 resolver.resolveAddKey(EasyMock.anyObject(ImmutableNode.class),
-                        EasyMock.eq(KEY), EasyMock.eq(model)))
+                        EasyMock.eq(KEY), EasyMock.anyObject(TreeData.class)))
                 .andAnswer(new IAnswer<NodeAddData<ImmutableNode>>()
                 {
                     public NodeAddData<ImmutableNode> answer() throws Throwable
@@ -675,10 +693,11 @@ public class TestInMemoryNodeModel
                 new InMemoryNodeModel(NodeStructureHelper.ROOT_PERSONAE_TREE);
         final String nodeKey =
                 "Ariel/The Tempest/" + NodeStructureHelper.ELEM_ORG_VALUE;
-        EasyMock.expect(resolver.resolveKey(model.getRootNode(), KEY, model))
-                .andReturn(
-                        Collections.singletonList(QueryResult
-                                .createNodeResult(nodeForKey(model, nodeKey))));
+        EasyMock.expect(
+                resolver.resolveKey(model.getRootNode(), KEY,
+                        model.getNodeHandler())).andReturn(
+                Collections.singletonList(QueryResult
+                        .createNodeResult(nodeForKey(model, nodeKey))));
         EasyMock.replay(resolver);
 
         model.clearProperty(KEY, resolver);
@@ -697,12 +716,12 @@ public class TestInMemoryNodeModel
                 new InMemoryNodeModel(NodeStructureHelper.ROOT_PERSONAE_TREE);
         final String nodeKey =
                 "Prospero/The Tempest/" + NodeStructureHelper.ELEM_ORG_VALUE;
-        EasyMock.expect(resolver.resolveKey(model.getRootNode(), KEY, model))
-                .andReturn(
-                        Collections.singletonList(QueryResult
-                                .createAttributeResult(
-                                        nodeForKey(model, nodeKey),
-                                        NodeStructureHelper.ATTR_TESTED)));
+        EasyMock.expect(
+                resolver.resolveKey(model.getRootNode(), KEY,
+                        model.getNodeHandler())).andReturn(
+                Collections.singletonList(QueryResult.createAttributeResult(
+                        nodeForKey(model, nodeKey),
+                        NodeStructureHelper.ATTR_TESTED)));
         EasyMock.replay(resolver);
 
         model.clearProperty(KEY, resolver);
@@ -725,10 +744,11 @@ public class TestInMemoryNodeModel
                         Collections.<Object> singleton("Odyssee"), null, KEY);
         InMemoryNodeModel model = new InMemoryNodeModel(ROOT_AUTHORS_TREE);
         EasyMock.expect(
-                resolver.resolveUpdateKey(ROOT_AUTHORS_TREE, KEY, this, model))
-                .andReturn(updateData);
-        EasyMock.expect(resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY, model))
-                .andReturn(addData);
+                resolver.resolveUpdateKey(ROOT_AUTHORS_TREE, KEY, this,
+                        model.getNodeHandler())).andReturn(updateData);
+        EasyMock.expect(
+                resolver.resolveAddKey(ROOT_AUTHORS_TREE, KEY,
+                        model.getNodeHandler())).andReturn(addData);
         EasyMock.replay(resolver);
 
         model.setProperty(KEY, this, resolver);
@@ -757,7 +777,7 @@ public class TestInMemoryNodeModel
         EasyMock.expect(
                 resolver.resolveUpdateKey(
                         NodeStructureHelper.ROOT_PERSONAE_TREE, KEY, this,
-                        model)).andReturn(updateData);
+                        model.getNodeHandler())).andReturn(updateData);
         EasyMock.replay(resolver);
 
         model.setProperty(KEY, this, resolver);
@@ -789,7 +809,7 @@ public class TestInMemoryNodeModel
         EasyMock.expect(
                 resolver.resolveUpdateKey(
                         NodeStructureHelper.ROOT_PERSONAE_TREE, KEY, this,
-                        model)).andReturn(updateData);
+                        model.getNodeHandler())).andReturn(updateData);
         EasyMock.replay(resolver);
 
         model.setProperty(KEY, this, resolver);
@@ -811,7 +831,7 @@ public class TestInMemoryNodeModel
         EasyMock.expect(
                 resolver.resolveUpdateKey(
                         NodeStructureHelper.ROOT_PERSONAE_TREE, KEY, this,
-                        model)).andReturn(
+                        model.getNodeHandler())).andReturn(
                 new NodeUpdateData<ImmutableNode>(null, null, null, null));
         EasyMock.replay(resolver);
 
@@ -837,7 +857,7 @@ public class TestInMemoryNodeModel
                         .create();
         EasyMock.expect(
                 resolver.resolveKey(NodeStructureHelper.ROOT_AUTHORS_TREE, KEY,
-                        model)).andReturn(
+                        model.getNodeHandler())).andReturn(
                 Collections.singletonList(QueryResult
                         .createNodeResult(nodeForKey(model, key))));
         EasyMock.replay(resolver);
@@ -865,11 +885,11 @@ public class TestInMemoryNodeModel
         final String newPersona = "Mephisto";
         EasyMock.expect(
                 resolver.resolveKey(NodeStructureHelper.ROOT_AUTHORS_TREE, KEY,
-                        model)).andReturn(
+                        model.getNodeHandler())).andReturn(
                 new ArrayList<QueryResult<ImmutableNode>>(0));
         EasyMock.expect(
                 resolver.resolveAddKey(NodeStructureHelper.ROOT_AUTHORS_TREE,
-                        KEY, model)).andReturn(
+                        KEY, model.getNodeHandler())).andReturn(
                 new NodeAddData<ImmutableNode>(
                         NodeStructureHelper.ROOT_AUTHORS_TREE, newWork, false,
                         Arrays.asList(newAuthor)));
@@ -893,7 +913,7 @@ public class TestInMemoryNodeModel
                 new InMemoryNodeModel(NodeStructureHelper.ROOT_AUTHORS_TREE);
         EasyMock.expect(
                 resolver.resolveKey(NodeStructureHelper.ROOT_AUTHORS_TREE, KEY,
-                        model)).andReturn(
+                        model.getNodeHandler())).andReturn(
                 Collections.singletonList(QueryResult.createAttributeResult(
                         nodeForKey(model, NodeStructureHelper.author(1)),
                         "test")));
@@ -915,11 +935,11 @@ public class TestInMemoryNodeModel
                 new InMemoryNodeModel(NodeStructureHelper.ROOT_AUTHORS_TREE);
         EasyMock.expect(
                 resolver.resolveKey(NodeStructureHelper.ROOT_AUTHORS_TREE, KEY,
-                        model)).andReturn(
+                        model.getNodeHandler())).andReturn(
                 Collections.<QueryResult<ImmutableNode>> emptyList());
         EasyMock.expect(
                 resolver.resolveAddKey(NodeStructureHelper.ROOT_AUTHORS_TREE,
-                        KEY, model)).andReturn(
+                        KEY, model.getNodeHandler())).andReturn(
                 new NodeAddData<ImmutableNode>(
                         NodeStructureHelper.ROOT_AUTHORS_TREE, "test", true,
                         null));
@@ -979,7 +999,7 @@ public class TestInMemoryNodeModel
                 NodeStructureHelper.ROOT_AUTHORS_TREE, model.getRootNode());
         ImmutableNode node = nodeForKey(model, "Homer/Ilias");
         assertEquals("Wrong parent mapping", nodeForKey(model, "Homer"),
-                model.getParent(node));
+                model.getNodeHandler().getParent(node));
     }
 
     /**

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeSelector.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeSelector.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeSelector.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeSelector.java Sun Mar  9 20:59:39 2014
@@ -54,7 +54,7 @@ public class TestNodeSelector
     public static void setUpBeforeClass() throws Exception
     {
         resolver = createResolver();
-        handler = new InMemoryNodeModel();
+        handler = new InMemoryNodeModel().getNodeHandler();
         root =
                 new ImmutableNode.Builder(1).addChild(
                         NodeStructureHelper.ROOT_TABLES_TREE).create();

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeTreeWalker.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeTreeWalker.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeTreeWalker.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestNodeTreeWalker.java Sun Mar  9 20:59:39 2014
@@ -70,6 +70,16 @@ public class TestNodeTreeWalker
     }
 
     /**
+     * Creates a dummy node handler.
+     *
+     * @return the node handler
+     */
+    private static NodeHandler<ImmutableNode> createHandler()
+    {
+        return new InMemoryNodeModel().getNodeHandler();
+    }
+
+    /**
      * Tries a walk() operation without a node handler.
      */
     @Test(expected = IllegalArgumentException.class)
@@ -86,7 +96,7 @@ public class TestNodeTreeWalker
     public void testWalkNoVisitor()
     {
         NodeTreeWalker.INSTANCE.walkDFS(NodeStructureHelper.ROOT_AUTHORS_TREE,
-                null, new InMemoryNodeModel());
+                null, createHandler());
     }
 
     /**
@@ -110,7 +120,7 @@ public class TestNodeTreeWalker
         List<String> expected = expectDFS();
         TestVisitor visitor = new TestVisitor();
         NodeTreeWalker.INSTANCE.walkDFS(NodeStructureHelper.ROOT_AUTHORS_TREE,
-                visitor, new InMemoryNodeModel());
+                visitor, createHandler());
         assertEquals("Wrong visited nodes", expected, visitor.getVisitedNodes());
     }
 
@@ -159,7 +169,7 @@ public class TestNodeTreeWalker
         final int nodeCount = 5;
         visitor.setMaxNodeCount(nodeCount);
         NodeTreeWalker.INSTANCE.walkDFS(NodeStructureHelper.ROOT_AUTHORS_TREE,
-                visitor, new InMemoryNodeModel());
+                visitor, createHandler());
         assertEquals("Wrong number of visited nodes", nodeCount, visitor
                 .getVisitedNodes().size());
     }
@@ -185,7 +195,7 @@ public class TestNodeTreeWalker
         List<String> expected = expectBFS();
         TestVisitor visitor = new TestVisitor();
         NodeTreeWalker.INSTANCE.walkBFS(NodeStructureHelper.ROOT_AUTHORS_TREE,
-                visitor, new InMemoryNodeModel());
+                visitor, createHandler());
         assertEquals("Wrong visited nodes", expected, visitor.getVisitedNodes());
     }
 
@@ -230,7 +240,7 @@ public class TestNodeTreeWalker
         final int nodeCount = 9;
         visitor.setMaxNodeCount(nodeCount);
         NodeTreeWalker.INSTANCE.walkBFS(NodeStructureHelper.ROOT_AUTHORS_TREE,
-                visitor, new InMemoryNodeModel());
+                visitor, createHandler());
         assertEquals("Wrong number of visited nodes", nodeCount, visitor
                 .getVisitedNodes().size());
     }

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestQueryResult.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestQueryResult.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestQueryResult.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/TestQueryResult.java Sun Mar  9 20:59:39 2014
@@ -87,7 +87,8 @@ public class TestQueryResult
         QueryResult<ImmutableNode> result =
                 QueryResult.createAttributeResult(attributeNode, ATTR);
         assertEquals("Wrong value", VALUE,
-                result.getAttributeValue(new InMemoryNodeModel()));
+                result.getAttributeValue(new InMemoryNodeModel()
+                        .getNodeHandler()));
     }
 
     /**
@@ -98,7 +99,7 @@ public class TestQueryResult
     {
         QueryResult<ImmutableNode> result =
                 QueryResult.createNodeResult(resultNode);
-        result.getAttributeValue(new InMemoryNodeModel());
+        result.getAttributeValue(new InMemoryNodeModel().getNodeHandler());
     }
 
     /**

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java Sun Mar  9 20:59:39 2014
@@ -64,7 +64,7 @@ public abstract class AbstractXPathTest
     public void setUp() throws Exception
     {
         root = constructHierarchy(LEVEL_COUNT);
-        handler = new InMemoryNodeModel(root);
+        handler = new InMemoryNodeModel(root).getNodeHandler();
     }
 
     /**

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationAttributePointer.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationAttributePointer.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationAttributePointer.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationAttributePointer.java Sun Mar  9 20:59:39 2014
@@ -61,7 +61,7 @@ public class TestConfigurationAttributeP
         ImmutableNode nd = ndBuilder.create();
         parent =
                 new ConfigurationNodePointer<ImmutableNode>(nd, Locale.ENGLISH,
-                        new InMemoryNodeModel(nd));
+                        new InMemoryNodeModel(nd).getNodeHandler());
         pointer =
                 new ConfigurationAttributePointer<ImmutableNode>(parent,
                         ATTR_NAME);

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathContextFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathContextFactory.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathContextFactory.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathContextFactory.java Sun Mar  9 20:59:39 2014
@@ -50,7 +50,8 @@ public class TestXPathContextFactory
     {
         ImmutableNode node =
                 new ImmutableNode.Builder().name("testRoot").create();
-        NodeHandler<ImmutableNode> handler = new InMemoryNodeModel(node);
+        NodeHandler<ImmutableNode> handler =
+                new InMemoryNodeModel(node).getNodeHandler();
         JXPathContext context = factory.createContext(node, handler);
 
         assertTrue("No lenient mode", context.isLenient());

Modified: commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathExpressionEngine.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathExpressionEngine.java?rev=1575760&r1=1575759&r2=1575760&view=diff
==============================================================================
--- commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathExpressionEngine.java (original)
+++ commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestXPathExpressionEngine.java Sun Mar  9 20:59:39 2014
@@ -61,7 +61,7 @@ public class TestXPathExpressionEngine
     public static void setUpBeforeClass() throws Exception
     {
         root = new ImmutableNode.Builder().name(ROOT_NAME).create();
-        handler = new InMemoryNodeModel(root);
+        handler = new InMemoryNodeModel(root).getNodeHandler();
     }
 
     /**
@@ -504,7 +504,8 @@ public class TestXPathExpressionEngine
                 new ImmutableNode.Builder().name("child_other").create();
         parentBuilder.addChildren(Arrays.asList(c2, c1));
         ImmutableNode parent = parentBuilder.create();
-        NodeHandler<ImmutableNode> testHandler = new InMemoryNodeModel(parent);
+        NodeHandler<ImmutableNode> testHandler =
+                new InMemoryNodeModel(parent).getNodeHandler();
         XPathExpressionEngine engine = new XPathExpressionEngine();
         assertEquals("Wrong canonical key", "parent/child[1]",
                 engine.canonicalKey(c1, "parent", testHandler));
@@ -524,7 +525,8 @@ public class TestXPathExpressionEngine
                 new ImmutableNode.Builder().name("child_other").create();
         parentBuilder.addChildren(Arrays.asList(c1, c2, c3));
         ImmutableNode parent = parentBuilder.create();
-        NodeHandler<ImmutableNode> testHandler = new InMemoryNodeModel(parent);
+        NodeHandler<ImmutableNode> testHandler =
+                new InMemoryNodeModel(parent).getNodeHandler();
         XPathExpressionEngine engine = new XPathExpressionEngine();
         assertEquals("Wrong key 1", "parent/child[1]",
                 engine.canonicalKey(c1, "parent", testHandler));
@@ -542,7 +544,8 @@ public class TestXPathExpressionEngine
         ImmutableNode.Builder parentBuilder = new ImmutableNode.Builder(1);
         ImmutableNode c1 = new ImmutableNode.Builder().name("child").create();
         ImmutableNode parent = parentBuilder.addChild(c1).create();
-        NodeHandler<ImmutableNode> testHandler = new InMemoryNodeModel(parent);
+        NodeHandler<ImmutableNode> testHandler =
+                new InMemoryNodeModel(parent).getNodeHandler();
         XPathExpressionEngine engine = new XPathExpressionEngine();
         assertEquals("Wrong key", "child[1]",
                 engine.canonicalKey(c1, null, testHandler));