Author: ivaynberg Date: Thu Dec 16 19:43:04 2010 New Revision: 1050118 URL: http://svn.apache.org/viewvc?rev=1050118&view=rev Log: introduce ieventdispatcher so users can build their own event delivery mechanisms
Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/IEventDispatcher.java (with props) Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java wicket/trunk/wicket/src/main/java/org/apache/wicket/ComponentEventSender.java wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IFrameworkSettings.java wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/def/FrameworkSettings.java Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java?rev=1050118&r1=1050117&r2=1050118&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java Thu Dec 16 19:43:04 2010 @@ -4287,7 +4287,8 @@ public abstract class Component /** {...@inheritdoc} */ public final void send(IEventSink sink, Broadcast type, Object payload) { - new ComponentEventSender(this).send(sink, type, payload); + new ComponentEventSender(this, getApplication().getFrameworkSettings()).send(sink, type, + payload); } /** Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ComponentEventSender.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ComponentEventSender.java?rev=1050118&r1=1050117&r2=1050118&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/ComponentEventSender.java (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ComponentEventSender.java Thu Dec 16 19:43:04 2010 @@ -33,16 +33,21 @@ import org.apache.wicket.util.visit.Visi final class ComponentEventSender implements IEventSource { private final Component source; + private final IEventDispatcher dispatcher; /** * Constructor * * @param source * component that originated the event + * @param dispatcher */ - public ComponentEventSender(Component source) + public ComponentEventSender(Component source, IEventDispatcher dispatcher) { + Args.notNull(source, "source"); + Args.notNull(dispatcher, "dispatcher"); this.source = source; + this.dispatcher = dispatcher; } /** {...@inheritdoc} */ @@ -62,7 +67,7 @@ final class ComponentEventSender impleme depth(event); break; case EXACT : - event.getSink().onEvent(event); + dispatcher.dispatchEvent(event.getSink(), event); break; } } @@ -83,13 +88,13 @@ final class ComponentEventSender impleme if (!targetsComponent && !targetsCycle) { - sink.onEvent(event); + dispatcher.dispatchEvent(sink, event); return; } if (targetsApplication) { - source.getApplication().onEvent(event); + dispatcher.dispatchEvent(source.getApplication(), event); } if (event.isStop()) { @@ -97,7 +102,7 @@ final class ComponentEventSender impleme } if (targetsSession) { - source.getSession().onEvent(event); + dispatcher.dispatchEvent(source.getSession(), event); } if (event.isStop()) { @@ -105,7 +110,7 @@ final class ComponentEventSender impleme } if (targetsCycle) { - source.getRequestCycle().onEvent(event); + dispatcher.dispatchEvent(source.getRequestCycle(), event); } if (event.isStop()) { @@ -114,7 +119,7 @@ final class ComponentEventSender impleme Component cursor = (targetsCycle) ? cursor = source.getPage() : (Component)sink; - cursor.onEvent(event); + dispatcher.dispatchEvent(cursor, event); if (event.isStop()) { @@ -125,7 +130,7 @@ final class ComponentEventSender impleme if (cursor instanceof MarkupContainer) { - ((MarkupContainer)cursor).visitChildren(new ComponentEventVisitor(event)); + ((MarkupContainer)cursor).visitChildren(new ComponentEventVisitor(event, dispatcher)); } } @@ -146,7 +151,7 @@ final class ComponentEventSender impleme if (!targetsComponnet && !targetsCycle) { - sink.onEvent(event); + dispatcher.dispatchEvent(sink, event); return; } @@ -154,7 +159,7 @@ final class ComponentEventSender impleme if (cursor instanceof MarkupContainer) { - Visits.visitPostOrder(cursor, new ComponentEventVisitor(event)); + Visits.visitPostOrder(cursor, new ComponentEventVisitor(event, dispatcher)); } if (event.isStop()) { @@ -162,7 +167,7 @@ final class ComponentEventSender impleme } if (targetsCycle) { - source.getRequestCycle().onEvent(event); + dispatcher.dispatchEvent(source.getRequestCycle(), event); } if (event.isStop()) { @@ -170,7 +175,7 @@ final class ComponentEventSender impleme } if (targetsSession) { - source.getSession().onEvent(event); + dispatcher.dispatchEvent(source.getSession(), event); } if (event.isStop()) { @@ -178,7 +183,7 @@ final class ComponentEventSender impleme } if (targetsApplication) { - source.getApplication().onEvent(event); + dispatcher.dispatchEvent(source.getApplication(), event); } } @@ -199,19 +204,19 @@ final class ComponentEventSender impleme if (!targetsApplication && !targetsComponent) { - sink.onEvent(event); + dispatcher.dispatchEvent(sink, event); return; } if (targetsComponent) { Component cursor = (Component)sink; - cursor.onEvent(event); + dispatcher.dispatchEvent(cursor, event); if (event.isStop()) { return; } - cursor.visitParents(Component.class, new ComponentEventVisitor(event)); + cursor.visitParents(Component.class, new ComponentEventVisitor(event, dispatcher)); } if (event.isStop()) @@ -220,7 +225,7 @@ final class ComponentEventSender impleme } if (targetsCycle) { - source.getRequestCycle().onEvent(event); + dispatcher.dispatchEvent(source.getRequestCycle(), event); } if (event.isStop()) { @@ -228,7 +233,7 @@ final class ComponentEventSender impleme } if (targetsSession) { - source.getSession().onEvent(event); + dispatcher.dispatchEvent(source.getSession(), event); } if (event.isStop()) { @@ -236,7 +241,7 @@ final class ComponentEventSender impleme } if (targetsApplication) { - source.getApplication().onEvent(event); + dispatcher.dispatchEvent(source.getApplication(), event); } } @@ -248,6 +253,7 @@ final class ComponentEventSender impleme private static class ComponentEventVisitor implements IVisitor<Component, Void> { private final ComponentEvent<?> e; + private final IEventDispatcher dispatcher; /** * Constructor @@ -255,15 +261,16 @@ final class ComponentEventSender impleme * @param event * event to send */ - private ComponentEventVisitor(ComponentEvent<?> event) + private ComponentEventVisitor(ComponentEvent<?> event, IEventDispatcher dispatcher) { e = event; + this.dispatcher = dispatcher; } /** {...@inheritdoc} */ public void component(Component object, IVisit<Void> visit) { - object.onEvent(e); + dispatcher.dispatchEvent(object, e); if (e.isStop()) { Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/IEventDispatcher.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/IEventDispatcher.java?rev=1050118&view=auto ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/IEventDispatcher.java (added) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/IEventDispatcher.java Thu Dec 16 19:43:04 2010 @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket; + +import org.apache.wicket.event.IEvent; +import org.apache.wicket.event.IEventSink; +import org.apache.wicket.settings.IFrameworkSettings; + +/** + * Delivers an event to a component. Developers can implement and register their dispatchers in + * {...@link IFrameworkSettings} to create custom strategies for how events get delivered to components + * + * @author Igor Vaynberg (ivaynberg) + */ +public interface IEventDispatcher +{ + /** + * Dispatches the even to the target component + * + * @param sink + * @param event + */ + void dispatchEvent(IEventSink sink, IEvent<?> event); +} Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/IEventDispatcher.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IFrameworkSettings.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IFrameworkSettings.java?rev=1050118&r1=1050117&r2=1050118&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IFrameworkSettings.java (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IFrameworkSettings.java Thu Dec 16 19:43:04 2010 @@ -17,13 +17,14 @@ package org.apache.wicket.settings; import org.apache.wicket.IDetachListener; +import org.apache.wicket.IEventDispatcher; /** * Framework settings for retrieving and configuring framework settings. * * @author Martijn Dashorst */ -public interface IFrameworkSettings +public interface IFrameworkSettings extends IEventDispatcher { /** * Gets the Wicket version. The Wicket version is in the same format as the version element in @@ -52,4 +53,12 @@ public interface IFrameworkSettings * listener or <code>null</code> to remove */ public void setDetachListener(IDetachListener listener); + + /** + * Registers a new event dispatcher + * + * @param dispatcher + */ + public void add(IEventDispatcher dispatcher); + } Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/def/FrameworkSettings.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/def/FrameworkSettings.java?rev=1050118&r1=1050117&r2=1050118&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/def/FrameworkSettings.java (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/def/FrameworkSettings.java Thu Dec 16 19:43:04 2010 @@ -16,8 +16,15 @@ */ package org.apache.wicket.settings.def; +import java.util.ArrayList; +import java.util.List; + import org.apache.wicket.IDetachListener; +import org.apache.wicket.IEventDispatcher; +import org.apache.wicket.event.IEvent; +import org.apache.wicket.event.IEventSink; import org.apache.wicket.settings.IFrameworkSettings; +import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.string.Strings; /** @@ -33,6 +40,7 @@ import org.apache.wicket.util.string.Str public class FrameworkSettings implements IFrameworkSettings { private IDetachListener detachListener; + private List<IEventDispatcher> eventDispatchers = null; /** * @see org.apache.wicket.settings.IFrameworkSettings#getVersion() @@ -63,4 +71,36 @@ public class FrameworkSettings implement { this.detachListener = detachListener; } + + public void add(IEventDispatcher dispatcher) + { + Args.notNull(dispatcher, "dispatcher"); + if (eventDispatchers == null) + { + eventDispatchers = new ArrayList<IEventDispatcher>(); + } + if (!eventDispatchers.contains(dispatcher)) + { + eventDispatchers.add(dispatcher); + } + } + + /** + * Dispatches event to registered dispatchers + */ + public void dispatchEvent(IEventSink sink, IEvent<?> event) + { + // direct delivery + sink.onEvent(event); + + // additional dispatchers delivery + if (eventDispatchers == null) + { + return; + } + for (IEventDispatcher dispatcher : eventDispatchers) + { + dispatcher.dispatchEvent(sink, event); + } + } }