You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@click.apache.org by sa...@apache.org on 2010/07/09 15:32:52 UTC

svn commit: r962521 - in /click/trunk/click: extras/src/org/apache/click/extras/panel/ framework/src/org/apache/click/ framework/src/org/apache/click/control/

Author: sabob
Date: Fri Jul  9 13:32:52 2010
New Revision: 962521

URL: http://svn.apache.org/viewvc?rev=962521&view=rev
Log:
Converted Behavior List to a Set. Renamed registerBehavior to registerAjaxTarget

Modified:
    click/trunk/click/extras/src/org/apache/click/extras/panel/TabbedPanel.java
    click/trunk/click/framework/src/org/apache/click/CallbackDispatcher.java
    click/trunk/click/framework/src/org/apache/click/ClickServlet.java
    click/trunk/click/framework/src/org/apache/click/Control.java
    click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java

Modified: click/trunk/click/extras/src/org/apache/click/extras/panel/TabbedPanel.java
URL: http://svn.apache.org/viewvc/click/trunk/click/extras/src/org/apache/click/extras/panel/TabbedPanel.java?rev=962521&r1=962520&r2=962521&view=diff
==============================================================================
--- click/trunk/click/extras/src/org/apache/click/extras/panel/TabbedPanel.java (original)
+++ click/trunk/click/extras/src/org/apache/click/extras/panel/TabbedPanel.java Fri Jul  9 13:32:52 2010
@@ -409,7 +409,7 @@ public class TabbedPanel extends Panel {
     @Override
     public void onInit() {
         if (hasBehaviors()) {
-            CallbackDispatcher.registerBehavior(this);
+            CallbackDispatcher.registerAjaxTarget(this);
         }
 
         initActivePanel();

Modified: click/trunk/click/framework/src/org/apache/click/CallbackDispatcher.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/src/org/apache/click/CallbackDispatcher.java?rev=962521&r1=962520&r2=962521&view=diff
==============================================================================
--- click/trunk/click/framework/src/org/apache/click/CallbackDispatcher.java (original)
+++ click/trunk/click/framework/src/org/apache/click/CallbackDispatcher.java Fri Jul  9 13:32:52 2010
@@ -27,7 +27,7 @@ import org.apache.click.service.LogServi
 import org.apache.commons.lang.Validate;
 
 /**
- * Provides a Control event callback dispatcher.
+ * Provides a registry for Controls.
  *
  * TODO: javadoc
  */
@@ -36,13 +36,13 @@ public class CallbackDispatcher {
     // Constants --------------------------------------------------------------
 
     /** The thread local dispatcher holder. */
-    private static final ThreadLocal<DispatcherStack> THREAD_LOCAL_DISPATCHER =
-                    new ThreadLocal<DispatcherStack>();
+    private static final ThreadLocal<RegistryStack> THREAD_LOCAL_REGISTRY =
+                    new ThreadLocal<RegistryStack>();
 
     // Variables --------------------------------------------------------------
 
-    /** The set of registered behavior enabled controls. */
-    Set<Control> behaviorEnabledControls;
+    /** The set of Ajax target controls. */
+    Set<Control> ajaxTargetControls;
 
     /** The list of registered callbacks. */
     List<CallbackHolder> callbacks;
@@ -58,9 +58,17 @@ public class CallbackDispatcher {
 
     // Public Methods ---------------------------------------------------------
 
-    public static void registerBehavior(Control control) {
+    /**
+     * Register the control to be processed by the ClickServlet if the control
+     * is the Ajax target. A control is an Ajax target if the
+     * {@link Control#isAjaxTarget(org.apache.click.Context)} method returns true.
+     * Target controls have their {@link Control#onProcess()} method invoked.
+     *
+     * @param control the control to register
+     */
+    public static void registerAjaxTarget(Control control) {
         CallbackDispatcher instance = getThreadLocalDispatcher();
-        instance.internalRegisterBehavior(control);
+        instance.internalRegisterAjaxTarget(control);
     }
 
     public static void registerCallback(Control control, Callback callback) {
@@ -89,19 +97,19 @@ public class CallbackDispatcher {
             getCallbacks().clear();
         }
 
-        if (hasBehaviorEnabledControls()) {
-            getBehaviorEnabledControls().clear();
+        if (hasAjaxTargetControls()) {
+            getAjaxTargetControls().clear();
         }
     }
 
     /**
-     * Register the behavior source control.
+     * Register the ajax target control.
      *
-     * @param source the behavior source control
+     * @param control the ajax target control
      */
-    void internalRegisterBehavior(Control source) {
-        Validate.notNull(source, "Null source parameter");
-        getBehaviorEnabledControls().add(source);
+    void internalRegisterAjaxTarget(Control control) {
+        Validate.notNull(control, "Null control parameter");
+        getAjaxTargetControls().add(control);
     }
 
     /**
@@ -118,10 +126,9 @@ public class CallbackDispatcher {
     }
 
     void processPreResponse(Context context) {
-        if (hasBehaviorEnabledControls()) {
-            for (Control control : getBehaviorEnabledControls()) {
-                List<Behavior> behaviors = control.getBehaviors();
-                for (Behavior behavior : behaviors) {
+        if (hasAjaxTargetControls()) {
+            for (Control control : getAjaxTargetControls()) {
+                for (Behavior behavior : control.getBehaviors()) {
                     behavior.preResponse(control);
                 }
             }
@@ -137,10 +144,9 @@ public class CallbackDispatcher {
     }
 
     void processPreGetHeadElements(Context context) {
-        if (hasBehaviorEnabledControls()) {
-            for (Control control : getBehaviorEnabledControls()) {
-                List<Behavior> behaviors = control.getBehaviors();
-                for (Behavior behavior : behaviors) {
+        if (hasAjaxTargetControls()) {
+            for (Control control : getAjaxTargetControls()) {
+                for (Behavior behavior : control.getBehaviors()) {
                     behavior.preGetHeadElements(control);
                 }
             }
@@ -156,10 +162,9 @@ public class CallbackDispatcher {
     }
 
     void processPreDestroy(Context context) {
-        if (hasBehaviorEnabledControls()) {
-            for (Control control : getBehaviorEnabledControls()) {
-                List<Behavior> behaviors = control.getBehaviors();
-                for (Behavior behavior : behaviors) {
+        if (hasAjaxTargetControls()) {
+            for (Control control : getAjaxTargetControls()) {
+                for (Behavior behavior : control.getBehaviors()) {
                     behavior.preDestroy(control);
                 }
             }
@@ -177,8 +182,8 @@ public class CallbackDispatcher {
     /**
      * Checks if any control callbacks have been registered.
      */
-    boolean hasBehaviorEnabledControls() {
-        if (behaviorEnabledControls == null || behaviorEnabledControls.isEmpty()) {
+    boolean hasAjaxTargetControls() {
+        if (ajaxTargetControls == null || ajaxTargetControls.isEmpty()) {
             return false;
         }
         return true;
@@ -189,11 +194,11 @@ public class CallbackDispatcher {
      *
      * @return the set of behavior enabled controls.
      */
-    Set<Control> getBehaviorEnabledControls() {
-        if (behaviorEnabledControls == null) {
-            behaviorEnabledControls = new LinkedHashSet<Control>();
+    Set<Control> getAjaxTargetControls() {
+        if (ajaxTargetControls == null) {
+            ajaxTargetControls = new LinkedHashSet<Control>();
         }
-        return behaviorEnabledControls;
+        return ajaxTargetControls;
     }
 
     /**
@@ -238,22 +243,22 @@ public class CallbackDispatcher {
      * @return the callbackDispatcher instance on top of the dispatcher stack
      */
     static CallbackDispatcher popThreadLocalDispatcher() {
-        DispatcherStack dispatcherStack = getDispatcherStack();
-        CallbackDispatcher callbackDispatcher = dispatcherStack.pop();
+        RegistryStack registryStack = getDispatcherStack();
+        CallbackDispatcher callbackDispatcher = registryStack.pop();
 
-        if (dispatcherStack.isEmpty()) {
-            THREAD_LOCAL_DISPATCHER.set(null);
+        if (registryStack.isEmpty()) {
+            THREAD_LOCAL_REGISTRY.set(null);
         }
 
         return callbackDispatcher;
     }
 
-    static DispatcherStack getDispatcherStack() {
-        DispatcherStack dispatcherStack = THREAD_LOCAL_DISPATCHER.get();
+    static RegistryStack getDispatcherStack() {
+        RegistryStack dispatcherStack = THREAD_LOCAL_REGISTRY.get();
 
         if (dispatcherStack == null) {
-            dispatcherStack = new DispatcherStack(2);
-            THREAD_LOCAL_DISPATCHER.set(dispatcherStack);
+            dispatcherStack = new RegistryStack(2);
+            THREAD_LOCAL_REGISTRY.set(dispatcherStack);
         }
 
         return dispatcherStack;
@@ -262,7 +267,7 @@ public class CallbackDispatcher {
     /**
      * Provides an unsynchronized Stack.
      */
-    static class DispatcherStack extends ArrayList<CallbackDispatcher> {
+    static class RegistryStack extends ArrayList<CallbackDispatcher> {
 
         /** Serialization version indicator. */
         private static final long serialVersionUID = 1L;
@@ -272,7 +277,7 @@ public class CallbackDispatcher {
          *
          * @param initialCapacity specify initial capacity of this stack
          */
-        private DispatcherStack(int initialCapacity) {
+        private RegistryStack(int initialCapacity) {
             super(initialCapacity);
         }
 

Modified: click/trunk/click/framework/src/org/apache/click/ClickServlet.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/src/org/apache/click/ClickServlet.java?rev=962521&r1=962520&r2=962521&view=diff
==============================================================================
--- click/trunk/click/framework/src/org/apache/click/ClickServlet.java (original)
+++ click/trunk/click/framework/src/org/apache/click/ClickServlet.java Fri Jul  9 13:32:52 2010
@@ -1810,7 +1810,7 @@ public class ClickServlet extends HttpSe
 
             // TODO: Ajax doesn't support forward. Is it still necessary to
             // check isForward?
-            if (callbackDispatcher.hasBehaviorEnabledControls() && !context.isForward()) {
+            if (callbackDispatcher.hasAjaxTargetControls() && !context.isForward()) {
 
                 // Perform onProcess for regsitered Ajax controls
                 processAjaxControls(context, eventDispatcher, callbackDispatcher);
@@ -1869,20 +1869,20 @@ public class ClickServlet extends HttpSe
 
         if (logger.isTraceEnabled()) {
             logger.trace("   the following controls have been registered as potential Ajax targets:");
-            if (callbackDispatcher.getBehaviorEnabledControls().isEmpty()) {
-                logger.trace("      *no* control has been registered");
-            } else {
-                for (Control control : callbackDispatcher.getBehaviorEnabledControls()) {
+            if (!callbackDispatcher.hasAjaxTargetControls()) {
+                for (Control control : callbackDispatcher.getAjaxTargetControls()) {
                     HtmlStringBuffer buffer = new HtmlStringBuffer();
                     String controlClassName = ClassUtils.getShortClassName(control.getClass());
                     buffer.append("      ").append(controlClassName);
                     buffer.append(": name='").append(control.getName()).append("'");
                     logger.trace(buffer.toString());
                 }
+            } else {
+                logger.trace("      *no* control has been registered");
             }
         }
 
-        for (Control control : callbackDispatcher.getBehaviorEnabledControls()) {
+        for (Control control : callbackDispatcher.getAjaxTargetControls()) {
 
             if (control.isAjaxTarget(context)) {
                 ajaxTarget = control;

Modified: click/trunk/click/framework/src/org/apache/click/Control.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/src/org/apache/click/Control.java?rev=962521&r1=962520&r2=962521&view=diff
==============================================================================
--- click/trunk/click/framework/src/org/apache/click/Control.java (original)
+++ click/trunk/click/framework/src/org/apache/click/Control.java Fri Jul  9 13:32:52 2010
@@ -21,6 +21,7 @@ package org.apache.click;
 import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.servlet.ServletContext;
 
@@ -469,16 +470,16 @@ public interface Control extends Seriali
      * <tt>Behavior</tt>s registered.
      *
      * @return <tt>true</tt> if this control has any
-     * <tt>Behavior</tt>s registered, <tt>false</tt> otherwise.
+     * <tt>Behavior</tt>s registered, <tt>false</tt> otherwise
      */
     public boolean hasBehaviors();
 
     /**
-     * Returns the list with all available behaviors for this control.
+     * Returns the list of behaviors for this control.
      *
-     * @return the list with this control's behaviors.
+     * @return the list with this control behaviors.
      */
-    public List<Behavior> getBehaviors();
+    public Set<Behavior> getBehaviors();
 
     /**
      * Returns <tt>true</tt> if this control is an AJAX target, <tt>false</tt>

Modified: click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java?rev=962521&r1=962520&r2=962521&view=diff
==============================================================================
--- click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java (original)
+++ click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java Fri Jul  9 13:32:52 2010
@@ -21,6 +21,7 @@ package org.apache.click.control;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -140,7 +141,7 @@ public abstract class AbstractControl im
     protected ActionListener actionListener;
 
     /** The control's list of {@link org.apache.click.Behavior behaviors}. */
-    protected List<Behavior> behaviors;
+    protected Set<Behavior> behaviors;
 
     /**
      * The list of page HTML HEAD elements including: Javascript imports,
@@ -251,16 +252,13 @@ public abstract class AbstractControl im
      * @param behavior the AJAX behavior
      */
     public void addBehavior(Behavior behavior) {
-        if (getBehaviors().contains(behavior)) {
-            return;
+        boolean added = getBehaviors().add(behavior);
+        if (added) {
+            // Register control here in case behavior was added *after* the onInit event.
+            // This can occur if the behavior is added in a listener event or during
+            // onRender.
+            CallbackDispatcher.registerAjaxTarget(this);
         }
-
-        getBehaviors().add(behavior);
-
-        // Register control here in case behavior was added *after* the onInit event.
-        // This can occur if the behavior is added in a listener event or during
-        // onRender.
-        CallbackDispatcher.registerBehavior(this);
     }
 
     /**
@@ -277,9 +275,9 @@ public abstract class AbstractControl im
      *
      * @return the list with this control's behaviors.
      */
-    public List<Behavior> getBehaviors() {
+    public Set<Behavior> getBehaviors() {
         if (behaviors == null) {
-            behaviors = new ArrayList<Behavior>();
+            behaviors = new HashSet<Behavior>();
         }
         return behaviors;
     }
@@ -594,7 +592,7 @@ public abstract class AbstractControl im
         //    to ensure this code is called *before* onProcess. Leaving the code
         //    here opens problems if subclass does not call super.onInit
         if (hasBehaviors()) {
-           CallbackDispatcher.registerBehavior(this);
+           CallbackDispatcher.registerAjaxTarget(this);
         }
     }