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