You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2010/08/21 08:09:56 UTC
svn commit: r987703 - in /wicket/trunk/wicket/src:
main/java/org/apache/wicket/ main/java/org/apache/wicket/page/
main/java/org/apache/wicket/request/component/
main/java/org/apache/wicket/request/handler/ test/java/org/apache/wicket/
Author: ivaynberg
Date: Sat Aug 21 06:09:56 2010
New Revision: 987703
URL: http://svn.apache.org/viewvc?rev=987703&view=rev
Log:
Issue: WICKET-2988
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/page/IManageablePage.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestablePage.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
wicket/trunk/wicket/src/test/java/org/apache/wicket/MockPage.java
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java?rev=987703&r1=987702&r2=987703&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java Sat Aug 21 06:09:56 2010
@@ -404,15 +404,10 @@ public abstract class Page extends Marku
dirty(false);
}
- /**
- * INTERNAL. Prevent marking page as dirty. Used to prevent incrementing page id during
- * REDIRECT_TO_RENDER rendering.
- *
- * @param prevent
- */
- private void preventDirty(boolean prevent)
+ /** {@inheritDoc} */
+ public void setFreezePageId(boolean freeze)
{
- setFlag(FLAG_PREVENT_DIRTY, prevent);
+ setFlag(FLAG_PREVENT_DIRTY, freeze);
}
/**
@@ -451,8 +446,7 @@ public abstract class Page extends Marku
* THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT CALL.
*
* This method is called when a component was rendered standalone. If it is a <code>
- * MarkupContainer</code>
- * then the rendering for that container is checked.
+ * MarkupContainer</code> then the rendering for that container is checked.
*
* @param component
*
@@ -1301,7 +1295,7 @@ public abstract class Page extends Marku
if (getApplication().getRequestCycleSettings().getRenderStrategy() != RenderStrategy.REDIRECT_TO_BUFFER)
{
// don't increment page id for redirect to render and one pass render during rendering
- preventDirty(true);
+ setFreezePageId(true);
}
try
{
@@ -1310,7 +1304,7 @@ public abstract class Page extends Marku
}
finally
{
- preventDirty(false);
+ setFreezePageId(false);
}
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/page/IManageablePage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/page/IManageablePage.java?rev=987703&r1=987702&r2=987703&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/page/IManageablePage.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/page/IManageablePage.java Sat Aug 21 06:09:56 2010
@@ -39,4 +39,26 @@ public interface IManageablePage
* re-attached later.
*/
void detach();
+
+ /**
+ * Sets whether or not the page is allowed to change its page id. Implementations of this
+ * interface usually change their page id once a change to the data structure is made and
+ * historical record of the current state needs to be kept (usually to be accessible via the
+ * back button). Keeping a historical record is usually achieved by simply incrementing the page
+ * id to the next unique number, so when the implementation is stored it is done so in a new
+ * slot.
+ *
+ * This method is useful when for some reason we do not want the implementation to change its
+ * page id under any circumstances. One concrete example is an AJAX request. Suppose the page
+ * with id 10 was written out with callbacks pointing to id 10. Suppose that the user executed
+ * some AJAX callbacks which have changed the page id to 15. Now, the user clicks a non-AJAX
+ * link that was never updated by an AJAX update and still points to id 10 - which causes the
+ * state of the page to be rolled back - which is usually undesirable as all changes made to the
+ * page by AJAX requests are lost. So, instead, whatever is invoking the execution of the AJAX
+ * request on the page can use this method to tell the page to not update its page id thereby
+ * solving the problem.
+ *
+ * @param freeze
+ */
+ void setFreezePageId(boolean freeze);
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestablePage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestablePage.java?rev=987703&r1=987702&r2=987703&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestablePage.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestablePage.java Sat Aug 21 06:09:56 2010
@@ -25,6 +25,7 @@ import org.apache.wicket.request.mapper.
* to mock and unit test.
*
* @author Matej Knopp
+ * @author Igor Vaynberg (ivaynberg)
*/
public interface IRequestablePage extends IRequestableComponent, IManageablePage
{
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java?rev=987703&r1=987702&r2=987703&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java Sat Aug 21 06:09:56 2010
@@ -19,6 +19,7 @@ package org.apache.wicket.request.handle
import org.apache.wicket.RequestListenerInterface;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.behavior.IBehavior;
+import org.apache.wicket.page.IManageablePage;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.component.IRequestableComponent;
import org.apache.wicket.request.component.IRequestablePage;
@@ -138,10 +139,11 @@ public class ListenerInterfaceRequestHan
*/
public void respond(final IRequestCycle requestCycle)
{
- if (getComponent().getPage() == getPage())
+ final IRequestablePage page = getPage();
+ if (getComponent().getPage() == page)
{
- if (((WebRequest)requestCycle.getRequest()).isAjax() == false &&
- listenerInterface.isRenderPageAfterInvocation())
+ boolean isAjax = ((WebRequest)requestCycle.getRequest()).isAjax();
+ if (isAjax == false && listenerInterface.isRenderPageAfterInvocation())
{
// schedule page render after current request handler is done. this can be
// overridden
@@ -153,20 +155,20 @@ public class ListenerInterfaceRequestHan
new PageProvider(getPage()), policy));
}
- if (getBehaviorIndex() == null)
+ if (isAjax & page instanceof IManageablePage)
{
- listenerInterface.invoke(getComponent());
+ ((IManageablePage)page).setFreezePageId(true);
}
- else
+
+ try
{
- try
- {
- IBehavior behavior = getComponent().getBehaviors().get(behaviorIndex);
- listenerInterface.invoke(getComponent(), behavior);
- }
- catch (IndexOutOfBoundsException e)
+ invokeListener();
+ }
+ finally
+ {
+ if (isAjax && page instanceof IManageablePage)
{
- throw new WicketRuntimeException("Couldn't find component behavior.");
+ ((IManageablePage)page).setFreezePageId(false);
}
}
@@ -177,4 +179,25 @@ public class ListenerInterfaceRequestHan
" has been removed from page.");
}
}
+
+ private void invokeListener()
+ {
+ if (getBehaviorIndex() == null)
+ {
+ listenerInterface.invoke(getComponent());
+ }
+ else
+ {
+ try
+ {
+ IBehavior behavior = getComponent().getBehaviors().get(behaviorIndex);
+ listenerInterface.invoke(getComponent(), behavior);
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ throw new WicketRuntimeException("Couldn't find component behavior.");
+ }
+
+ }
+ }
}
Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/MockPage.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/MockPage.java?rev=987703&r1=987702&r2=987703&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/MockPage.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/MockPage.java Sat Aug 21 06:09:56 2010
@@ -163,4 +163,9 @@ public class MockPage extends MockCompon
{
this.renderCount = renderCount;
}
+
+
+ public void setFreezePageId(boolean freeze)
+ {
+ }
}