You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2010/09/29 19:09:33 UTC

svn commit: r1002740 - /wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/visit/Visits.java

Author: ivaynberg
Date: Wed Sep 29 17:09:33 2010
New Revision: 1002740

URL: http://svn.apache.org/viewvc?rev=1002740&view=rev
Log:
added #visit()

Modified:
    wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/visit/Visits.java

Modified: wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/visit/Visits.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/visit/Visits.java?rev=1002740&r1=1002739&r2=1002740&view=diff
==============================================================================
--- wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/visit/Visits.java (original)
+++ wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/visit/Visits.java Wed Sep 29 17:09:33 2010
@@ -1,5 +1,6 @@
 package org.apache.wicket.util.visit;
 
+import java.util.Collections;
 import java.util.Iterator;
 
 
@@ -14,6 +15,70 @@ public class Visits
 
 	}
 
+
+	private static class SingletonIterable<T> implements Iterable<T>
+	{
+		private final T singleton;
+
+		public SingletonIterable(T singleton)
+		{
+			this.singleton = singleton;
+		}
+
+		public Iterator<T> iterator()
+		{
+			return Collections.singleton(singleton).iterator();
+		}
+
+	}
+
+	/**
+	 * Visits container and its children pre-order (parent first). Children are determined by
+	 * calling {@link Iterable#iterator()}.
+	 * 
+	 * @param <S>
+	 *            the type of object that will be visited, notice that {@code container} is not
+	 *            declared as {@code Iterable<S>} because it may return a generalization of
+	 *            {@code S}
+	 * @param <R>
+	 *            the type of object that should be returned from the visitor, use {@link Void} if
+	 *            no return value is needed
+	 * @param container
+	 *            object whose children will be visited
+	 * @param visitor
+	 *            the visitor
+	 * @return return value from the {@code visitor} or {@code null} if none
+	 */
+	public static final <S, R> R visit(Iterable<? super S> container, final IVisitor<S, R> visitor)
+	{
+		return (R)visitChildren(new SingletonIterable(container), visitor, IVisitFilter.ANY);
+	}
+
+	/**
+	 * Visits container and its children pre-order (parent first). Children are determined by
+	 * calling {@link Iterable#iterator()}.
+	 * 
+	 * @param <S>
+	 *            the type of object that will be visited, notice that {@code container} is not
+	 *            declared as {@code Iterable<S>} because it may return a generalization of
+	 *            {@code S}
+	 * @param <R>
+	 *            the type of object that should be returned from the visitor, use {@link Void} if
+	 *            no return value is needed
+	 * @param container
+	 *            object whose children will be visited
+	 * @param visitor
+	 *            the visitor
+	 * @param filter
+	 *            filter used to limit the types of objects that will be visited
+	 * @return return value from the {@code visitor} or {@code null} if none
+	 */
+	public static final <S, R> R visit(Iterable<? super S> container, final IVisitor<S, R> visitor,
+		IVisitFilter filter)
+	{
+		return (R)visitChildren(new SingletonIterable(container), visitor, filter);
+	}
+
 	/**
 	 * Visits children of the specified {@link Iterable} pre-order (parent first). Children are
 	 * determined by calling {@link Iterable#iterator()}.
@@ -33,8 +98,8 @@ public class Visits
 	 *            filter used to limit the types of objects that will be visited
 	 * @return return value from the {@code visitor} or {@code null} if none
 	 */
-	public static final <S, R> R visitChildren(Iterable<?> container, final IVisitor<S, R> visitor,
-		IVisitFilter filter)
+	public static final <S, R> R visitChildren(Iterable<? super S> container,
+		final IVisitor<S, R> visitor, IVisitFilter filter)
 	{
 		Visit<R> visit = new Visit<R>();
 		visitChildren(container, visitor, filter, visit);
@@ -42,7 +107,7 @@ public class Visits
 	}
 
 
-	private static final <S, R> void visitChildren(Iterable<?> container,
+	private static final <S, R> void visitChildren(Iterable<? super S> container,
 		final IVisitor<S, R> visitor, IVisitFilter filter, Visit<R> visit)
 	{
 		if (visitor == null)
@@ -82,7 +147,7 @@ public class Visits
 				filter.visitChildren(child))
 			{
 				// visit the children in the container
-				visitChildren((Iterable<?>)child, visitor, filter, visit);
+				visitChildren((Iterable<? super S>)child, visitor, filter, visit);
 
 				if (visit.isStopped())
 				{
@@ -111,7 +176,8 @@ public class Visits
 	 *            the visitor
 	 * @return return value from the {@code visitor} or {@code null} if none
 	 */
-	public static final <S, R> R visitChildren(Iterable<?> container, final IVisitor<S, R> visitor)
+	public static final <S, R> R visitChildren(Iterable<? super S> container,
+		final IVisitor<S, R> visitor)
 	{
 		return visitChildren(container, visitor, IVisitFilter.ANY);
 	}
@@ -134,10 +200,10 @@ public class Visits
 	 *            the visitor
 	 * @return return value from the {@code visitor} or {@code null} if none
 	 */
-	public static final <S, R> R visitComponentsPostOrder(S root,
+	public static final <S, R> R visitPostOrder(S root,
 		final org.apache.wicket.util.visit.IVisitor<S, R> visitor)
 	{
-		return visitComponentsPostOrder(root, visitor, IVisitFilter.ANY);
+		return visitPostOrder(root, visitor, IVisitFilter.ANY);
 	}
 
 	/**
@@ -160,7 +226,7 @@ public class Visits
 	 *            filter used to limit the types of objects that will be visited
 	 * @return return value from the {@code visitor} or {@code null} if none
 	 */
-	public static final <S, R> R visitComponentsPostOrder(Object root,
+	public static final <S, R> R visitPostOrder(Object root,
 		final org.apache.wicket.util.visit.IVisitor<S, R> visitor, IVisitFilter filter)
 	{
 		if (visitor == null)
@@ -169,12 +235,12 @@ public class Visits
 		}
 
 		Visit<R> visit = new Visit<R>();
-		visitComponentsPostOrderHelper(root, visitor, filter, visit);
+		visitPostOrderHelper(root, visitor, filter, visit);
 		return visit.getResult();
 	}
 
 
-	private static final <S, R> void visitComponentsPostOrderHelper(Object component,
+	private static final <S, R> void visitPostOrderHelper(Object component,
 		final org.apache.wicket.util.visit.IVisitor<S, R> visitor, IVisitFilter filter,
 		Visit<R> visit)
 	{
@@ -188,7 +254,7 @@ public class Visits
 				for (final Iterator<?> iterator = ((Iterable<?>)component).iterator(); iterator.hasNext();)
 				{
 					final Object child = iterator.next();
-					visitComponentsPostOrderHelper(child, visitor, filter, childTraversal);
+					visitPostOrderHelper(child, visitor, filter, childTraversal);
 					if (childTraversal.isStopped())
 					{
 						visit.stop(childTraversal.getResult());