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;
}