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


Reply via email to