Author: mgrigorov
Date: Tue Dec 20 14:48:29 2011
New Revision: 1221291

URL: http://svn.apache.org/viewvc?rev=1221291&view=rev
Log:
WICKET-1525
Ability to enable/disable AbstractAjaxTimerBehavior


Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxTimerBehaviorTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java?rev=1221291&r1=1221290&r2=1221291&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
 Tue Dec 20 14:48:29 2011
@@ -35,9 +35,6 @@ import org.apache.wicket.util.time.Durat
  */
 public abstract class AbstractAjaxTimerBehavior extends 
AbstractDefaultAjaxBehavior
 {
-       /**
-        * 
-        */
        private static final long serialVersionUID = 1L;
 
        /** The update interval */
@@ -63,14 +60,6 @@ public abstract class AbstractAjaxTimerB
        }
 
        /**
-        * Stops the timer
-        */
-       public final void stop()
-       {
-               stopped = true;
-       }
-
-       /**
         * Sets the update interval duration. This method should only be called 
within the
         * {@link #onTimer(AjaxRequestTarget)} method.
         * 
@@ -102,7 +91,7 @@ public abstract class AbstractAjaxTimerB
 
                WebRequest request = 
(WebRequest)RequestCycle.get().getRequest();
 
-               if (!stopped && (!headRendered || !request.isAjax()))
+               if (!isStopped() && (!headRendered || !request.isAjax()))
                {
                        headRendered = true;
                        
response.render(OnLoadHeaderItem.forScript(getJsTimeoutCall(updateInterval)));
@@ -128,24 +117,32 @@ public abstract class AbstractAjaxTimerB
        {
                CharSequence ajaxAttributes = 
renderAjaxAttributes(getComponent());
 
+               String timeoutHandle = getTimeoutHandle();
                // this might look strange, but it is necessary for IE not to 
leak :(
-               return "setTimeout('Wicket.Ajax.ajax(" + ajaxAttributes + ");', 
" +
+               return timeoutHandle+" = setTimeout('Wicket.Ajax.ajax(" + 
ajaxAttributes + ");', " +
                        updateInterval.getMilliseconds() + ")";
        }
 
        /**
+        * @return the name of the handle that is used to stop any scheduled 
timer
+        */
+       private String getTimeoutHandle() {
+               return "Wicket.timeoutHandle_"+getComponent().getMarkupId();
+       }
+       
+       /**
         * 
         * @see 
org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#respond(org.apache.wicket.ajax.AjaxRequestTarget)
         */
        @Override
        protected final void respond(final AjaxRequestTarget target)
        {
-               onTimer(target);
-
-               if (!stopped && isEnabled(getComponent()))
+               if (!isStopped() && isEnabled(getComponent()))
                {
+                       onTimer(target);
+
                        target.getHeaderResponse().render(
-                               
OnLoadHeaderItem.forScript(getJsTimeoutCall(updateInterval)));
+                       
OnLoadHeaderItem.forScript(getJsTimeoutCall(updateInterval)));
                }
        }
 
@@ -158,12 +155,35 @@ public abstract class AbstractAjaxTimerB
        protected abstract void onTimer(final AjaxRequestTarget target);
 
        /**
-        * @return {@code true} if has been stopped via {@link #stop()}
+        * @return {@code true} if has been stopped via {@link 
#stop(AjaxRequestTarget)}
         */
        public final boolean isStopped()
        {
                return stopped;
        }
 
+       /**
+        * Re-enables the timer if already stopped
+        *
+        * @param target
+        */
+       public final void restart(final AjaxRequestTarget target)
+       {
+               if (isStopped())
+               {
+                       stopped = false;
+                       headRendered = false;
+                       target.add(getComponent());
+               }
+       }
 
+       /**
+        * Stops the timer
+        */
+       public final void stop(final AjaxRequestTarget target)
+       {
+               stopped = true;
+               String timeoutHandle = getTimeoutHandle();
+               target.prependJavaScript("clearTimeout("+timeoutHandle+"); 
delete "+timeoutHandle+";");
+       }
 }

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxTimerBehaviorTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxTimerBehaviorTest.java?rev=1221291&r1=1221290&r2=1221291&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxTimerBehaviorTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxTimerBehaviorTest.java
 Tue Dec 20 14:48:29 2011
@@ -26,6 +26,7 @@ import org.apache.wicket.markup.html.Web
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.util.time.Duration;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -114,6 +115,89 @@ public class AjaxTimerBehaviorTest exten
        }
 
        /**
+        * Validates the response, then makes sure the timer injects itself 
again when called.
+        * Tests {@link AbstractAjaxTimerBehavior#restart(AjaxRequestTarget)} 
method
+
+        * WICKET-1525, WICKET-2152
+        */
+       public void testRestartMethod()
+       {
+               final Integer labelInitialValue = Integer.valueOf(0);
+
+               final Label label = new 
Label(MockPageWithLinkAndComponent.COMPONENT_ID,
+                       new Model<Integer>(labelInitialValue));
+
+               // the duration doesn't matter because we manually trigger the 
behavior
+               final AbstractAjaxTimerBehavior timerBehavior = new 
AbstractAjaxTimerBehavior(
+                       Duration.seconds(2))
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected void onTimer(AjaxRequestTarget target)
+                       {
+                               // increment the label's model object
+                               
label.setDefaultModelObject(((Integer)label.getDefaultModelObject()) + 1);
+                               target.add(label);
+                       }
+               };
+
+               final MockPageWithLinkAndComponent page = new 
MockPageWithLinkAndComponent();
+               page.add(label);
+               page.add(new 
AjaxLink<Void>(MockPageWithLinkAndComponent.LINK_ID)
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void onClick(AjaxRequestTarget target)
+                       {
+                               if (timerBehavior.isStopped())
+                               {
+                                       timerBehavior.restart(target);
+                               }
+                               else
+                               {
+                                       timerBehavior.stop(target);
+                               }
+                       }
+               });
+
+               label.setOutputMarkupId(true);
+               label.add(timerBehavior);
+
+               tester.startPage(page);
+
+               final String labelPath = 
MockPageWithLinkAndComponent.COMPONENT_ID;
+
+               // assert label == initial value (i.e. 0)
+               tester.assertLabel(labelPath, 
String.valueOf(labelInitialValue));
+
+               // increment to 1
+               tester.executeBehavior(timerBehavior);
+
+               // assert label == 1
+               tester.assertLabel(labelPath, String.valueOf(labelInitialValue 
+ 1));
+
+               // stop the timer
+               tester.clickLink(MockPageWithLinkAndComponent.LINK_ID);
+
+               // trigger it, but it is stopped
+               tester.executeBehavior(timerBehavior);
+
+               // assert label is still 1
+               tester.assertLabel(labelPath, String.valueOf(labelInitialValue 
+ 1));
+
+               // restart the timer
+               tester.clickLink(MockPageWithLinkAndComponent.LINK_ID);
+
+               // increment to 2
+               tester.executeBehavior(timerBehavior);
+
+               // assert label is now 2
+               tester.assertLabel(labelPath, String.valueOf(labelInitialValue 
+ 2));
+       }
+
+       /**
         * Validates the reponse, then makes sure the timer injects itself 
again when called.
         * 
         * @param timer


Reply via email to