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