Author: knopp
Date: Sat Oct  3 03:02:56 2009
New Revision: 821227

URL: http://svn.apache.org/viewvc?rev=821227&view=rev
Log:
RequestCycle fixes

Modified:
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestHandlerStack.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java?rev=821227&r1=821226&r2=821227&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
 Sat Oct  3 03:02:56 2009
@@ -387,7 +387,7 @@
 
     public void setResponsePage(RequestablePage page)
     {
-        replaceCurrentRequestHandler(new RenderPageRequestHandler(new 
PageProvider(page),
+        scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(new 
PageProvider(page),
                 RenderPageRequestHandler.RedirectPolicy.AUTO_REDIRECT));
     }
 
@@ -395,7 +395,7 @@
             PageParameters parameters)
     {
         PageProvider provider = new PageProvider(pageClass);
-        replaceCurrentRequestHandler(new RenderPageRequestHandler(provider,
+        scheduleRequestHandlerAfterCurrent(new 
RenderPageRequestHandler(provider,
                 RenderPageRequestHandler.RedirectPolicy.AUTO_REDIRECT));
     }
 }

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestHandlerStack.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestHandlerStack.java?rev=821227&r1=821226&r2=821227&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestHandlerStack.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/cycle/RequestHandlerStack.java
 Sat Oct  3 03:02:56 2009
@@ -49,6 +49,8 @@
 
        private final List<RequestHandler> inactiveRequestHandlers = new 
ArrayList<RequestHandler>();
 
+       private RequestHandler scheduledAfterCurrent = null;
+
        /**
         * Returns currently active {...@link RequestHandler}.
         * 
@@ -60,7 +62,7 @@
        }
 
        /**
-        * Executes the specified {...@link RequestHandler}. When the specified 
{...@link RequestHandler} 
+        * Executes the specified {...@link RequestHandler}. When the specified 
{...@link RequestHandler}
         * finishes, the {...@link RequestHandler} that invoked this method 
continues (unless the new
         * {...@link RequestHandler} called {...@link 
#replaceAllRequestHandlers(RequestHandler)}.
         * 
@@ -68,7 +70,7 @@
         */
        public void executeRequestHandler(RequestHandler handler)
        {
-               final boolean first = requestHandlers.isEmpty();                
+               final boolean first = requestHandlers.isEmpty();
                requestHandlers.add(handler);
 
                RequestHandler replacementHandler = null;
@@ -92,10 +94,32 @@
                        inactiveRequestHandlers.add(handler);
                }
 
+               RequestHandler scheduled = scheduledAfterCurrent;
+               scheduledAfterCurrent = null;
+
                if (replacementHandler != null)
                {
                        executeRequestHandler(replacementHandler);
                }
+               else if (scheduled != null)
+               {
+                       executeRequestHandler(scheduled);
+               }
+       }
+
+       /**
+        * Schedules the request handler to be executed after current request 
handler finishes. If there
+        * is already another request handler scheduled it will be discarded 
and overwritten with the
+        * new one. If {...@link #replaceCurrentRequestHandler(RequestHandler)} 
or
+        * {...@link #replaceAllRequestHandlers(RequestHandler)} is invoked 
during current request handler
+        * execution the scheduled handler will be also discarded.
+        * 
+        * @param handler
+        *            handler to be executed after current request handler 
finishes
+        */
+       public void scheduleRequestHandlerAfterCurrent(RequestHandler handler)
+       {
+               this.scheduledAfterCurrent = handler;
        }
 
        /**
@@ -105,6 +129,12 @@
         * 
         * @param handler
         */
+       // FIXME
+       // Is this method really useful for anything? To execute request 
handler after current 
+       // #scheduleRequestHandlerAfterCurrent is better alternative because it 
doesn't terminate current 
+       // request handler.
+       // To restart request processing #replaceAllRequestHandlers is better 
alternative because it unrolls
+       // entire stack and cancels all request handlers in stack
        public void replaceCurrentRequestHandler(RequestHandler handler)
        {
                if (requestHandlers.isEmpty())
@@ -161,7 +191,6 @@
                }
        };
 
-
        /**
         * Returns the active {...@link Response}.
         * 
@@ -192,7 +221,7 @@
         * Detaches all {...@link RequestHandler}s.
         */
        public void detach()
-       {               
+       {
                if (!requestHandlers.isEmpty())
                {
                        // All requests handlers should be inactive at this 
point

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java?rev=821227&r1=821226&r2=821227&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
 Sat Oct  3 03:02:56 2009
@@ -18,9 +18,9 @@
 
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.behavior.IBehavior;
+import org.apache.wicket.request.component.PageParameters;
 import org.apache.wicket.request.component.RequestableComponent;
 import org.apache.wicket.request.component.RequestablePage;
-import org.apache.wicket.request.component.PageParameters;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.handler.ComponentRequestHandler;
 import org.apache.wicket.request.handler.PageAndComponentProvider;
@@ -120,6 +120,11 @@
        {
                if (getComponent().getPage() == getPage())
                {
+                       // schedule page render after current request handler 
is done. this can be overriden during invokation of listener
+                       // method (i.e. by calling RequestCycle#setResponsePage)
+                       RedirectPolicy policy = getPage().isPageStateless() ? 
RedirectPolicy.NEVER_REDIRECT : RedirectPolicy.AUTO_REDIRECT;
+                       requestCycle.scheduleRequestHandlerAfterCurrent(new 
RenderPageRequestHandler(new PageProvider(getPage()), policy));
+
                        if (getBehaviorIndex() == null)
                        {
                                listenerInterface.invoke(getComponent());
@@ -137,8 +142,6 @@
                                }
 
                        }
-                       RedirectPolicy policy = getPage().isPageStateless() ? 
RedirectPolicy.NEVER_REDIRECT : RedirectPolicy.AUTO_REDIRECT;
-                       requestCycle.replaceCurrentRequestHandler(new 
RenderPageRequestHandler(new PageProvider(getPage()), policy));
                }
                else
                {

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java?rev=821227&r1=821226&r2=821227&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java
 Sat Oct  3 03:02:56 2009
@@ -265,4 +265,101 @@
         assertTrue(detachedFlag3);
         assertTrue(detachedFlag4);
     }
+    
+    
+    /**
+        * 
+        */
+    public void test3()
+    {
+        initFlags();
+
+        final Response originalResponse = newResponse();
+        final RequestHandlerStack stack = newStack(originalResponse);
+
+        final RequestHandler handler4 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag4 = true;
+
+                stack.setResponse(newResponse());
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag4 = true;
+            }
+        };
+
+        final RequestHandler handler3 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag3 = false;
+                stack.scheduleRequestHandlerAfterCurrent(handler4);
+
+                // make sure that handler4's respond method is fired after 
this one ends
+                testFlag4 = false;
+                
+                
+                // code must be be reached
+                testFlag3 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag3 = true;
+            }
+        };
+
+        final RequestHandler handler2 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag2 = false;
+                stack.executeRequestHandler(handler3);
+                // code must be reached
+                testFlag2 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag2 = true;
+            }
+        };
+
+        RequestHandler handler1 = new RequestHandler()
+        {
+            public void respond(RequestCycle requestCycle)
+            {
+                testFlag1 = false;
+                stack.executeRequestHandler(handler2);
+
+                // code must be reached
+                testFlag1 = true;
+            }
+
+            public void detach(RequestCycle requestCycle)
+            {
+                detachedFlag1 = true;
+            }
+        };
+
+        stack.executeRequestHandler(handler1);
+
+        assertEquals(stack.getResponse(), originalResponse);
+
+        stack.detach();
+
+        assertTrue(testFlag1);
+        assertTrue(testFlag2);
+        assertTrue(testFlag3);
+        assertTrue(testFlag4);
+
+        assertTrue(detachedFlag1);
+        assertTrue(detachedFlag2);
+        assertTrue(detachedFlag3);
+        assertTrue(detachedFlag4);
+    }
 }


Reply via email to