You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/03/01 16:33:34 UTC

git commit: WICKET-3805 Change Component#visitParents to enable visitors of any type

Updated Branches:
  refs/heads/master 428c22902 -> b62541426


WICKET-3805 Change Component#visitParents to enable visitors of any type


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b6254142
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b6254142
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b6254142

Branch: refs/heads/master
Commit: b625414266614649710e200884cd13c5e44242c7
Parents: 428c229
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Mar 1 17:33:10 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Mar 1 17:33:10 2012 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/wicket/Component.java |   44 +++++++++++++--
 .../org/apache/wicket/ComponentEventSender.java    |    6 +-
 .../test/java/org/apache/wicket/VisitorTest.java   |   37 ++++++++++++-
 .../markup/html/form/upload/UploadProgressBar.java |    5 +-
 .../panel/BreadCrumbParticipantDelegate.java       |    6 +-
 .../apache/wicket/util/visit/ClassVisitFilter.java |    6 +-
 6 files changed, 85 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b6254142/wicket-core/src/main/java/org/apache/wicket/Component.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java
index e8e3ac1..93e3ca2 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -84,7 +84,9 @@ import org.apache.wicket.util.string.ComponentStrings;
 import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.value.ValueMap;
+import org.apache.wicket.util.visit.ClassVisitFilter;
 import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitFilter;
 import org.apache.wicket.util.visit.IVisitor;
 import org.apache.wicket.util.visit.Visit;
 import org.slf4j.Logger;
@@ -3401,20 +3403,50 @@ public abstract class Component
 	}
 
 	/**
-	 * Traverses all parent components of the given class in this container, calling the visitor's
+	 * Traverses all parent components of the given class in this parentClass, calling the visitor's
 	 * visit method at each one.
 	 * 
 	 * @param <R>
-	 * @param c
+	 *     the type of the result object
+	 * @param parentClass
 	 *            Class
 	 * @param visitor
 	 *            The visitor to call at each parent of the given type
 	 * @return First non-null value returned by visitor callback
 	 */
-	public final <R> R visitParents(final Class<?> c, final IVisitor<Component, R> visitor)
+	public final <R, C extends MarkupContainer> R visitParents(final Class<C> parentClass, final IVisitor<C, R> visitor)
+	{
+		return visitParents(parentClass, visitor, new ClassVisitFilter<R>(null) {
+			@Override
+			public boolean visitObject(Object object)
+			{
+				return true;
+			}
+		});
+	}
+
+
+	/**
+	 * Traverses all parent components of the given class in this parentClass, calling the visitor's
+	 * visit method at each one.
+	 *
+	 * @param <R>
+	 *     the type of the result object
+	 * @param parentClass
+	 *            the class of the parent component
+	 * @param visitor
+	 *            The visitor to call at each parent of the given type
+	 * @param filter
+	 *      a filter that adds an additional logic to the condition whether a parent container matches
+	 * @return First non-null value returned by visitor callback
+	 * @see org.apache.wicket.util.visit.ClassVisitFilter
+	 */
+	public final <R, C extends MarkupContainer> R visitParents(final Class<C> parentClass, final IVisitor<C, R> visitor, ClassVisitFilter<R> filter)
 	{
+		Args.notNull(filter, "filter");
+
 		// Start here
-		Component current = getParent();
+		C current = (C) getParent();
 
 		Visit<R> visit = new Visit<R>();
 
@@ -3422,7 +3454,7 @@ public abstract class Component
 		while (current != null)
 		{
 			// Is current an instance of this class?
-			if (c.isInstance(current))
+			if (parentClass.isInstance(current) && filter.visitObject(current))
 			{
 				visitor.component(current, visit);
 				if (visit.isStopped())
@@ -3432,7 +3464,7 @@ public abstract class Component
 			}
 
 			// Check parent
-			current = current.getParent();
+			current = (C) current.getParent();
 		}
 		return null;
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/b6254142/wicket-core/src/main/java/org/apache/wicket/ComponentEventSender.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ComponentEventSender.java b/wicket-core/src/main/java/org/apache/wicket/ComponentEventSender.java
index ad17584..bfb2447 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ComponentEventSender.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ComponentEventSender.java
@@ -225,7 +225,7 @@ final class ComponentEventSender implements IEventSource
 			{
 				return;
 			}
-			cursor.visitParents(Component.class, new ComponentEventVisitor(event, dispatcher));
+			cursor.visitParents(MarkupContainer.class, new ComponentEventVisitor(event, dispatcher));
 		}
 
 		if (event.isStop())
@@ -281,7 +281,7 @@ final class ComponentEventSender implements IEventSource
 	 * 
 	 * @author igor
 	 */
-	private static class ComponentEventVisitor implements IVisitor<Component, Void>
+	private static class ComponentEventVisitor<T extends Component> implements IVisitor<T, Void>
 	{
 		private final ComponentEvent<?> e;
 		private final IEventDispatcher dispatcher;
@@ -302,7 +302,7 @@ final class ComponentEventSender implements IEventSource
 
 		/** {@inheritDoc} */
 		@Override
-		public void component(Component object, IVisit<Void> visit)
+		public void component(T object, IVisit<Void> visit)
 		{
 			dispatchToComponent(dispatcher, object, e);
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/b6254142/wicket-core/src/test/java/org/apache/wicket/VisitorTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/VisitorTest.java b/wicket-core/src/test/java/org/apache/wicket/VisitorTest.java
index 47db943..f1d7c0f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/VisitorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/VisitorTest.java
@@ -20,6 +20,7 @@ import junit.framework.Assert;
 
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.util.visit.ClassVisitFilter;
 import org.apache.wicket.util.visit.IVisit;
 import org.apache.wicket.util.visit.IVisitor;
 import org.apache.wicket.util.visit.Visits;
@@ -180,6 +181,40 @@ public class VisitorTest extends WicketTestCase
 		Assert.assertEquals("BCDEGH", path.toString());
 	}
 
+	/**
+	 * https://issues.apache.org/jira/browse/WICKET-3805
+	 *
+	 * Visit parents with arbitrary type
+	 */
+	public void testVisitParents()
+	{
+		TestContainer testContainer = new TestContainer();
+		IVisitor<MarkupContainer, MarkerInterface> visitor = new IVisitor<MarkupContainer, MarkerInterface>()
+		{
+			public void component(MarkupContainer object, IVisit<MarkerInterface> visit)
+			{
+				visit.stop((MarkerInterface) object);
+			}
+		};
+		MarkerInterface markedParent = testContainer.get("G:H").visitParents(MarkupContainer.class,
+			visitor, new ClassVisitFilter<MarkerInterface>(MarkerInterface.class));
+		assertEquals("G", markedParent.getId());
+	}
+
+	private static interface MarkerInterface
+	{
+		public String getId();
+	}
+
+	private static class MarkedWebMarkupContainer extends WebMarkupContainer
+		implements
+			MarkerInterface
+	{
+		public MarkedWebMarkupContainer(String id)
+		{
+			super(id);
+		}
+	}
 
 	private static class TestContainer extends WebMarkupContainer
 	{
@@ -193,7 +228,7 @@ public class VisitorTest extends WicketTestCase
 			WebMarkupContainer d = new WebMarkupContainer("D");
 			WebMarkupContainer e = new WebMarkupContainer("E");
 			WebMarkupContainer f = new WebMarkupContainer("F");
-			WebMarkupContainer g = new WebMarkupContainer("G");
+			WebMarkupContainer g = new MarkedWebMarkupContainer("G");
 			WebMarkupContainer h = new WebMarkupContainer("H");
 			add(b);
 			add(c);

http://git-wip-us.apache.org/repos/asf/wicket/blob/b6254142/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
index 344dbce..0399a95 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
@@ -19,7 +19,6 @@ package org.apache.wicket.extensions.ajax.markup.html.form.upload;
 import java.util.Formatter;
 
 import org.apache.wicket.Application;
-import org.apache.wicket.Component;
 import org.apache.wicket.IInitializer;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.markup.head.CssHeaderItem;
@@ -242,9 +241,9 @@ public class UploadProgressBar extends Panel
 	private Form<?> getCallbackForm()
 	{
 		Boolean insideModal = form.visitParents(ModalWindow.class,
-			new IVisitor<Component, Boolean>()
+			new IVisitor<ModalWindow, Boolean>()
 			{
-				public void component(final Component object, final IVisit<Boolean> visit)
+				public void component(final ModalWindow object, final IVisit<Boolean> visit)
 				{
 					visit.stop(true);
 				}

http://git-wip-us.apache.org/repos/asf/wicket/blob/b6254142/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java
index 31a3e47..ef90922 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java
@@ -96,10 +96,10 @@ public abstract class BreadCrumbParticipantDelegate implements IBreadCrumbPartic
 					if (c == null)
 					{
 						// not found... do a reverse search (upwards)
-						c = parent.visitParents(Component.class,
-							new IVisitor<Component, Component>()
+						c = parent.visitParents(MarkupContainer.class,
+							new IVisitor<MarkupContainer, Component>()
 							{
-								public void component(final Component component,
+								public void component(final MarkupContainer component,
 									final IVisit<Component> visit)
 								{
 									if (component.getId().equals(thisId))

http://git-wip-us.apache.org/repos/asf/wicket/blob/b6254142/wicket-util/src/main/java/org/apache/wicket/util/visit/ClassVisitFilter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/visit/ClassVisitFilter.java b/wicket-util/src/main/java/org/apache/wicket/util/visit/ClassVisitFilter.java
index e365c0b..c94e069 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/visit/ClassVisitFilter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/visit/ClassVisitFilter.java
@@ -21,9 +21,9 @@ package org.apache.wicket.util.visit;
  * 
  * @author igor.vaynberg
  */
-public class ClassVisitFilter implements IVisitFilter
+public class ClassVisitFilter<T> implements IVisitFilter
 {
-	private final Class<?> clazz;
+	private final Class<T> clazz;
 
 	/**
 	 * Constructor
@@ -31,7 +31,7 @@ public class ClassVisitFilter implements IVisitFilter
 	 * @param clazz
 	 *            class of objects that visitors should be restricted to
 	 */
-	public ClassVisitFilter(final Class<?> clazz)
+	public ClassVisitFilter(final Class<T> clazz)
 	{
 		this.clazz = clazz;
 	}