You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by da...@apache.org on 2011/04/27 15:03:02 UTC

svn commit: r1097103 - in /wicket/trunk/wicket-core/src: main/java/org/apache/wicket/request/cycle/ test/java/org/apache/wicket/request/cycle/

Author: dashorst
Date: Wed Apr 27 13:03:01 2011
New Revision: 1097103

URL: http://svn.apache.org/viewvc?rev=1097103&view=rev
Log:
Improved exception handling strategy to not fail when multiple handlers are returned: just use the first one that is available.
Issue: WICKET-3644

Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/BaseRequestHandlerStackTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java
    wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java?rev=1097103&r1=1097102&r2=1097103&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycleListenerCollection.java Wed Apr 27 13:03:01 2011
@@ -19,14 +19,13 @@ 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;
 
 /**
- * 
+ * Special, Wicket internal composite {@link IRequestCycleListener} that
  */
 public class RequestCycleListenerCollection extends ListenerCollection<IRequestCycleListener>
 	implements
@@ -57,6 +56,13 @@ public class RequestCycleListenerCollect
 		});
 	}
 
+	/**
+	 * Notifies all registered listeners of the exception and calls the first handler that was
+	 * returned by the listeners.
+	 * 
+	 * @see org.apache.wicket.request.cycle.IRequestCycleListener#onException(org.apache.wicket.request.cycle.RequestCycle,
+	 *      java.lang.Exception)
+	 */
 	public IRequestHandler onException(final RequestCycle cycle, final Exception ex)
 	{
 		final List<IRequestHandler> handlers = new ArrayList<IRequestHandler>();
@@ -77,14 +83,12 @@ public class RequestCycleListenerCollect
 		{
 			return null;
 		}
-
 		if (handlers.size() > 1)
 		{
-			throw new WicketRuntimeException(
-				"More than one request cycle listener returned a request handler while handling the exception.",
-				ex);
+			logger.debug(
+				"{} exception handlers available for exception {}, using the first handler",
+				handlers.size(), ex);
 		}
-
 		return handlers.get(0);
 	}
 

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/BaseRequestHandlerStackTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/BaseRequestHandlerStackTest.java?rev=1097103&r1=1097102&r2=1097103&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/BaseRequestHandlerStackTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/BaseRequestHandlerStackTest.java Wed Apr 27 13:03:01 2011
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.request.cycle;
 
-import junit.framework.TestCase;
-
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Request;
@@ -28,7 +26,7 @@ import org.apache.wicket.request.UrlRend
 /**
  * @author Jeremy Thomerson
  */
-public abstract class BaseRequestHandlerStackTest extends TestCase
+public abstract class BaseRequestHandlerStackTest
 {
 	protected Response newResponse()
 	{
@@ -126,5 +124,4 @@ public abstract class BaseRequestHandler
 
 		};
 	}
-
 }

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java?rev=1097103&r1=1097102&r2=1097103&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java Wed Apr 27 13:03:01 2011
@@ -16,9 +16,11 @@
  */
 package org.apache.wicket.request.cycle;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 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.protocol.http.mock.MockServletContext;
 import org.apache.wicket.request.IExceptionMapper;
@@ -29,13 +31,15 @@ import org.apache.wicket.request.Request
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.resource.DummyApplication;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * @author Jeremy Thomerson
  */
 public class RequestCycleListenerTest extends BaseRequestHandlerStackTest
 {
-
 	private IRequestHandler handler;
 
 	private int errorCode;
@@ -46,11 +50,10 @@ public class RequestCycleListenerTest ex
 
 	private int exceptionsMapped;
 
-	@Override
-	protected void setUp() throws Exception
+	/** */
+	@Before
+	public void setUp()
 	{
-		super.setUp();
-
 		DummyApplication application = new DummyApplication();
 		application.setName("dummyTestApplication");
 		ThreadContext.setApplication(application);
@@ -59,10 +62,10 @@ public class RequestCycleListenerTest ex
 		errorCode = 0;
 	}
 
-	@Override
-	protected void tearDown() throws Exception
+	/** */
+	@After
+	public void tearDown()
 	{
-		super.tearDown();
 		ThreadContext.getApplication().internalDestroy();
 		ThreadContext.detach();
 	}
@@ -129,7 +132,8 @@ public class RequestCycleListenerTest ex
 	/**
 	 * @throws Exception
 	 */
-	public void testBasicOperations() throws Exception
+	@Test
+	public void basicOperations() throws Exception
 	{
 		IncrementingListener incrementingListener = new IncrementingListener();
 		Application.get().getRequestCycleListeners().add(incrementingListener);
@@ -183,10 +187,9 @@ public class RequestCycleListenerTest ex
 		assertValues(1, 2, 3);
 	}
 
-	/**
-	 * @throws Exception
-	 */
-	public void testExceptionRequestHandlers() throws Exception
+	/** */
+	@Test
+	public void exceptionIsHandledByRegisteredHandler()
 	{
 		IncrementingListener incrementingListener = new IncrementingListener();
 		Application.get().getRequestCycleListeners().add(incrementingListener);
@@ -198,29 +201,28 @@ public class RequestCycleListenerTest ex
 		assertEquals(401, errorCode);
 		assertEquals(1, incrementingListener.exceptionResolutions);
 		assertEquals(0, incrementingListener.schedules);
+	}
 
-		// two listeners that return a request handler should cause an exception
+	/** */
+	@Test
+	public void exceptionIsHandledByFirstAvailableHandler()
+	{
+		// when two listeners return a handler
 		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, the second handler was resolved but thrown an exception handling the
-			 * request
-			 */
-			assertEquals(2, incrementingListener.resolutions);
-		}
+		Application.get().getRequestCycleListeners().add(new ErrorCodeListener(402));
+
+		RequestCycle cycle = newRequestCycle(true);
+		cycle.processRequestAndDetach();
+
+		// the first handler returned is used to handle the exception
+		assertEquals(401, errorCode);
 	}
 
 	/**
 	 * @throws Exception
 	 */
-	public void testExceptionHandingInOnDetach() throws Exception
+	@Test
+	public void exceptionHandingInOnDetach() throws Exception
 	{
 		// this test is a little flaky because it depends on the ordering of listeners which is not
 		// guaranteed
@@ -278,7 +280,6 @@ public class RequestCycleListenerTest ex
 		}
 	}
 
-
 	private class IncrementingListener implements IRequestCycleListener
 	{
 
@@ -330,6 +331,4 @@ public class RequestCycleListenerTest ex
 			assertEquals(detachesnotified, this.detachesnotified);
 		}
 	}
-
-
 }

Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java?rev=1097103&r1=1097102&r2=1097103&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java (original)
+++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerStackTest.java Wed Apr 27 13:03:01 2011
@@ -16,25 +16,21 @@
  */
 package org.apache.wicket.request.cycle;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.RequestHandlerStack;
 import org.apache.wicket.request.Response;
+import org.junit.Test;
 
 /**
- * 
  * @author Matej Knopp
  */
 public class RequestHandlerStackTest extends BaseRequestHandlerStackTest
 {
-
-	/**
-	 * Construct.
-	 */
-	public RequestHandlerStackTest()
-	{
-	}
-
 	private boolean testFlag1;
 	private boolean testFlag2;
 	private boolean testFlag3;
@@ -58,9 +54,8 @@ public class RequestHandlerStackTest ext
 		detachedFlag4 = false;
 	}
 
-	/**
-	 * 
-	 */
+	/** */
+	@Test
 	public void test1()
 	{
 		initFlags();
@@ -136,9 +131,8 @@ public class RequestHandlerStackTest ext
 		assertTrue(detachedFlag3);
 	}
 
-	/**
-	 * 
-	 */
+	/** */
+	@Test
 	public void test2()
 	{
 		initFlags();
@@ -234,9 +228,8 @@ public class RequestHandlerStackTest ext
 		assertTrue(detachedFlag4);
 	}
 
-	/**
-	 * 
-	 */
+	/** */
+	@Test
 	public void test3()
 	{
 		initFlags();