Author: oheger
Date: Mon Nov  2 06:41:11 2009
New Revision: 831803

URL: http://svn.apache.org/viewvc?rev=831803&view=rev
Log:
Moved default implementation of visitor mechanism to NodeVisitorAdapter so that 
it can be better reused.

Modified:
    
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
    
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeVisitorAdapter.java

Modified: 
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java?rev=831803&r1=831802&r2=831803&view=diff
==============================================================================
--- 
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
 (original)
+++ 
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
 Mon Nov  2 06:41:11 2009
@@ -712,17 +712,7 @@
      */
     protected void visit(T node, NodeVisitor<T> visitor)
     {
-        if (!visitor.terminate())
-        {
-            visitor.visitBeforeChildren(node, getNodeHandler());
-
-            for (Iterator<T> it = 
getNodeHandler().getChildren(node).iterator(); it.hasNext() && 
!visitor.terminate();)
-            {
-                visit(it.next(), visitor);
-            }
-
-            visitor.visitAfterChildren(node, getNodeHandler());
-        }
+        NodeVisitorAdapter.visit(visitor, node, getNodeHandler());
     }
 
     /**

Modified: 
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeVisitorAdapter.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeVisitorAdapter.java?rev=831803&r1=831802&r2=831803&view=diff
==============================================================================
--- 
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeVisitorAdapter.java
 (original)
+++ 
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeVisitorAdapter.java
 Mon Nov  2 06:41:11 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.configuration2.expr;
 
+import java.util.Iterator;
+
 /**
  * <p>
  * A simple adapter class that simplifies writing custom node visitor
@@ -23,11 +25,20 @@
  * </p>
  * <p>
  * This class provides dummy implementations for the methods defined in the
- * <code>ConfigurationNodeVisitor</code> interface. Derived classes only need
- * to override the methods they really need.
+ * {...@link NodeVisitor} interface. Derived classes only need to override the
+ * methods they really need.
+ * </p>
+ * <p>
+ * In addition to the dummy implementations of the {...@link NodeVisitor} 
methods,
+ * this class also provides a static method that implements the default 
visiting
+ * mechanism: The {...@code visit()} method is passed a {...@code 
NodeVisitor}, a
+ * node, and a corresponding {...@code NodeHandler}. It then traverses the 
whole
+ * nodes structure and invokes the visitor for each encountered node.
  * </p>
  *
- * @author Oliver Heger
+ * @author <a
+ *         
href="http://commons.apache.org/configuration/team-list.html";>Commons
+ *         Configuration team</a>
  * @version $Id$
  * @param <T> the type of the involved nodes
  */
@@ -65,4 +76,34 @@
     public void visitBeforeChildren(T node, NodeHandler<T> handler)
     {
     }
+
+    /**
+     * Traverses the nodes structure below the specified root node and calls 
the
+     * visitor for each encountered node. If the {...@code terminate()} method 
of
+     * the visitor returns <b>true</b>, the visit operation is aborted. This
+     * method provides a default implementation of the visitor mechanism.
+     *
+     * @param <N> the type of the nodes involved
+     * @param visitor the visitor
+     * @param node the root node of the hierarchy
+     * @param handler the node handler
+     * @throws NullPointerException if a required parameter is missing
+     */
+    public static <N> void visit(NodeVisitor<N> visitor, N node,
+            NodeHandler<N> handler)
+    {
+        if (!visitor.terminate())
+        {
+            visitor.visitBeforeChildren(node, handler);
+
+            for (Iterator<N> it = handler.getChildren(node).iterator(); it
+                    .hasNext()
+                    && !visitor.terminate();)
+            {
+                visit(visitor, it.next(), handler);
+            }
+
+            visitor.visitAfterChildren(node, handler);
+        }
+    }
 }


Reply via email to