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