Author: oheger
Date: Fri Feb  7 20:36:22 2014
New Revision: 1565797

URL: http://svn.apache.org/r1565797
Log:
Reworked ConfigurationNodePointer to use a NodeHandler.

The pointer can now handle arbitrary nodes for which a NodeHandler
implementation exists.

Modified:
    
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/xpath/ConfigurationNodePointer.java
    
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodePointer.java

Modified: 
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/xpath/ConfigurationNodePointer.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/xpath/ConfigurationNodePointer.java?rev=1565797&r1=1565796&r2=1565797&view=diff
==============================================================================
--- 
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/xpath/ConfigurationNodePointer.java
 (original)
+++ 
commons/proper/configuration/branches/immutableNodes/src/main/java/org/apache/commons/configuration/tree/xpath/ConfigurationNodePointer.java
 Fri Feb  7 20:36:22 2014
@@ -16,10 +16,8 @@
  */
 package org.apache.commons.configuration.tree.xpath;
 
-import java.util.List;
 import java.util.Locale;
 
-import org.apache.commons.configuration.tree.ConfigurationNode;
 import org.apache.commons.configuration.tree.NodeHandler;
 import org.apache.commons.jxpath.ri.Compiler;
 import org.apache.commons.jxpath.ri.QName;
@@ -37,10 +35,8 @@ import org.apache.commons.jxpath.ri.mode
  * </p>
  *
  * @since 1.3
- * @author <a
- * href="http://commons.apache.org/configuration/team-list.html";>Commons
- * Configuration team</a>
  * @version $Id$
+ * @param <T> the type of the nodes this pointer deals with
  */
 class ConfigurationNodePointer<T> extends NodePointer
 {
@@ -49,26 +45,26 @@ class ConfigurationNodePointer<T> extend
      */
     private static final long serialVersionUID = -1087475639680007713L;
 
-    /** Stores the associated configuration node. */
-    private ConfigurationNode node;
+    /** The node handler. */
+    private final NodeHandler<T> handler;
+
+    /** Stores the associated node. */
+    private final T node;
 
     /**
-     * Creates a new instance of {@code ConfigurationNodePointer}.
+     * Creates a new instance of {@code ConfigurationNodePointer} pointing to
+     * the specified node.
      *
-     * @param node the node
+     * @param node the wrapped node
      * @param locale the locale
+     * @param handler the {@code NodeHandler}
      */
-    public ConfigurationNodePointer(ConfigurationNode node, Locale locale)
+    public ConfigurationNodePointer(T node, Locale locale,
+            NodeHandler<T> handler)
     {
         super(null, locale);
         this.node = node;
-    }
-
-    public ConfigurationNodePointer(T node, Locale locale, NodeHandler<T> 
handler)
-    {
-        super(null, locale);
-        //TODO implementation
-        throw new UnsupportedOperationException("Not yet implemented!");
+        this.handler = handler;
     }
 
     /**
@@ -77,19 +73,14 @@ class ConfigurationNodePointer<T> extend
      *
      * @param parent the parent pointer
      * @param node the associated node
+     * @param handler the {@code NodeHandler}
      */
-    public ConfigurationNodePointer(NodePointer parent, ConfigurationNode node)
-    {
-        super(parent);
-        this.node = node;
-    }
-
     public ConfigurationNodePointer(ConfigurationNodePointer<T> parent, T node,
             NodeHandler<T> handler)
     {
         super(parent);
-        // TODO implementation
-        throw new UnsupportedOperationException("Not yet implemented!");
+        this.node = node;
+        this.handler = handler;
     }
 
     /**
@@ -101,7 +92,7 @@ class ConfigurationNodePointer<T> extend
     @Override
     public boolean isLeaf()
     {
-        return node.getChildrenCount() < 1;
+        return getNodeHandler().getChildrenCount(node, null) < 1;
     }
 
     /**
@@ -127,15 +118,15 @@ class ConfigurationNodePointer<T> extend
     }
 
     /**
-     * Checks whether this node pointer refers to an attribute node. This 
method
-     * checks the attribute flag of the associated configuration node.
+     * Checks whether this node pointer refers to an attribute node. This is
+     * not the case.
      *
      * @return the attribute flag
      */
     @Override
     public boolean isAttribute()
     {
-        return node.isAttribute();
+        return false;
     }
 
     /**
@@ -146,7 +137,7 @@ class ConfigurationNodePointer<T> extend
     @Override
     public QName getName()
     {
-        return new QName(null, node.getName());
+        return new QName(null, getNodeHandler().nodeName(node));
     }
 
     /**
@@ -180,18 +171,19 @@ class ConfigurationNodePointer<T> extend
     @Override
     public Object getValue()
     {
-        return node.getValue();
+        return getNodeHandler().getValue(node);
     }
 
     /**
-     * Sets the value of this node.
+     * Sets the value of this node. This is not supported, so always an
+     * exception is thrown.
      *
      * @param value the new value
      */
     @Override
     public void setValue(Object value)
     {
-        node.setValue(value);
+        throw new UnsupportedOperationException("Node value cannot be set!");
     }
 
     /**
@@ -205,37 +197,22 @@ class ConfigurationNodePointer<T> extend
     public int compareChildNodePointers(NodePointer pointer1,
             NodePointer pointer2)
     {
-        ConfigurationNode node1 = (ConfigurationNode) pointer1.getBaseValue();
-        ConfigurationNode node2 = (ConfigurationNode) pointer2.getBaseValue();
+        Object node1 = pointer1.getBaseValue();
+        Object node2 = pointer2.getBaseValue();
 
-        // attributes will be sorted before child nodes
-        if (node1.isAttribute() && !node2.isAttribute())
-        {
-            return -1;
-        }
-        else if (node2.isAttribute() && !node1.isAttribute())
+        // sort based on the occurrence in the sub node list
+        for (T child : getNodeHandler().getChildren(node))
         {
-            return 1;
-        }
-
-        else
-        {
-            // sort based on the occurrence in the sub node list
-            List<ConfigurationNode> subNodes = node1.isAttribute() ? 
node.getAttributes() : node
-                    .getChildren();
-            for (ConfigurationNode child : subNodes)
+            if (child == node1)
             {
-                if (child == node1)
-                {
-                    return -1;
-                }
-                else if (child == node2)
-                {
-                    return 1;
-                }
+                return -1;
+            }
+            else if (child == node2)
+            {
+                return 1;
             }
-            return 0; // should not happen
         }
+        return 0; // should not happen
     }
 
     /**
@@ -247,7 +224,7 @@ class ConfigurationNodePointer<T> extend
     @Override
     public NodeIterator attributeIterator(QName name)
     {
-        return new ConfigurationNodeIteratorAttribute(this, name);
+        return new ConfigurationNodeIteratorAttribute<T>(this, name);
     }
 
     /**
@@ -262,8 +239,8 @@ class ConfigurationNodePointer<T> extend
     public NodeIterator childIterator(NodeTest test, boolean reverse,
             NodePointer startWith)
     {
-        return new ConfigurationNodeIteratorChildren(this, test, reverse,
-                startWith);
+        return new ConfigurationNodeIteratorChildren<T>(this, test, reverse,
+                castPointer(startWith));
     }
 
     /**
@@ -284,18 +261,39 @@ class ConfigurationNodePointer<T> extend
         return super.testNode(test);
     }
 
-    public NodeHandler<T> getNodeHandler() {
-        //TODO implementation
-        throw new UnsupportedOperationException("Not yet implemented!");
+    /**
+     * Returns the {@code NodeHandler} used by this instance.
+     *
+     * @return the {@code NodeHandler}
+     */
+    public NodeHandler<T> getNodeHandler()
+    {
+        return handler;
     }
 
     /**
      * Returns the wrapped configuration node.
-     * @return the wrapped configuration node
+     *
+     * @return the wrapped node
      */
     public T getConfigurationNode()
     {
-        //TODO implementation
-        throw new UnsupportedOperationException("Not yet implemented!");
+        return node;
+    }
+
+    /**
+     * Casts the given child pointer to a node pointer of this type. This is a
+     * bit dangerous. However, in a typical setup, child node pointers can only
+     * be created by this instance which ensures that they are of the correct
+     * type. Therefore, this cast is safe.
+     *
+     * @param p the {@code NodePointer} to cast
+     * @return the resulting {@code ConfigurationNodePointer}
+     */
+    private ConfigurationNodePointer<T> castPointer(NodePointer p)
+    {
+        @SuppressWarnings("unchecked") // see method comment
+        ConfigurationNodePointer<T> result = (ConfigurationNodePointer<T>) p;
+        return result;
     }
 }

Modified: 
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodePointer.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodePointer.java?rev=1565797&r1=1565796&r2=1565797&view=diff
==============================================================================
--- 
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodePointer.java
 (original)
+++ 
commons/proper/configuration/branches/immutableNodes/src/test/java/org/apache/commons/configuration/tree/xpath/TestConfigurationNodePointer.java
 Fri Feb  7 20:36:22 2014
@@ -22,8 +22,7 @@ import static org.junit.Assert.assertTru
 
 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.QName;
 import org.apache.commons.jxpath.ri.model.NodeIterator;
 import org.apache.commons.jxpath.ri.model.NodePointer;
@@ -31,24 +30,23 @@ import org.junit.Before;
 import org.junit.Test;
 
 /**
- * Test class for ConfigurationNodePointer.
+ * Test class for {@code ConfigurationNodePointer}.
  *
- * @author <a
- * href="http://commons.apache.org/configuration/team-list.html";>Commons
- * Configuration team</a>
  * @version $Id$
  */
 public class TestConfigurationNodePointer extends AbstractXPathTest
 {
     /** Stores the node pointer to be tested. */
-    NodePointer pointer;
+    private ConfigurationNodePointer<ImmutableNode> pointer;
 
     @Override
     @Before
     public void setUp() throws Exception
     {
         super.setUp();
-        pointer = new ConfigurationNodePointer(root, Locale.getDefault());
+        pointer =
+                new ConfigurationNodePointer<ImmutableNode>(root,
+                        Locale.getDefault(), handler);
     }
 
     /**
@@ -57,8 +55,10 @@ public class TestConfigurationNodePointe
     @Test
     public void testCompareChildNodePointersChildren()
     {
-        NodePointer p1 = new ConfigurationNodePointer(pointer, 
root.getChild(1));
-        NodePointer p2 = new ConfigurationNodePointer(pointer, 
root.getChild(3));
+        NodePointer p1 = new ConfigurationNodePointer<ImmutableNode>(
+                pointer, root.getChildren().get(1), handler);
+        NodePointer p2 = new ConfigurationNodePointer<ImmutableNode>(
+                pointer, root.getChildren().get(3), handler);
         assertEquals("Incorrect order", -1, pointer.compareChildNodePointers(
                 p1, p2));
         assertEquals("Incorrect symmetric order", 1, pointer
@@ -66,52 +66,23 @@ public class TestConfigurationNodePointe
     }
 
     /**
-     * Tests comparing child node pointers for attribute nodes.
+     * Tests whether a comparison of child node pointers handle the case that
+     * the child nodes are unknown. (This should not happen in practice.)
      */
     @Test
     public void testCompareChildNodePointersAttributes()
     {
-        root.addAttribute(new DefaultConfigurationNode("attr1", "test1"));
-        root.addAttribute(new DefaultConfigurationNode("attr2", "test2"));
-        NodePointer p1 = new ConfigurationNodePointer(pointer, root
-                .getAttribute(0));
-        NodePointer p2 = new ConfigurationNodePointer(pointer, root
-                .getAttribute(1));
-        assertEquals("Incorrect order", -1, pointer.compareChildNodePointers(
-                p1, p2));
-        assertEquals("Incorrect symmetric order", 1, pointer
-                .compareChildNodePointers(p2, p1));
-    }
-
-    /**
-     * tests comparing child node pointers for both child and attribute nodes.
-     */
-    @Test
-    public void testCompareChildNodePointersChildAndAttribute()
-    {
-        root.addAttribute(new DefaultConfigurationNode("attr1", "test1"));
-        NodePointer p1 = new ConfigurationNodePointer(pointer, 
root.getChild(2));
-        NodePointer p2 = new ConfigurationNodePointer(pointer, root
-                .getAttribute(0));
-        assertEquals("Incorrect order for attributes", 1, pointer
-                .compareChildNodePointers(p1, p2));
-        assertEquals("Incorrect symmetric order for attributes", -1, pointer
-                .compareChildNodePointers(p2, p1));
-    }
-
-    /**
-     * Tests comparing child node pointers for child nodes that do not belong 
to
-     * the parent node.
-     */
-    @Test
-    public void testCompareChildNodePointersInvalidChildren()
-    {
-        ConfigurationNode node = root.getChild(1);
-        NodePointer p1 = new ConfigurationNodePointer(pointer, 
node.getChild(1));
-        NodePointer p2 = new ConfigurationNodePointer(pointer, 
node.getChild(3));
-        assertEquals("Non child nodes could be sorted", 0, pointer
-                .compareChildNodePointers(p1, p2));
-        assertEquals("Non child nodes could be sorted symmetrically", 0,
+        ImmutableNode n1 = new ImmutableNode.Builder().name("n1").create();
+        ImmutableNode n2 = new ImmutableNode.Builder().name("n2").create();
+        NodePointer p1 =
+                new ConfigurationNodePointer<ImmutableNode>(pointer, n1,
+                        handler);
+        NodePointer p2 =
+                new ConfigurationNodePointer<ImmutableNode>(pointer, n2,
+                        handler);
+        assertEquals("Incorrect order", 0,
+                pointer.compareChildNodePointers(p1, p2));
+        assertEquals("Incorrect symmetric order", 0,
                 pointer.compareChildNodePointers(p2, p1));
     }
 
@@ -121,11 +92,7 @@ public class TestConfigurationNodePointe
     @Test
     public void testIsAttribute()
     {
-        ConfigurationNode node = new DefaultConfigurationNode("test", 
"testval");
-        NodePointer p = new ConfigurationNodePointer(pointer, node);
-        assertFalse("Node is an attribute", p.isAttribute());
-        node.setAttribute(true);
-        assertTrue("Node is no attribute", p.isAttribute());
+        assertFalse("Node is an attribute", pointer.isAttribute());
     }
 
     /**
@@ -135,16 +102,20 @@ public class TestConfigurationNodePointe
     public void testIsLeave()
     {
         assertFalse("Root node is leaf", pointer.isLeaf());
+    }
 
-        NodePointer p = pointer;
-        while (!p.isLeaf())
-        {
-            ConfigurationNode node = (ConfigurationNode) p.getNode();
-            assertTrue("Node has no children", node.getChildrenCount() > 0);
-            p = new ConfigurationNodePointer(p, node.getChild(0));
-        }
-        assertTrue("Node has children", ((ConfigurationNode) p.getNode())
-                .getChildrenCount() == 0);
+    /**
+     * Tests the leaf flag for a real leaf node.
+     */
+    @Test
+    public void testIsLeafTrue()
+    {
+        ImmutableNode leafNode =
+                new ImmutableNode.Builder().name("leafNode").create();
+        pointer =
+                new ConfigurationNodePointer<ImmutableNode>(pointer, leafNode,
+                        handler);
+        assertTrue("Not a leaf node", pointer.isLeaf());
     }
 
     /**
@@ -163,29 +134,37 @@ public class TestConfigurationNodePointe
      */
     private void checkIterators(NodePointer p)
     {
-        ConfigurationNode node = (ConfigurationNode) p.getNode();
+        ImmutableNode node = (ImmutableNode) p.getNode();
         NodeIterator it = p.childIterator(null, false, null);
         assertEquals("Iterator count differs from children count", node
-                .getChildrenCount(), iteratorSize(it));
+                .getChildren().size(), iteratorSize(it));
 
         for (int index = 1; it.setPosition(index); index++)
         {
             NodePointer pchild = it.getNodePointer();
-            assertEquals("Wrong child", node.getChild(index - 1), pchild
-                    .getNode());
+            assertEquals("Wrong child", node.getChildren().get(index - 1),
+                    pchild.getNode());
             checkIterators(pchild);
         }
 
         it = p.attributeIterator(new QName(null, "*"));
         assertEquals("Iterator count differs from attribute count", node
-                .getAttributeCount(), iteratorSize(it));
+                .getAttributes().size(), iteratorSize(it));
         for (int index = 1; it.setPosition(index); index++)
         {
             NodePointer pattr = it.getNodePointer();
             assertTrue("Node pointer is no attribute", pattr.isAttribute());
-            assertEquals("Wrong attribute", node.getAttribute(index - 1), pattr
-                    .getNode());
-            checkIterators(pattr);
+            assertTrue("Wrong attribute name", node.getAttributes()
+                    .containsKey(pattr.getName().getName()));
         }
     }
+
+    /**
+     * Tests that no new value can be set.
+     */
+    @Test(expected = UnsupportedOperationException.class)
+    public void testSetValue()
+    {
+        pointer.setValue("newValue");
+    }
 }


Reply via email to