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();


Reply via email to