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


Reply via email to