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:32:10 UTC

svn commit: r1588831 [10/11] - in /commons/proper/configuration/trunk: ./ src/main/java/org/apache/commons/configuration/ src/main/java/org/apache/commons/configuration/beanutils/ src/main/java/org/apache/commons/configuration/builder/combined/ src/mai...

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/AbstractCombinerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/AbstractCombinerTest.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/AbstractCombinerTest.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/AbstractCombinerTest.java Sun Apr 20 19:32:08 2014
@@ -40,10 +40,10 @@ import org.junit.Test;
 public abstract class AbstractCombinerTest
 {
     /** Constant for the first test configuration. */
-    static File CONF1 = ConfigurationAssert.getTestFile("testcombine1.xml");
+    private static final File CONF1 = ConfigurationAssert.getTestFile("testcombine1.xml");
 
     /** Constant for the second test configuration. */
-    static File CONF2 = ConfigurationAssert.getTestFile("testcombine2.xml");
+    private static final File CONF2 = ConfigurationAssert.getTestFile("testcombine2.xml");
 
     /** The combiner to be tested. */
     protected NodeCombiner combiner;
@@ -56,7 +56,7 @@ public abstract class AbstractCombinerTe
 
     /**
      * Creates the combiner to be tested. This method is called by
-     * <code>setUp()</code>. It must be implemented in concrete sub classes.
+     * {@code setUp()}. It must be implemented in concrete sub classes.
      *
      * @return the combiner to be tested
      */
@@ -75,7 +75,7 @@ public abstract class AbstractCombinerTe
         new FileHandler(conf1).load(CONF1);
         XMLConfiguration conf2 = new XMLConfiguration();
         new FileHandler(conf2).load(CONF2);
-        ConfigurationNode cn = combiner.combine(conf1.getRootNode(), conf2
+        ImmutableNode cn = combiner.combine(conf1.getRootNode(), conf2
                 .getRootNode());
 
         BaseHierarchicalConfiguration result = new BaseHierarchicalConfiguration();
@@ -92,7 +92,6 @@ public abstract class AbstractCombinerTe
     {
         assertTrue("Combiner has list nodes", combiner.getListNodes().isEmpty());
         assertFalse("Node is list node", combiner
-                .isListNode(new DefaultConfigurationNode("test")));
+                .isListNode(NodeStructureHelper.createNode("test", null)));
     }
-
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestDefaultExpressionEngine.java Sun Apr 20 19:32:08 2014
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 /**
@@ -51,16 +52,25 @@ public class TestDefaultExpressionEngine
     { "uid", "uname", "firstName", "lastName", "email"},
     { "docid", "name", "creationDate", "authorID", "version"}};
 
+    /** The root of a hierarchy with test nodes. */
+    private static ImmutableNode root;
+
+    /** A node handler for the hierarchy of test nodes. */
+    private static NodeHandler<ImmutableNode> handler;
+
     /** The object to be tested. */
     private DefaultExpressionEngine engine;
 
-    /** The root of a hierarchy with configuration nodes. */
-    private ConfigurationNode root;
+    @BeforeClass
+    public static void setUpBeforeClass()
+    {
+        root = setUpNodes();
+        handler = new InMemoryNodeModel(root).getNodeHandler();
+    }
 
     @Before
     public void setUp() throws Exception
     {
-        root = setUpNodes();
         engine = DefaultExpressionEngine.INSTANCE;
     }
 
@@ -107,7 +117,8 @@ public class TestDefaultExpressionEngine
         for (int i = 0; i < tables.length; i++)
         {
             checkKeyValue("tables.table(" + i + ").name", "name", tables[i]);
-            checkKeyValue("tables.table(" + i + ")[@type]", "type", tabTypes[i]);
+            checkAttributeValue("tables.table(" + i + ")[@type]", "type",
+                    tabTypes[i]);
 
             for (int j = 0; j < fields[i].length; j++)
             {
@@ -130,6 +141,7 @@ public class TestDefaultExpressionEngine
         checkKey("tables.table(0).fields.field(28).name", null, 0);
         checkKey("tables.table(0).fields.field().name", null, 0);
         checkKey("connection.settings.usr.name", null, 0);
+        checkKey("tables.table(0)[@type].additional", null, 0);
     }
 
     /**
@@ -158,21 +170,48 @@ public class TestDefaultExpressionEngine
                         .create();
         engine = new DefaultExpressionEngine(symbols);
         checkKeyValue("tables.table(0).name", "name", tables[0]);
-        checkKeyValue("tables.table(0).type", "type", tabTypes[0]);
+        checkAttributeValue("tables.table(0).type", "type", tabTypes[0]);
         checkKey("tables.table.type", "type", 2);
     }
 
     /**
-     * Tests accessing the root node.
+     * Helper method for testing a query for the root node.
+     *
+     * @param key the key to be used
+     */
+    private void checkQueryRootNode(String key)
+    {
+        List<QueryResult<ImmutableNode>> results = checkKey(key, null, 1);
+        QueryResult<ImmutableNode> result = results.get(0);
+        assertFalse("No node result", result.isAttributeResult());
+        assertSame("Not the root node", root, result.getNode());
+    }
+
+    /**
+     * Tests whether the root node can be retrieved using the null key.
+     */
+    @Test
+    public void testQueryRootNodeNullKey()
+    {
+        checkQueryRootNode(null);
+    }
+
+    /**
+     * Tests whether the root node can be retrieved using the empty key.
+     */
+    @Test
+    public void testQueryRootNodeEmptyKey()
+    {
+        checkQueryRootNode("");
+    }
+
+    /**
+     * Tests whether an attribute of the root node can be queried.
      */
     @Test
-    public void testQueryRootNode()
+    public void testQueryRootAttribute()
     {
-        List<ConfigurationNode> nodes = checkKey(null, null, 1);
-        assertSame("Root node not found", root, nodes.get(0));
-        nodes = checkKey("", null, 1);
-        assertSame("Root node not found", root, nodes.get(0));
-        checkKeyValue("[@test]", "test", "true");
+        checkAttributeValue("[@test]", "test", "true");
     }
 
     /**
@@ -184,8 +223,8 @@ public class TestDefaultExpressionEngine
     {
         setUpAlternativeSyntax();
         checkKeyValue("tables/table[1]/name", "name", tables[1]);
-        checkKeyValue("tables/table[0]@type", "type", tabTypes[0]);
-        checkKeyValue("@test", "test", "true");
+        checkAttributeValue("tables/table[0]@type", "type", tabTypes[0]);
+        checkAttributeValue("@test", "test", "true");
         checkKeyValue("connection.settings/usr.name", "usr.name", "scott");
     }
 
@@ -195,39 +234,56 @@ public class TestDefaultExpressionEngine
     @Test
     public void testNodeKey()
     {
-        ConfigurationNode node = root.getChild(0);
+        ImmutableNode node = root.getChildren().get(0);
         assertEquals("Invalid name for descendant of root", "tables", engine
-                .nodeKey(node, ""));
+                .nodeKey(node, "", handler));
         assertEquals("Parent key not respected", "test.tables", engine.nodeKey(
-                node, "test"));
+                node, "test", handler));
         assertEquals("Full parent key not taken into account",
                 "a.full.parent.key.tables", engine.nodeKey(node,
-                        "a.full.parent.key"));
+                "a.full.parent.key", handler));
     }
 
     /**
-     * Tests obtaining keys when the root node is involved.
+     * Tests obtaining keys if the root node is involved.
      */
     @Test
     public void testNodeKeyWithRoot()
     {
-        assertEquals("Wrong name for root noot", "", engine.nodeKey(root, null));
-        assertEquals("Null name not detected", "test", engine.nodeKey(root,
-                "test"));
+        assertEquals("Wrong name for root node", "",
+                engine.nodeKey(root, null, handler));
+        assertEquals("Null name not detected", "test",
+                engine.nodeKey(root, "test", handler));
     }
 
     /**
      * Tests obtaining keys for attribute nodes.
      */
     @Test
-    public void testNodeKeyWithAttribute()
+    public void testAttributeKey()
     {
-        ConfigurationNode node = root.getChild(0).getChild(0).getAttribute(0);
-        assertEquals("Wrong attribute node", "type", node.getName());
         assertEquals("Wrong attribute key", "tables.table[@type]", engine
-                .nodeKey(node, "tables.table"));
-        assertEquals("Wrong key for root attribute", "[@test]", engine.nodeKey(
-                root.getAttribute(0), ""));
+                .attributeKey("tables.table", "type"));
+    }
+
+    /**
+     * Tests whether an attribute key can be queried if the root node is involved.
+     */
+    @Test
+    public void testAttributeKeyRoot()
+    {
+        assertEquals("Wrong key for root attribute", "[@test]",
+                engine.attributeKey("", "test"));
+    }
+
+    /**
+     * Tests that a null parent key is ignored when constructing an attribute key.
+     */
+    @Test
+    public void testAttributeKeyNoParent()
+    {
+        assertEquals("Wrong key for null parent", "[@test]",
+                engine.attributeKey(null, "test"));
     }
 
     /**
@@ -236,12 +292,14 @@ public class TestDefaultExpressionEngine
     @Test
     public void testNodeKeyWithEscapedDelimiters()
     {
-        ConfigurationNode node = root.getChild(1);
-        assertEquals("Wrong escaped key", "connection..settings", engine
-                .nodeKey(node, ""));
-        assertEquals("Wrong complex escaped key",
-                "connection..settings.usr..name", engine.nodeKey(node
-                        .getChild(0), engine.nodeKey(node, "")));
+        ImmutableNode node = root.getChildren().get(1);
+        assertEquals("Wrong escaped key", "connection..settings",
+                engine.nodeKey(node, "", handler));
+        assertEquals(
+                "Wrong complex escaped key",
+                "connection..settings.usr..name",
+                engine.nodeKey(node.getChildren().get(0),
+                        engine.nodeKey(node, "", handler), handler));
     }
 
     /**
@@ -252,9 +310,19 @@ public class TestDefaultExpressionEngine
     {
         setUpAlternativeSyntax();
         assertEquals("Wrong child key", "tables/table", engine.nodeKey(root
-                .getChild(0).getChild(0), "tables"));
-        assertEquals("Wrong attribute key", "@test", engine.nodeKey(root
-                .getAttribute(0), ""));
+                .getChildren().get(0).getChildren().get(0), "tables", handler));
+    }
+
+    /**
+     * Tests whether a correct attribute key with alternative syntax is
+     * generated.
+     */
+    @Test
+    public void testAttributeKeyWithAlternativeSyntax()
+    {
+        setUpAlternativeSyntax();
+        assertEquals("Wrong attribute key", "@test",
+                engine.attributeKey("", "test"));
     }
 
     /**
@@ -272,7 +340,7 @@ public class TestDefaultExpressionEngine
                         .create();
         engine = new DefaultExpressionEngine(symbols);
         assertEquals("Wrong attribute key", "/test",
-                engine.nodeKey(root.getAttribute(0), ""));
+                engine.attributeKey("", "test"));
     }
 
     /**
@@ -281,43 +349,43 @@ public class TestDefaultExpressionEngine
     @Test
     public void testPrepareAddDirectly()
     {
-        NodeAddData data = engine.prepareAdd(root, "newNode");
+        NodeAddData<ImmutableNode> data = engine.prepareAdd(root, "newNode", handler);
         assertSame("Wrong parent node", root, data.getParent());
         assertTrue("Path nodes available", data.getPathNodes().isEmpty());
         assertEquals("Wrong name of new node", "newNode", data.getNewNodeName());
         assertFalse("New node is an attribute", data.isAttribute());
 
-        data = engine.prepareAdd(root, "tables.table.fields.field.name");
+        data = engine.prepareAdd(root, "tables.table.fields.field.name", handler);
         assertEquals("Wrong name of new node", "name", data.getNewNodeName());
         assertTrue("Path nodes available", data.getPathNodes().isEmpty());
-        assertEquals("Wrong parent node", "field", data.getParent().getName());
-        ConfigurationNode nd = data.getParent().getChild(0);
-        assertEquals("Field has no name node", "name", nd.getName());
+        assertEquals("Wrong parent node", "field", data.getParent().getNodeName());
+        ImmutableNode nd = data.getParent().getChildren().get(0);
+        assertEquals("Field has no name node", "name", nd.getNodeName());
         assertEquals("Incorrect name", "version", nd.getValue());
     }
 
     /**
-     * Tests adding when indices are involved.
+     * Tests adding if indices are involved.
      */
     @Test
     public void testPrepareAddWithIndex()
     {
-        NodeAddData data = engine
-                .prepareAdd(root, "tables.table(0).tableSpace");
+        NodeAddData<ImmutableNode> data = engine
+                .prepareAdd(root, "tables.table(0).tableSpace", handler);
         assertEquals("Wrong name of new node", "tableSpace", data
                 .getNewNodeName());
         assertTrue("Path nodes available", data.getPathNodes().isEmpty());
         assertEquals("Wrong type of parent node", "table", data.getParent()
-                .getName());
-        ConfigurationNode node = data.getParent().getChild(0);
+                .getNodeName());
+        ImmutableNode node = data.getParent().getChildren().get(0);
         assertEquals("Wrong table", tables[0], node.getValue());
 
-        data = engine.prepareAdd(root, "tables.table(1).fields.field(2).alias");
+        data = engine.prepareAdd(root, "tables.table(1).fields.field(2).alias", handler);
         assertEquals("Wrong name of new node", "alias", data.getNewNodeName());
         assertEquals("Wrong type of parent node", "field", data.getParent()
-                .getName());
+                .getNodeName());
         assertEquals("Wrong field node", "creationDate", data.getParent()
-                .getChild(0).getValue());
+                .getChildren().get(0).getValue());
     }
 
     /**
@@ -326,16 +394,23 @@ public class TestDefaultExpressionEngine
     @Test
     public void testPrepareAddAttribute()
     {
-        NodeAddData data = engine.prepareAdd(root,
-                "tables.table(0)[@tableSpace]");
+        NodeAddData<ImmutableNode> data = engine.prepareAdd(root,
+                "tables.table(0)[@tableSpace]", handler);
         assertEquals("Wrong table node", tables[0], data.getParent()
-                .getChild(0).getValue());
+                .getChildren().get(0).getValue());
         assertEquals("Wrong name of new node", "tableSpace", data
                 .getNewNodeName());
         assertTrue("Attribute not detected", data.isAttribute());
         assertTrue("Path nodes available", data.getPathNodes().isEmpty());
+    }
 
-        data = engine.prepareAdd(root, "[@newAttr]");
+    /**
+     * Tests whether an attribute to the root node can be added.
+     */
+    @Test
+    public void testPrepareAddAttributeRoot()
+    {
+        NodeAddData<ImmutableNode> data = engine.prepareAdd(root, "[@newAttr]", handler);
         assertSame("Root node is not parent", root, data.getParent());
         assertEquals("Wrong name of new node", "newAttr", data.getNewNodeName());
         assertTrue("Attribute not detected", data.isAttribute());
@@ -347,25 +422,22 @@ public class TestDefaultExpressionEngine
     @Test
     public void testPrepareAddWithPath()
     {
-        NodeAddData data = engine.prepareAdd(root,
-                "tables.table(1).fields.field(-1).name");
+        NodeAddData<ImmutableNode> data = engine.prepareAdd(root,
+                "tables.table(1).fields.field(-1).name", handler);
         assertEquals("Wrong name of new node", "name", data.getNewNodeName());
-        checkNodePath(data, new String[]
-        { "field"});
+        checkNodePath(data, "field");
         assertEquals("Wrong type of parent node", "fields", data.getParent()
-                .getName());
+                .getNodeName());
 
-        data = engine.prepareAdd(root, "tables.table(-1).name");
+        data = engine.prepareAdd(root, "tables.table(-1).name", handler);
         assertEquals("Wrong name of new node", "name", data.getNewNodeName());
-        checkNodePath(data, new String[]
-        { "table"});
+        checkNodePath(data, "table");
         assertEquals("Wrong type of parent node", "tables", data.getParent()
-                .getName());
+                .getNodeName());
 
-        data = engine.prepareAdd(root, "a.complete.new.path");
+        data = engine.prepareAdd(root, "a.complete.new.path", handler);
         assertEquals("Wrong name of new node", "path", data.getNewNodeName());
-        checkNodePath(data, new String[]
-        { "a", "complete", "new"});
+        checkNodePath(data, "a", "complete", "new");
         assertSame("Root is not parent", root, data.getParent());
     }
 
@@ -385,16 +457,16 @@ public class TestDefaultExpressionEngine
                                         .getPropertyDelimiter()).create();
         engine = new DefaultExpressionEngine(symbols);
 
-        NodeAddData data = engine.prepareAdd(root, "tables.table(0).test");
+        NodeAddData<ImmutableNode> data =
+                engine.prepareAdd(root, "tables.table(0).test", handler);
         assertEquals("Wrong name of new node", "test", data.getNewNodeName());
         assertFalse("New node is an attribute", data.isAttribute());
         assertEquals("Wrong type of parent node", "table", data.getParent()
-                .getName());
+                .getNodeName());
 
-        data = engine.prepareAdd(root, "a.complete.new.path");
+        data = engine.prepareAdd(root, "a.complete.new.path", handler);
         assertFalse("New node is an attribute", data.isAttribute());
-        checkNodePath(data, new String[]
-        { "a", "complete", "new"});
+        checkNodePath(data, "a", "complete", "new");
     }
 
     /**
@@ -404,17 +476,17 @@ public class TestDefaultExpressionEngine
     public void testPrepareAddWithAlternativeSyntax()
     {
         setUpAlternativeSyntax();
-        NodeAddData data = engine.prepareAdd(root, "tables/table[0]/test");
+        NodeAddData<ImmutableNode> data =
+                engine.prepareAdd(root, "tables/table[0]/test", handler);
         assertEquals("Wrong name of new node", "test", data.getNewNodeName());
         assertFalse("New node is attribute", data.isAttribute());
-        assertEquals("Wrong parent node", tables[0], data.getParent().getChild(
-                0).getValue());
+        assertEquals("Wrong parent node", tables[0], data.getParent()
+                .getChildren().get(0).getValue());
 
-        data = engine.prepareAdd(root, "a/complete/new/path@attr");
+        data = engine.prepareAdd(root, "a/complete/new/path@attr", handler);
         assertEquals("Wrong name of new attribute", "attr", data
                 .getNewNodeName());
-        checkNodePath(data, new String[]
-        { "a", "complete", "new", "path"});
+        checkNodePath(data, "a", "complete", "new", "path");
         assertSame("Root is not parent", root, data.getParent());
     }
 
@@ -425,27 +497,88 @@ public class TestDefaultExpressionEngine
     @Test(expected = IllegalArgumentException.class)
     public void testPrepareAddInvalidKey()
     {
-        engine.prepareAdd(root, "tables.table(0)[@type].new");
+        engine.prepareAdd(root, "tables.table(0)[@type].new", handler);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testPrepareAddInvalidKeyAttribute()
     {
-        engine
-        .prepareAdd(root,
-                "a.complete.new.path.with.an[@attribute].at.a.non.allowed[@position]");
+        engine.prepareAdd(
+                root,
+                "a.complete.new.path.with.an[@attribute].at.a.non.allowed[@position]",
+                handler);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testPrepareAddNullKey()
     {
-        engine.prepareAdd(root, null);
+        engine.prepareAdd(root, null, handler);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testPrepareAddEmptyKey()
     {
-        engine.prepareAdd(root, "");
+        engine.prepareAdd(root, "", handler);
+    }
+
+    /**
+     * Tests whether a canonical key can be queried if all child nodes have
+     * different names.
+     */
+    @Test
+    public void testCanonicalKeyNoDuplicates()
+    {
+        ImmutableNode node = fetchNode("tables.table(0).name");
+        assertEquals("Wrong canonical key", "table.name(0)",
+                engine.canonicalKey(node, "table", handler));
+    }
+
+    /**
+     * Tests whether duplicates are correctly resolved when querying for
+     * canonical keys.
+     */
+    @Test
+    public void testCanonicalKeyWithDuplicates()
+    {
+        ImmutableNode tab1 = fetchNode("tables.table(0)");
+        ImmutableNode tab2 = fetchNode("tables.table(1)");
+        assertEquals("Wrong key 1", "tables.table(0)",
+                engine.canonicalKey(tab1, "tables", handler));
+        assertEquals("Wrong key 2", "tables.table(1)",
+                engine.canonicalKey(tab2, "tables", handler));
+    }
+
+    /**
+     * Tests whether the parent key can be undefined when querying a canonical
+     * key.
+     */
+    @Test
+    public void testCanonicalKeyNoParentKey()
+    {
+        ImmutableNode node = fetchNode("tables.table(0).fields.field(1).name");
+        assertEquals("Wrong key", "name(0)",
+                engine.canonicalKey(node, null, handler));
+    }
+
+    /**
+     * Tests whether a canonical key for the parent node can be queried if no
+     * parent key was passed in.
+     */
+    @Test
+    public void testCanonicalKeyRootNoParentKey()
+    {
+        assertEquals("Wrong key", "", engine.canonicalKey(root, null, handler));
+    }
+
+    /**
+     * Tests whether a parent key is evaluated when determining the canonical
+     * key of the root node.
+     */
+    @Test
+    public void testCanonicalKeyRootWithParentKey()
+    {
+        assertEquals("Wrong key", "parent",
+                engine.canonicalKey(root, "parent", handler));
     }
 
     /**
@@ -465,39 +598,41 @@ public class TestDefaultExpressionEngine
      *
      * @return the root of the test node hierarchy
      */
-    protected ConfigurationNode setUpNodes()
+    private static ImmutableNode setUpNodes()
     {
-        DefaultConfigurationNode rootNode = new DefaultConfigurationNode();
-
-        DefaultConfigurationNode nodeTables = new DefaultConfigurationNode(
-                "tables");
-        rootNode.addChild(nodeTables);
+        ImmutableNode.Builder nodeTablesBuilder =
+                new ImmutableNode.Builder(tables.length);
+        nodeTablesBuilder.name("tables");
         for (int i = 0; i < tables.length; i++)
         {
-            DefaultConfigurationNode nodeTable = new DefaultConfigurationNode(
-                    "table");
-            nodeTables.addChild(nodeTable);
-            nodeTable.addChild(new DefaultConfigurationNode("name", tables[i]));
-            nodeTable.addAttribute(new DefaultConfigurationNode("type",
-                    tabTypes[i]));
-            DefaultConfigurationNode nodeFields = new DefaultConfigurationNode(
-                    "fields");
-            nodeTable.addChild(nodeFields);
+            ImmutableNode.Builder nodeTableBuilder =
+                    new ImmutableNode.Builder(2);
+            nodeTableBuilder.name("table");
+            nodeTableBuilder.addChild(new ImmutableNode.Builder().name("name")
+                    .value(tables[i]).create());
+            nodeTableBuilder.addAttribute("type", tabTypes[i]);
 
+            ImmutableNode.Builder nodeFieldsBuilder =
+                    new ImmutableNode.Builder(fields[i].length);
             for (int j = 0; j < fields[i].length; j++)
             {
-                nodeFields.addChild(createFieldNode(fields[i][j]));
+                nodeFieldsBuilder.addChild(createFieldNode(fields[i][j]));
             }
+            nodeTableBuilder
+                    .addChild(nodeFieldsBuilder.name("fields").create());
+            nodeTablesBuilder.addChild(nodeTableBuilder.create());
         }
 
-        DefaultConfigurationNode nodeConn = new DefaultConfigurationNode(
-                "connection.settings");
-        rootNode.addChild(nodeConn);
-        nodeConn.addChild(new DefaultConfigurationNode("usr.name", "scott"));
-        nodeConn.addChild(new DefaultConfigurationNode("usr.pwd", "tiger"));
-        rootNode.addAttribute(new DefaultConfigurationNode("test", "true"));
+        ImmutableNode.Builder rootBuilder = new ImmutableNode.Builder();
+        rootBuilder.addChild(nodeTablesBuilder.create());
+        ImmutableNode.Builder nodeConnBuilder = new ImmutableNode.Builder();
+        nodeConnBuilder.name("connection.settings");
+        nodeConnBuilder.addChild(createNode("usr.name", "scott"));
+        nodeConnBuilder.addChild(createNode("usr.pwd", "tiger"));
+        rootBuilder.addAttribute("test", "true");
+        rootBuilder.addChild(nodeConnBuilder.create());
 
-        return rootNode;
+        return rootBuilder.create();
     }
 
     /**
@@ -522,19 +657,55 @@ public class TestDefaultExpressionEngine
      * @param count the number of expected result nodes
      * @return the list with the results of the query
      */
-    private List<ConfigurationNode> checkKey(String key, String name, int count)
+    private List<QueryResult<ImmutableNode>> checkKey(String key, String name,
+            int count)
     {
-        List<ConfigurationNode> nodes = engine.query(root, key);
-        assertEquals("Wrong number of result nodes for key " + key, count,
-                nodes.size());
-        for (ConfigurationNode configurationNode : nodes) {
-            assertEquals("Wrong result node for key " + key, name,
-                    configurationNode.getName());
+        List<QueryResult<ImmutableNode>> nodes = query(key, count);
+        for (QueryResult<ImmutableNode> result : nodes)
+        {
+            if (result.isAttributeResult())
+            {
+                assertEquals("Wrong attribute name for key " + key, name,
+                        result.getAttributeName());
+            }
+            else
+            {
+                assertEquals("Wrong result node for key " + key, name, result
+                        .getNode().getNodeName());
+            }
         }
         return nodes;
     }
 
     /**
+     * Helper method for querying the test engine for a specific key.
+     *
+     * @param key the key
+     * @param expCount the expected number of result nodes
+     * @return the collection of retrieved nodes
+     */
+    private List<QueryResult<ImmutableNode>> query(String key, int expCount)
+    {
+        List<QueryResult<ImmutableNode>> nodes = engine.query(root, key, handler);
+        assertEquals("Wrong number of result nodes for key " + key, expCount,
+                nodes.size());
+        return nodes;
+    }
+
+    /**
+     * Helper method for fetching a specific node by its key.
+     *
+     * @param key the key
+     * @return the node with this key
+     */
+    private ImmutableNode fetchNode(String key)
+    {
+        QueryResult<ImmutableNode> result = query(key, 1).get(0);
+        assertFalse("An attribute result", result.isAttributeResult());
+        return result.getNode();
+    }
+
+    /**
      * Helper method for checking the value of a node specified by the given
      * key. This method evaluates the key and checks whether the resulting node
      * has the expected value.
@@ -545,9 +716,28 @@ public class TestDefaultExpressionEngine
      */
     private void checkKeyValue(String key, String name, String value)
     {
-        List<ConfigurationNode> nodes = checkKey(key, name, 1);
+        List<QueryResult<ImmutableNode>> results = checkKey(key, name, 1);
+        QueryResult<ImmutableNode> result = results.get(0);
+        assertFalse("No node result", result.isAttributeResult());
         assertEquals("Wrong value for key " + key, value,
-                nodes.get(0).getValue());
+                result.getNode().getValue());
+    }
+
+    /**
+     * Helper method for checking whether an attribute key is correctly
+     * evaluated.
+     *
+     * @param key the attribute key
+     * @param attr the attribute name
+     * @param expValue the expected attribute value
+     */
+    private void checkAttributeValue(String key, String attr, Object expValue)
+    {
+        List<QueryResult<ImmutableNode>> results = checkKey(key, attr, 1);
+        QueryResult<ImmutableNode> result = results.get(0);
+        assertTrue("Not an attribute result", result.isAttributeResult());
+        assertEquals("Wrong attribute value for key " + key, expValue,
+                result.getAttributeValue(handler));
     }
 
     /**
@@ -556,7 +746,8 @@ public class TestDefaultExpressionEngine
      * @param data the add data object
      * @param expected the expected path nodes
      */
-    private void checkNodePath(NodeAddData data, String[] expected)
+    private void checkNodePath(NodeAddData<ImmutableNode> data,
+            String... expected)
     {
         assertEquals("Wrong number of path nodes", expected.length, data
                 .getPathNodes().size());
@@ -574,11 +765,22 @@ public class TestDefaultExpressionEngine
      * @param name the name of the field
      * @return the field node
      */
-    private static ConfigurationNode createFieldNode(String name)
+    private static ImmutableNode createFieldNode(String name)
+    {
+        ImmutableNode.Builder nodeFieldBuilder = new ImmutableNode.Builder(1);
+        nodeFieldBuilder.addChild(createNode("name", name));
+        return nodeFieldBuilder.name("field").create();
+    }
+
+    /**
+     * Convenience method for creating a simple node with a name and a value.
+     *
+     * @param name the node name
+     * @param value the node value
+     * @return the node instance
+     */
+    private static ImmutableNode createNode(String name, Object value)
     {
-        DefaultConfigurationNode nodeField = new DefaultConfigurationNode(
-                "field");
-        nodeField.addChild(new DefaultConfigurationNode("name", name));
-        return nodeField;
+        return new ImmutableNode.Builder().name(name).value(value).create();
     }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestImmutableNode.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestImmutableNode.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestImmutableNode.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestImmutableNode.java Sun Apr 20 19:32:08 2014
@@ -315,8 +315,21 @@ public class TestImmutableNode
      */
     private ImmutableNode createDefaultNode(Object value)
     {
+        return createDefaultNode(NAME, value);
+    }
+
+    /**
+     * Creates a default node instance with a variable name and value that can
+     * be used by tests for updating properties.
+     *
+     * @param name the name of the node
+     * @param value the value of the node
+     * @return the default node instance
+     */
+    private ImmutableNode createDefaultNode(String name, Object value)
+    {
         ImmutableNode.Builder builder = new ImmutableNode.Builder(1);
-        return builder.name(NAME).addChild(createChild())
+        return builder.name(name).addChild(createChild())
                 .addAttribute("testAttr", "anotherTest").value(value).create();
     }
 
@@ -362,6 +375,21 @@ public class TestImmutableNode
     }
 
     /**
+     * Tests whether the name of a node can be changed for a new instance.
+     */
+    @Test
+    public void testSetName()
+    {
+        ImmutableNode node = createDefaultNode("anotherName", VALUE);
+        ImmutableNode node2 = node.setName(NAME);
+        checkUpdatedNode(node, node2);
+        assertSame("Different children", node.getChildren(),
+                node2.getChildren());
+        assertSame("Different attributes", node.getAttributes(),
+                node2.getAttributes());
+    }
+
+    /**
      * Tests whether a child node can be added.
      */
     @Test
@@ -491,6 +519,70 @@ public class TestImmutableNode
     }
 
     /**
+     * Tests whether multiple attributes can be set.
+     */
+    @Test
+    public void testSetAttributes()
+    {
+        ImmutableNode node = createDefaultNode(VALUE);
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put("newAttribute1", "value1");
+        attributes.put("newAttribute2", "value2");
+        ImmutableNode node2 = node.setAttributes(attributes);
+        assertEquals("Wrong number of attributes", attributes.size()
+                + node.getAttributes().size(), node2.getAttributes().size());
+        checkAttributesContained(node2, attributes);
+        checkAttributesContained(node2, node.getAttributes());
+    }
+
+    /**
+     * Helper method for testing whether a node contains all the attributes in
+     * the specified map.
+     *
+     * @param node the node to be checked
+     * @param attributes the map with expected attributes
+     */
+    private static void checkAttributesContained(ImmutableNode node,
+            Map<String, Object> attributes)
+    {
+        for (Map.Entry<String, Object> e : attributes.entrySet())
+        {
+            assertEquals("Wrong attribute value", e.getValue(), node
+                    .getAttributes().get(e.getKey()));
+        }
+    }
+
+    /**
+     * Helper method for testing a setAttributes() operation which has no
+     * effect.
+     *
+     * @param attributes the map with attributes
+     */
+    private void checkSetAttributesNoOp(Map<String, Object> attributes)
+    {
+        ImmutableNode node = createDefaultNode(VALUE);
+        assertSame("Node was changed", node, node.setAttributes(attributes));
+    }
+
+    /**
+     * Tests setAttributes() if an empty map is passed in.
+     */
+    @Test
+    public void testSetAttributesEmpty()
+    {
+        checkSetAttributesNoOp(new HashMap<String, Object>());
+    }
+
+    /**
+     * Tests setAttributes() for null input.
+     */
+    @Test
+    public void testSetAttributesNull()
+    {
+        checkSetAttributesNoOp(null);
+    }
+
+    /**
      * Tests whether an existing attribute can be removed.
      */
     @Test
@@ -513,4 +605,35 @@ public class TestImmutableNode
         ImmutableNode node = createDefaultNode(VALUE);
         assertSame("Got different instance", node, node.removeAttribute(ATTR));
     }
+
+    /**
+     * Tests whether all children can be replaced at once.
+     */
+    @Test
+    public void testReplaceChildren()
+    {
+        final int childCount = 8;
+        Collection<ImmutableNode> newChildren =
+                new ArrayList<ImmutableNode>(childCount);
+        for (int i = 0; i < childCount; i++)
+        {
+            newChildren.add(createChild());
+        }
+        ImmutableNode node = createDefaultNode(VALUE);
+        ImmutableNode node2 = node.replaceChildren(newChildren);
+        checkUpdatedNode(node, node2);
+        checkChildNodes(node2, newChildren);
+    }
+
+    /**
+     * Tests whether a node's children can be replaced by a null collection.
+     */
+    @Test
+    public void testReplaceChildrenNullCollection()
+    {
+        ImmutableNode node = createDefaultNode(VALUE);
+        ImmutableNode node2 = node.replaceChildren(null);
+        checkUpdatedNode(node, node2);
+        checkChildNodes(node2);
+    }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestMergeCombiner.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestMergeCombiner.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestMergeCombiner.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestMergeCombiner.java Sun Apr 20 19:32:08 2014
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertNul
 
 import java.util.List;
 
+import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.ex.ConfigurationException;
 import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
@@ -51,7 +52,7 @@ public class TestMergeCombiner extends A
     @Test
     public void testSimpleValues() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong number of bgcolors", 0, config
                 .getMaxIndex("gui.bgcolor"));
         assertEquals("Wrong bgcolor", "green", config.getString("gui.bgcolor"));
@@ -67,7 +68,7 @@ public class TestMergeCombiner extends A
     @Test
     public void testAttributes() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong value of min attribute", 1, config
                 .getInt("gui.level[@min]"));
         assertEquals("Wrong value of default attribute", 2, config
@@ -84,7 +85,7 @@ public class TestMergeCombiner extends A
     @Test
     public void testOverrideValues() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong user", "Admin", config
                 .getString("base.services.security.login.user"));
         assertEquals("Wrong user type", "default", config
@@ -101,7 +102,7 @@ public class TestMergeCombiner extends A
     @Test
     public void testListFromFirstStructure() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong number of services", 0, config
                 .getMaxIndex("net.service.url"));
         assertEquals("Wrong service", "http://service1.org", config
@@ -117,7 +118,7 @@ public class TestMergeCombiner extends A
     @Test
     public void testListFromSecondStructure() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong number of servers", 3, config
                 .getMaxIndex("net.server.url"));
         assertEquals("Wrong server", "http://testsvr.com", config
@@ -138,7 +139,7 @@ public class TestMergeCombiner extends A
     public void testMerge() throws ConfigurationException
     {
         //combiner.setDebugStream(System.out);
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         config.setExpressionEngine(new XPathExpressionEngine());
         assertEquals("Wrong number of Channels", 3, config.getMaxIndex("Channels/Channel"));
         assertEquals("Bad Channel 1 Name", "My Channel",
@@ -164,21 +165,25 @@ public class TestMergeCombiner extends A
      * @param config the config
      * @return the node for the table element
      */
-    private ConfigurationNode checkTable(HierarchicalConfiguration config)
+    private ImmutableNode checkTable(
+            HierarchicalConfiguration<ImmutableNode> config)
     {
-        assertEquals("Wrong number of tables", 1, config
-                .getMaxIndex("database.tables.table"));
-        HierarchicalConfiguration c = config
-                .configurationAt("database.tables.table(0)");
+        assertEquals("Wrong number of tables", 1,
+                config.getMaxIndex("database.tables.table"));
+        HierarchicalConfiguration<ImmutableNode> c =
+                config.configurationAt("database.tables.table(0)");
         assertEquals("Wrong table name", "documents", c.getString("name"));
-        assertEquals("Wrong number of fields", 2, c
-                .getMaxIndex("fields.field.name"));
-        assertEquals("Wrong field", "docname", c
-                .getString("fields.field(1).name"));
-
-        List<ConfigurationNode> nds = config.getExpressionEngine().query(config.getRootNode(),
-                "database.tables.table");
+        assertEquals("Wrong number of fields", 2,
+                c.getMaxIndex("fields.field.name"));
+        assertEquals("Wrong field", "docname",
+                c.getString("fields.field(1).name"));
+
+        List<QueryResult<ImmutableNode>> nds =
+                config.getExpressionEngine().query(config.getRootNode(),
+                        "database.tables.table",
+                        config.getNodeModel().getNodeHandler());
         assertFalse("No node found", nds.isEmpty());
-        return nds.get(0);
-    }
-}
\ No newline at end of file
+        assertFalse("Not a node result", nds.get(0).isAttributeResult());
+        return nds.get(0).getNode();
+   }
+}

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestNodeAddData.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestNodeAddData.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestNodeAddData.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestNodeAddData.java Sun Apr 20 19:32:08 2014
@@ -17,91 +17,91 @@
 package org.apache.commons.configuration.tree;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 /**
  * Test class for NodeAddData.
  *
- * @author <a
- * href="http://commons.apache.org/configuration/team-list.html">Commons
- * Configuration team</a>
  * @version $Id$
  */
 public class TestNodeAddData
 {
-    /** Constant for the default parent node used for testing. */
-    private static final ConfigurationNode TEST_PARENT = new DefaultConfigurationNode(
-            "parent");
-
     /** Constant for the name of the new node. */
     private static final String TEST_NODENAME = "testNewNode";
 
     /** Constant for the name of a path node. */
     private static final String PATH_NODE_NAME = "PATHNODE";
 
-    /** Constant for the number of path nodes to be added. */
-    private static final int PATH_NODE_COUNT = 10;
-
-    /** The object to be tested. */
-    NodeAddData addData;
+    /** A default parent node. */
+    private static ImmutableNode parentNode;
 
-    @Before
-    public void setUp() throws Exception
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception
     {
-        addData = new NodeAddData(TEST_PARENT, TEST_NODENAME);
+        parentNode = new ImmutableNode.Builder().name("testParent").create();
     }
 
     /**
-     * Tests the default values of an uninitialized instance.
+     * Tests whether the constructor can handle a null collection of path nodes.
      */
     @Test
-    public void testUninitialized()
+    public void testPathNodesNull()
     {
-        addData = new NodeAddData();
-        assertNull("A parent is set", addData.getParent());
-        assertNull("Node has a name", addData.getNewNodeName());
-        assertFalse("Attribute flag is set", addData.isAttribute());
-        assertTrue("Path nodes are not empty", addData.getPathNodes().isEmpty());
+        NodeAddData<ImmutableNode> data =
+                new NodeAddData<ImmutableNode>(parentNode, TEST_NODENAME,
+                        false, null);
+        assertTrue("Got path nodes", data.getPathNodes().isEmpty());
     }
 
     /**
-     * Tests the constructor that initializes the most important fields.
+     * Tests whether the collection with path nodes cannot be modified if no
+     * data is available.
      */
-    @Test
-    public void testInitialized()
+    @Test(expected = UnsupportedOperationException.class)
+    public void testPathNodesNullModify()
     {
-        assertSame("Wrong parent", TEST_PARENT, addData.getParent());
-        assertEquals("Wrong node name", TEST_NODENAME, addData.getNewNodeName());
-        assertFalse("Attribute flag is set", addData.isAttribute());
-        assertTrue("Path nodes are not empty", addData.getPathNodes().isEmpty());
+        NodeAddData<ImmutableNode> data =
+                new NodeAddData<ImmutableNode>(parentNode, TEST_NODENAME,
+                        false, null);
+        data.getPathNodes().add("test");
     }
 
     /**
-     * Tests adding path nodes.
+     * Tests whether a defensive copy of the collection with path nodes is
+     * created.
      */
     @Test
-    public void testAddPathNode()
+    public void testInitPathNodesDefensiveCopy()
     {
-        for (int i = 0; i < PATH_NODE_COUNT; i++)
-        {
-            addData.addPathNode(PATH_NODE_NAME + i);
-        }
-
-        List<String> nodes = addData.getPathNodes();
-        assertEquals("Incorrect number of path nodes", PATH_NODE_COUNT, nodes
+        List<String> pathNodes = new ArrayList<String>();
+        pathNodes.add(PATH_NODE_NAME);
+        NodeAddData<ImmutableNode> data =
+                new NodeAddData<ImmutableNode>(parentNode, TEST_NODENAME,
+                        false, pathNodes);
+        pathNodes.add("anotherNode");
+        assertEquals("Wrong number of path nodes", 1, data.getPathNodes()
                 .size());
-        for (int i = 0; i < PATH_NODE_COUNT; i++)
-        {
-            assertEquals("Wrong path node at position" + i, PATH_NODE_NAME + i,
-                    nodes.get(i));
-        }
+        assertEquals("Wrong path node", PATH_NODE_NAME, data.getPathNodes()
+                .get(0));
+    }
+
+    /**
+     * Tests that the collection with path nodes cannot be modified if data is
+     * available.
+     */
+    @Test(expected = UnsupportedOperationException.class)
+    public void testPathNodesDefinedModify()
+    {
+        NodeAddData<ImmutableNode> data =
+                new NodeAddData<ImmutableNode>(parentNode, TEST_NODENAME,
+                        false, Collections.singleton(PATH_NODE_NAME));
+        data.getPathNodes().add("anotherNode");
     }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestOverrideCombiner.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestOverrideCombiner.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestOverrideCombiner.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestOverrideCombiner.java Sun Apr 20 19:32:08 2014
@@ -18,10 +18,10 @@ package org.apache.commons.configuration
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import java.util.List;
 
+import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.ex.ConfigurationException;
 import org.junit.Test;
@@ -50,7 +50,7 @@ public class TestOverrideCombiner extend
     @Test
     public void testSimpleValues() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong number of bgcolors", 0, config
                 .getMaxIndex("gui.bgcolor"));
         assertEquals("Wrong bgcolor", "green", config.getString("gui.bgcolor"));
@@ -66,7 +66,7 @@ public class TestOverrideCombiner extend
     @Test
     public void testAttributes() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong value of min attribute", 1, config
                 .getInt("gui.level[@min]"));
         assertEquals("Wrong value of default attribute", 2, config
@@ -83,7 +83,7 @@ public class TestOverrideCombiner extend
     @Test
     public void testOverrideValues() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong user", "Admin", config
                 .getString("base.services.security.login.user"));
         assertEquals("Wrong user type", "default", config
@@ -101,7 +101,7 @@ public class TestOverrideCombiner extend
     @Test
     public void testListFromFirstStructure() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong number of services", 0, config
                 .getMaxIndex("net.service.url"));
         assertEquals("Wrong service", "http://service1.org", config
@@ -117,7 +117,7 @@ public class TestOverrideCombiner extend
     @Test
     public void testListFromSecondStructure() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong number of servers", 3, config
                 .getMaxIndex("net.server.url"));
         assertEquals("Wrong server", "http://testsvr.com", config
@@ -128,18 +128,16 @@ public class TestOverrideCombiner extend
      * Tests the combination of the table structure. Because the table node is
      * not declared as a list node the structures will be combined. But this
      * won't make any difference because the values in the first table override
-     * the values in the second table. Only the node for the table element will
-     * be a ViewNode.
+     * the values in the second table.
      */
     @Test
     public void testCombinedTableNoList() throws ConfigurationException
     {
-        ConfigurationNode tabNode = checkTable(createCombinedConfiguration());
-        assertTrue("Node is not a view node", tabNode instanceof ViewNode);
+        checkTable(createCombinedConfiguration());
     }
 
     /**
-     * Tests the combination of the table structure when the table node is
+     * Tests the combination of the table structure if the table node is
      * declared as a list node. In this case the first table structure
      * completely overrides the second and will be directly added to the
      * resulting structure.
@@ -148,8 +146,7 @@ public class TestOverrideCombiner extend
     public void testCombinedTableList() throws ConfigurationException
     {
         combiner.addListNode("table");
-        ConfigurationNode tabNode = checkTable(createCombinedConfiguration());
-        assertFalse("Node is a view node", tabNode instanceof ViewNode);
+        checkTable(createCombinedConfiguration());
     }
 
     /**
@@ -158,11 +155,11 @@ public class TestOverrideCombiner extend
      * @param config the config
      * @return the node for the table element
      */
-    private ConfigurationNode checkTable(HierarchicalConfiguration config)
+    private ImmutableNode checkTable(BaseHierarchicalConfiguration config)
     {
         assertEquals("Wrong number of tables", 0, config
                 .getMaxIndex("database.tables.table"));
-        HierarchicalConfiguration c = config
+        HierarchicalConfiguration<ImmutableNode> c = config
                 .configurationAt("database.tables.table");
         assertEquals("Wrong table name", "documents", c.getString("name"));
         assertEquals("Wrong number of fields", 2, c
@@ -170,9 +167,12 @@ public class TestOverrideCombiner extend
         assertEquals("Wrong field", "docname", c
                 .getString("fields.field(1).name"));
 
-        List<ConfigurationNode> nds = config.getExpressionEngine().query(config.getRootNode(),
-                "database.tables.table");
+        List<QueryResult<ImmutableNode>> nds =
+                config.getExpressionEngine().query(config.getRootNode(),
+                        "database.tables.table",
+                        config.getNodeModel().getNodeHandler());
         assertFalse("No node found", nds.isEmpty());
-        return nds.get(0);
+        assertFalse("An attribute result", nds.get(0).isAttributeResult());
+        return nds.get(0).getNode();
     }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestUnionCombiner.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestUnionCombiner.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestUnionCombiner.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/TestUnionCombiner.java Sun Apr 20 19:32:08 2014
@@ -19,7 +19,7 @@ package org.apache.commons.configuration
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
-import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.ex.ConfigurationException;
 import org.junit.Test;
 
@@ -47,7 +47,7 @@ public class TestUnionCombiner extends A
     @Test
     public void testSimpleValues() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Too few bgcolors", 1, config.getMaxIndex("gui.bgcolor"));
         assertEquals("Wrong first color", "green", config
                 .getString("gui.bgcolor(0)"));
@@ -65,7 +65,7 @@ public class TestUnionCombiner extends A
     @Test
     public void testSimpleValuesWithAttributes() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Too few level elements", 1, config
                 .getMaxIndex("gui.level"));
         assertEquals("Wrong value of first element", 1, config
@@ -86,13 +86,11 @@ public class TestUnionCombiner extends A
     @Test
     public void testAttributes() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
-        assertEquals("Too few attributes", 1, config
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
+        assertEquals("Wrong number of attributes", 0, config
                 .getMaxIndex("database.tables.table(0)[@id]"));
-        assertEquals("Wrong value of first attribute", 1, config
+        assertEquals("Wrong value of attribute", 1, config
                 .getInt("database.tables.table(0)[@id](0)"));
-        assertEquals("Wrong value of second attribute", 2, config
-                .getInt("database.tables.table(0)[@id](1)"));
     }
 
     /**
@@ -101,7 +99,7 @@ public class TestUnionCombiner extends A
     @Test
     public void testLists() throws ConfigurationException
     {
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Too few list elements", 2, config
                 .getMaxIndex("net.service.url"));
         assertEquals("Wrong first service", "http://service1.org", config
@@ -123,7 +121,7 @@ public class TestUnionCombiner extends A
     public void testTableList() throws ConfigurationException
     {
         combiner.addListNode("table");
-        HierarchicalConfiguration config = createCombinedConfiguration();
+        BaseHierarchicalConfiguration config = createCombinedConfiguration();
         assertEquals("Wrong name of first table", "documents", config
                 .getString("database.tables.table(0).name"));
         assertEquals("Wrong id of first table", 1, config

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/AbstractXPathTest.java Sun Apr 20 19:32:08 2014
@@ -19,9 +19,11 @@ package org.apache.commons.configuration
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.configuration.tree.ConfigurationNode;
-import org.apache.commons.configuration.tree.DefaultConfigurationNode;
+import org.apache.commons.configuration.tree.ImmutableNode;
+import org.apache.commons.configuration.tree.InMemoryNodeModel;
+import org.apache.commons.configuration.tree.NodeHandler;
 import org.apache.commons.jxpath.ri.model.NodeIterator;
+import org.apache.commons.jxpath.ri.model.NodePointer;
 import org.junit.After;
 import org.junit.Before;
 
@@ -30,9 +32,6 @@ import org.junit.Before;
  * creates a hierarchy of nodes in its setUp() method that can be used for test
  * cases.
  *
- * @author <a
- * href="http://commons.apache.org/configuration/team-list.html">Commons
- * Configuration team</a>
  * @version $Id$
  */
 public abstract class AbstractXPathTest
@@ -40,6 +39,9 @@ public abstract class AbstractXPathTest
     /** Constant for the name of the counter attribute. */
     protected static final String ATTR_NAME = "counter";
 
+    /** Constant for a name of an attribute of the root node. */
+    protected static final String ATTR_ROOT = "rootAttr";
+
     /** Constant for the name of the first child. */
     protected static final String CHILD_NAME1 = "subNode";
 
@@ -53,12 +55,16 @@ public abstract class AbstractXPathTest
     protected static final int LEVEL_COUNT = 3;
 
     /** Stores the root node of the hierarchy. */
-    protected ConfigurationNode root;
+    protected ImmutableNode root;
+
+    /** The node handler. */
+    protected NodeHandler<ImmutableNode> handler;
 
     @Before
     public void setUp() throws Exception
     {
         root = constructHierarchy(LEVEL_COUNT);
+        handler = new InMemoryNodeModel(root).getNodeHandler();
     }
 
     /**
@@ -75,16 +81,18 @@ public abstract class AbstractXPathTest
      * child nodes having the names {@code CHILD_NAME1} or
      * {@code CHILD_NAME2}. Their values are named like their parent
      * node with an additional index. Each node has an attribute with a counter
-     * value.
+     * value. The root node has a special attribute named {@value #ATTR_ROOT}
+     * with the value {@code true}.
      *
      * @param levels the number of levels in the hierarchy
      * @return the root node of the hierarchy
      */
-    protected ConfigurationNode constructHierarchy(int levels)
+    protected ImmutableNode constructHierarchy(int levels)
     {
-        ConfigurationNode result = new DefaultConfigurationNode();
-        createLevel(result, levels);
-        return result;
+        ImmutableNode.Builder resultBuilder = new ImmutableNode.Builder();
+        createLevel(resultBuilder, null, levels);
+        resultBuilder.addAttribute(ATTR_ROOT, String.valueOf(true));
+        return resultBuilder.create();
     }
 
     /**
@@ -111,19 +119,18 @@ public abstract class AbstractXPathTest
     }
 
     /**
-     * Returns a list with all configuration nodes contained in the specified
-     * iteration. It is assumed that the iteration contains only elements of
-     * this type.
+     * Returns a list with all node pointers contained in the specified
+     * iteration.
      *
      * @param iterator the iterator
-     * @return a list with configuration nodes obtained from the iterator
+     * @return a list with the node pointers obtained from the iterator
      */
-    protected List<ConfigurationNode> iterationElements(NodeIterator iterator)
+    protected List<NodePointer> iterationElements(NodeIterator iterator)
     {
-        List<ConfigurationNode> result = new ArrayList<ConfigurationNode>();
+        List<NodePointer> result = new ArrayList<NodePointer>();
         for (int pos = 1; iterator.setPosition(pos); pos++)
         {
-            result.add((ConfigurationNode) iterator.getNodePointer().getNode());
+            result.add(iterator.getNodePointer());
         }
         return result;
     }
@@ -131,25 +138,26 @@ public abstract class AbstractXPathTest
     /**
      * Recursive helper method for creating a level of the node hierarchy.
      *
-     * @param parent the parent node
+     * @param parentBuilder the builder for the parent node
+     * @param value the value of the parent node
      * @param level the level counter
      */
-    private void createLevel(ConfigurationNode parent, int level)
+    private void createLevel(ImmutableNode.Builder parentBuilder, String value,
+            int level)
     {
         if (level >= 0)
         {
-            String prefix = (parent.getValue() == null) ? "" : parent
-                    .getValue()
-                    + ".";
+            String prefix = (value == null) ? "" : value + ".";
             for (int i = 1; i <= CHILD_COUNT; i++)
             {
-                ConfigurationNode child = new DefaultConfigurationNode(
-                        (i % 2 == 0) ? CHILD_NAME1 : CHILD_NAME2, prefix + i);
-                parent.addChild(child);
-                child.addAttribute(new DefaultConfigurationNode(ATTR_NAME,
-                        String.valueOf(i)));
-
-                createLevel(child, level - 1);
+                ImmutableNode.Builder childBuilder =
+                        new ImmutableNode.Builder();
+                childBuilder.name((i % 2 == 0) ? CHILD_NAME1 : CHILD_NAME2);
+                String currentValue = prefix + i;
+                childBuilder.value(currentValue);
+                createLevel(childBuilder, currentValue, level - 1);
+                childBuilder.addAttribute(ATTR_NAME, String.valueOf(i));
+                parentBuilder.addChild(childBuilder.create());
             }
         }
     }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationIteratorAttributes.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationIteratorAttributes.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationIteratorAttributes.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationIteratorAttributes.java Sun Apr 20 19:32:08 2014
@@ -17,23 +17,22 @@
 package org.apache.commons.configuration.tree.xpath;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 
-import org.apache.commons.configuration.tree.ConfigurationNode;
-import org.apache.commons.configuration.tree.DefaultConfigurationNode;
+import org.apache.commons.configuration.tree.ImmutableNode;
 import org.apache.commons.jxpath.ri.QName;
 import org.apache.commons.jxpath.ri.model.NodePointer;
 import org.junit.Before;
 import org.junit.Test;
 
 /**
- * Test class for ConfigurationIteratorAttributes.
+ * Test class for {@code ConfigurationNodeIteratorAttributes}.
  *
- * @author <a
- * href="http://commons.apache.org/configuration/team-list.html">Commons
- * Configuration team</a>
  * @version $Id$
  */
 public class TestConfigurationIteratorAttributes extends AbstractXPathTest
@@ -42,7 +41,7 @@ public class TestConfigurationIteratorAt
     private static final String TEST_ATTR = "test";
 
     /** Stores the node pointer of the test node.*/
-    NodePointer pointer;
+    private ConfigurationNodePointer<ImmutableNode> pointer;
 
     @Override
     @Before
@@ -51,9 +50,11 @@ public class TestConfigurationIteratorAt
         super.setUp();
 
         // Adds further attributes to the test node
-        ConfigurationNode testNode = root.getChild(1);
-        testNode.addAttribute(new DefaultConfigurationNode(TEST_ATTR, "yes"));
-        pointer = new ConfigurationNodePointer(testNode, Locale.getDefault());
+        ImmutableNode orgNode = root.getChildren().get(1);
+        ImmutableNode testNode = orgNode.setAttribute(TEST_ATTR, "yes");
+        pointer =
+                new ConfigurationNodePointer<ImmutableNode>(testNode,
+                        Locale.getDefault(), handler);
     }
 
     /**
@@ -62,11 +63,18 @@ public class TestConfigurationIteratorAt
     @Test
     public void testIterateAllAttributes()
     {
-        ConfigurationNodeIteratorAttribute it = new ConfigurationNodeIteratorAttribute(pointer, new QName(null, "*"));
+        ConfigurationNodeIteratorAttribute<ImmutableNode> it =
+                new ConfigurationNodeIteratorAttribute<ImmutableNode>(pointer,
+                        new QName(null, "*"));
         assertEquals("Wrong number of attributes", 2, iteratorSize(it));
-        List<ConfigurationNode> attrs = iterationElements(it);
-        assertEquals("Wrong first attribute", ATTR_NAME, attrs.get(0).getName());
-        assertEquals("Wrong first attribute", TEST_ATTR, attrs.get(1).getName());
+        List<NodePointer> attrs = iterationElements(it);
+        Set<String> attrNames = new HashSet<String>();
+        for (NodePointer np : attrs)
+        {
+            attrNames.add(np.getName().getName());
+        }
+        assertTrue("First attribute not found", attrNames.contains(ATTR_NAME));
+        assertTrue("Second attribute not found", attrNames.contains(TEST_ATTR));
     }
 
     /**
@@ -75,9 +83,12 @@ public class TestConfigurationIteratorAt
     @Test
     public void testIterateSpecificAttribute()
     {
-        ConfigurationNodeIteratorAttribute it = new ConfigurationNodeIteratorAttribute(pointer, new QName(null, TEST_ATTR));
+        ConfigurationNodeIteratorAttribute<ImmutableNode> it =
+                new ConfigurationNodeIteratorAttribute<ImmutableNode>(pointer,
+                        new QName(null, TEST_ATTR));
         assertEquals("Wrong number of attributes", 1, iteratorSize(it));
-        assertEquals("Wrong attribute", TEST_ATTR, iterationElements(it).get(0).getName());
+        assertEquals("Wrong attribute", TEST_ATTR, iterationElements(it).get(0)
+                .getName().getName());
     }
 
     /**
@@ -86,18 +97,22 @@ public class TestConfigurationIteratorAt
     @Test
     public void testIterateUnknownAttribute()
     {
-        ConfigurationNodeIteratorAttribute it = new ConfigurationNodeIteratorAttribute(pointer, new QName(null, "unknown"));
+        ConfigurationNodeIteratorAttribute<ImmutableNode> it =
+                new ConfigurationNodeIteratorAttribute<ImmutableNode>(pointer,
+                        new QName(null, "unknown"));
         assertEquals("Found attributes", 0, iteratorSize(it));
     }
 
     /**
-     * Tests iteration when a namespace is specified. This is not supported, so
+     * Tests iteration if a namespace is specified. This is not supported, so
      * the iteration should be empty.
      */
     @Test
     public void testIterateNamespace()
     {
-        ConfigurationNodeIteratorAttribute it = new ConfigurationNodeIteratorAttribute(pointer, new QName("test", "*"));
+        ConfigurationNodeIteratorAttribute<ImmutableNode> it =
+                new ConfigurationNodeIteratorAttribute<ImmutableNode>(pointer,
+                        new QName("test", "*"));
         assertEquals("Found attributes", 0, iteratorSize(it));
     }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodeIteratorChildren.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodeIteratorChildren.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodeIteratorChildren.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodeIteratorChildren.java Sun Apr 20 19:32:08 2014
@@ -20,12 +20,10 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 
-import org.apache.commons.configuration.tree.ConfigurationNode;
-import org.apache.commons.configuration.tree.DefaultConfigurationNode;
+import org.apache.commons.configuration.tree.ImmutableNode;
 import org.apache.commons.jxpath.ri.Compiler;
 import org.apache.commons.jxpath.ri.QName;
 import org.apache.commons.jxpath.ri.compiler.NodeNameTest;
@@ -40,22 +38,21 @@ import org.junit.Test;
 /**
  * Test class for ConfigurationNodeIteratorChildren.
  *
- * @author <a
- * href="http://commons.apache.org/configuration/team-list.html">Commons
- * Configuration team</a>
  * @version $Id$
  */
 public class TestConfigurationNodeIteratorChildren extends AbstractXPathTest
 {
     /** Stores the node pointer to the root node. */
-    NodePointer rootPointer;
+    private ConfigurationNodePointer<ImmutableNode> rootPointer;
 
     @Override
     @Before
     public void setUp() throws Exception
     {
         super.setUp();
-        rootPointer = new ConfigurationNodePointer(root, Locale.getDefault());
+        rootPointer =
+                new ConfigurationNodePointer<ImmutableNode>(root,
+                        Locale.getDefault(), handler);
     }
 
     /**
@@ -64,11 +61,11 @@ public class TestConfigurationNodeIterat
     @Test
     public void testIterateAllChildren()
     {
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, null, false, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, null, false, null);
         assertEquals("Wrong number of elements", CHILD_COUNT, iteratorSize(it));
-        checkValues(it, new int[]
-        { 1, 2, 3, 4, 5 });
+        checkValues(it, 1, 2, 3, 4, 5);
     }
 
     /**
@@ -77,11 +74,11 @@ public class TestConfigurationNodeIterat
     @Test
     public void testIterateReverse()
     {
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, null, true, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, null, true, null);
         assertEquals("Wrong number of elements", CHILD_COUNT, iteratorSize(it));
-        checkValues(it, new int[]
-        { 5, 4, 3, 2, 1 });
+        checkValues(it, 5, 4, 3, 2, 1);
     }
 
     /**
@@ -91,8 +88,9 @@ public class TestConfigurationNodeIterat
     public void testIterateWithWildcardTest()
     {
         NodeNameTest test = new NodeNameTest(new QName(null, "*"));
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, test, false, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, test, false, null);
         assertEquals("Wrong number of elements", CHILD_COUNT, iteratorSize(it));
     }
 
@@ -104,8 +102,9 @@ public class TestConfigurationNodeIterat
     public void testIterateWithPrefixTest()
     {
         NodeNameTest test = new NodeNameTest(new QName("prefix", "*"));
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, test, false, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, test, false, null);
         assertNull("Undefined node pointer not returned", it.getNodePointer());
         assertEquals("Prefix was not evaluated", 0, iteratorSize(it));
     }
@@ -117,12 +116,13 @@ public class TestConfigurationNodeIterat
     public void testIterateWithNameTest()
     {
         NodeNameTest test = new NodeNameTest(new QName(null, CHILD_NAME2));
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, test, false, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, test, false, null);
         assertTrue("No children found", iteratorSize(it) > 0);
-        for (ConfigurationNode nd : iterationElements(it))
+        for (NodePointer nd : iterationElements(it))
         {
-            assertEquals("Wrong child element", CHILD_NAME2, nd.getName());
+            assertEquals("Wrong child element", CHILD_NAME2, nd.getName().getName());
         }
     }
 
@@ -134,8 +134,9 @@ public class TestConfigurationNodeIterat
     public void testIterateWithUnknownTest()
     {
         NodeTest test = new ProcessingInstructionTest("test");
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, test, false, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, test, false, null);
         assertEquals("Unknown test was not evaluated", 0, iteratorSize(it));
     }
 
@@ -146,8 +147,9 @@ public class TestConfigurationNodeIterat
     public void testIterateWithNodeType()
     {
         NodeTypeTest test = new NodeTypeTest(Compiler.NODE_TYPE_NODE);
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, test, false, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, test, false, null);
         assertEquals("Node type not evaluated", CHILD_COUNT, iteratorSize(it));
     }
 
@@ -159,8 +161,9 @@ public class TestConfigurationNodeIterat
     public void testIterateWithUnknownType()
     {
         NodeTypeTest test = new NodeTypeTest(Compiler.NODE_TYPE_COMMENT);
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, test, false, null);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, test, false, null);
         assertEquals("Unknown node type not evaluated", 0, iteratorSize(it));
     }
 
@@ -170,19 +173,22 @@ public class TestConfigurationNodeIterat
     @Test
     public void testIterateStartsWith()
     {
-        NodePointer childPointer = new ConfigurationNodePointer(rootPointer,
-                root.getChild(2));
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, null, false, childPointer);
+        ConfigurationNodePointer<ImmutableNode> childPointer =
+                new ConfigurationNodePointer<ImmutableNode>(rootPointer, root
+                        .getChildren().get(2), handler);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, null, false, childPointer);
         assertEquals("Wrong start position", 0, it.getPosition());
-        List<ConfigurationNode> nodes = iterationElements(it);
+        List<NodePointer> nodes = iterationElements(it);
         assertEquals("Wrong size of iteration", CHILD_COUNT - 3, nodes.size());
         int index = 4;
-        for (Iterator<ConfigurationNode> it2 = nodes.iterator(); it2.hasNext(); index++)
+        for (NodePointer np : nodes)
         {
-            ConfigurationNode node = it2.next();
-            assertEquals("Wrong node value", String.valueOf(index), node
-                    .getValue());
+            ImmutableNode node = (ImmutableNode) np.getImmediateNode();
+            assertEquals("Wrong node value", String.valueOf(index),
+                    node.getValue());
+            index++;
         }
     }
 
@@ -192,17 +198,18 @@ public class TestConfigurationNodeIterat
     @Test
     public void testIterateStartsWithReverse()
     {
-        NodePointer childPointer = new ConfigurationNodePointer(rootPointer,
-                root.getChild(3));
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, null, true, childPointer);
+        ConfigurationNodePointer<ImmutableNode> childPointer =
+                new ConfigurationNodePointer<ImmutableNode>(rootPointer, root
+                        .getChildren().get(3), handler);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, null, true, childPointer);
         int value = 3;
         for (int index = 1; it.setPosition(index); index++, value--)
         {
-            ConfigurationNode node = (ConfigurationNode) it.getNodePointer()
-                    .getNode();
-            assertEquals("Incorrect value at index " + index, String
-                    .valueOf(value), node.getValue());
+            ImmutableNode node = (ImmutableNode) it.getNodePointer().getNode();
+            assertEquals("Incorrect value at index " + index,
+                    String.valueOf(value), node.getValue());
         }
         assertEquals("Iteration ended not at end node", 0, value);
     }
@@ -214,14 +221,16 @@ public class TestConfigurationNodeIterat
     @Test
     public void testIterateStartsWithInvalid()
     {
-        NodePointer childPointer = new ConfigurationNodePointer(rootPointer,
-                new DefaultConfigurationNode("newNode"));
-        ConfigurationNodeIteratorChildren it = new ConfigurationNodeIteratorChildren(
-                rootPointer, null, false, childPointer);
+        ConfigurationNodePointer<ImmutableNode> childPointer =
+                new ConfigurationNodePointer<ImmutableNode>(rootPointer,
+                        new ImmutableNode.Builder().name("newNode").create(),
+                        handler);
+        ConfigurationNodeIteratorChildren<ImmutableNode> it =
+                new ConfigurationNodeIteratorChildren<ImmutableNode>(
+                        rootPointer, null, false, childPointer);
         assertEquals("Wrong size of iteration", CHILD_COUNT, iteratorSize(it));
         it.setPosition(1);
-        ConfigurationNode node = (ConfigurationNode) it.getNodePointer()
-                .getNode();
+        ImmutableNode node = (ImmutableNode) it.getNodePointer().getNode();
         assertEquals("Wrong start node", "1", node.getValue());
     }
 
@@ -234,12 +243,12 @@ public class TestConfigurationNodeIterat
      * @param iterator the iterator
      * @param expectedIndices an array with the expected indices
      */
-    private void checkValues(NodeIterator iterator, int[] expectedIndices)
+    private void checkValues(NodeIterator iterator, int... expectedIndices)
     {
-        List<ConfigurationNode> nodes = iterationElements(iterator);
+        List<NodePointer> nodes = iterationElements(iterator);
         for (int i = 0; i < expectedIndices.length; i++)
         {
-            ConfigurationNode child = nodes.get(i);
+            ImmutableNode child = (ImmutableNode) nodes.get(i).getImmediateNode();
             assertTrue("Wrong index value for child " + i, child.getValue()
                     .toString().endsWith(String.valueOf(expectedIndices[i])));
         }