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/11/19 21:31:29 UTC
svn commit: r1037011 - in /wicket/trunk/wicket/src:
main/java/org/apache/wicket/ main/java/org/apache/wicket/request/cycle/
test/java/org/apache/wicket/request/cycle/
Author: ivaynberg
Date: Fri Nov 19 20:31:29 2010
New Revision: 1037011
URL: http://svn.apache.org/viewvc?rev=1037011&view=rev
Log:
allow request cycle listeners to return a request handler from onexception
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/AbstractRequestCycleListener.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/IRequestCycleListener.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java?rev=1037011&r1=1037010&r2=1037011&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java Fri Nov 19 20:31:29 2010
@@ -28,7 +28,7 @@ import org.apache.wicket.request.handler
import org.apache.wicket.request.handler.PageProvider;
import org.apache.wicket.request.handler.RenderPageRequestHandler;
import org.apache.wicket.request.http.WebRequest;
-import org.apache.wicket.request.http.handler.ErrorCodeResponseHandler;
+import org.apache.wicket.request.http.handler.ErrorCodeRequestHandler;
import org.apache.wicket.request.mapper.StalePageException;
import org.apache.wicket.settings.IExceptionSettings;
import org.apache.wicket.settings.IExceptionSettings.UnexpectedExceptionDisplay;
@@ -55,7 +55,7 @@ public class DefaultExceptionMapper impl
// hmmm, we were already handling an exception! give up
logger.error("unexpected exception when handling another exception: " + e.getMessage(),
e);
- return new ErrorCodeResponseHandler(500);
+ return new ErrorCodeRequestHandler(500);
}
}
@@ -69,7 +69,7 @@ public class DefaultExceptionMapper impl
switch (application.getExceptionSettings().getAjaxErrorHandlingStrategy())
{
case INVOKE_FAILURE_HANDLER :
- return new ErrorCodeResponseHandler(500);
+ return new ErrorCodeRequestHandler(500);
}
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/AbstractRequestCycleListener.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/AbstractRequestCycleListener.java?rev=1037011&r1=1037010&r2=1037011&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/AbstractRequestCycleListener.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/AbstractRequestCycleListener.java Fri Nov 19 20:31:29 2010
@@ -16,6 +16,8 @@
*/
package org.apache.wicket.request.cycle;
+import org.apache.wicket.request.IRequestHandler;
+
public abstract class AbstractRequestCycleListener implements IRequestCycleListener
{
public void onBeginRequest(final RequestCycle cycle)
@@ -30,7 +32,8 @@ public abstract class AbstractRequestCyc
{
}
- public void onException(final RequestCycle cycle, Exception ex)
+ public IRequestHandler onException(final RequestCycle cycle, Exception ex)
{
+ return null;
}
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/IRequestCycleListener.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/IRequestCycleListener.java?rev=1037011&r1=1037010&r2=1037011&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/IRequestCycleListener.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/IRequestCycleListener.java Fri Nov 19 20:31:29 2010
@@ -17,6 +17,7 @@
package org.apache.wicket.request.cycle;
import org.apache.wicket.Application;
+import org.apache.wicket.request.IRequestHandler;
/**
* A callback interface for various methods in the request cycle. If you are creating a framework
@@ -63,9 +64,12 @@ public interface IRequestCycleListener
*
* @param cycle
*
+ * @return request handler that will be exectued or {@code null} if none. If a request handler
+ * is returned, it will override any configured exception mapper
+ *
* @param ex
* the exception that was passed in to
* {@link RequestCycle#handleException(Exception)}
*/
- void onException(RequestCycle cycle, Exception ex);
+ IRequestHandler onException(RequestCycle cycle, Exception ex);
}
\ No newline at end of file
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java?rev=1037011&r1=1037010&r2=1037011&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java Fri Nov 19 20:31:29 2010
@@ -290,7 +290,11 @@ public class RequestCycle extends Reques
*/
protected IRequestHandler handleException(final Exception e)
{
- listeners.onException(this, e);
+ IRequestHandler handler = listeners.onException(this, e);
+ if (handler != null)
+ {
+ return handler;
+ }
return exceptionMapper.map(e);
}
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java?rev=1037011&r1=1037010&r2=1037011&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java Fri Nov 19 20:31:29 2010
@@ -16,6 +16,11 @@
*/
package org.apache.wicket.request.cycle;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.util.listener.ListenerCollection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,16 +53,35 @@ public class RequestCycleListenerCollect
});
}
- public void onException(final RequestCycle cycle, final Exception ex)
+ public IRequestHandler onException(final RequestCycle cycle, final Exception ex)
{
+ final List<IRequestHandler> handlers = new ArrayList<IRequestHandler>();
+
notify(new INotifier<IRequestCycleListener>()
{
public void notify(IRequestCycleListener listener)
{
- listener.onException(cycle, ex);
+ IRequestHandler handler = listener.onException(cycle, ex);
+ if (handler != null)
+ {
+ handlers.add(handler);
+ }
}
});
+ if (handlers.isEmpty())
+ {
+ return null;
+ }
+
+ if (handlers.size() > 1)
+ {
+ throw new WicketRuntimeException(
+ "More than one request cycle listener returned a request handler while handling the exception.",
+ ex);
+ }
+
+ return handlers.get(0);
}
public void onDetach(final RequestCycle cycle)
Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java?rev=1037011&r1=1037010&r2=1037011&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java Fri Nov 19 20:31:29 2010
@@ -18,6 +18,7 @@ package org.apache.wicket.request.cycle;
import org.apache.wicket.Application;
import org.apache.wicket.ThreadContext;
+import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.mock.MockWebRequest;
import org.apache.wicket.request.IExceptionMapper;
import org.apache.wicket.request.IRequestCycle;
@@ -40,11 +41,14 @@ public class RequestCycleListenerTest ex
private IRequestHandler handler;
+ private int errorCode;
+
@Override
protected void setUp() throws Exception
{
super.setUp();
ThreadContext.setApplication(new DummyApplication());
+ errorCode = 0;
}
@Override
@@ -167,6 +171,32 @@ public class RequestCycleListenerTest ex
/**
* @throws Exception
*/
+ public void testExceptionRequestHandlers() throws Exception
+ {
+ Application.get().getRequestCycleListeners().add(new ErrorCodeListener(401));
+
+ RequestCycle cycle = newRequestCycle(true);
+ cycle.processRequestAndDetach();
+
+ assertEquals(401, errorCode);
+
+ // two listeners that return a request handler should cause an exception
+ Application.get().getRequestCycleListeners().add(new ErrorCodeListener(401));
+ cycle = newRequestCycle(true);
+ try
+ {
+ cycle.processRequestAndDetach();
+ fail("expected an exception because two request cycle listeners returned a request handler");
+ }
+ catch (WicketRuntimeException e)
+ {
+ // expected
+ }
+ }
+
+ /**
+ * @throws Exception
+ */
public void testExceptionHandingInOnDetach() throws Exception
{
// this test is a little flaky because it depends on the ordering of listeners which is not
@@ -200,11 +230,40 @@ public class RequestCycleListenerTest ex
assertEquals(detachesnotified, this.detachesnotified);
}
+ private class ErrorCodeListener extends AbstractRequestCycleListener
+ {
+ private final int code;
+
+ public ErrorCodeListener(int code)
+ {
+ this.code = code;
+ }
+
+ @Override
+ public IRequestHandler onException(final RequestCycle cycle, Exception ex)
+ {
+ return new IRequestHandler()
+ {
+ public void respond(IRequestCycle requestCycle)
+ {
+ errorCode = code;
+ }
+
+ public void detach(IRequestCycle requestCycle)
+ {
+ }
+
+ };
+ }
+ }
+
+
private class IncrementingListener implements IRequestCycleListener
{
- public void onException(final RequestCycle cycle, Exception ex)
+ public IRequestHandler onException(final RequestCycle cycle, Exception ex)
{
exceptions++;
+ return null;
}
public void onEndRequest(final RequestCycle cycle)