Author: mgrigorov
Date: Mon Jul 19 15:06:57 2010
New Revision: 965525

URL: http://svn.apache.org/viewvc?rev=965525&view=rev
Log:
* Try to extract the page which rendering thrown an exception. It would be 
useful when showing the information in an error page 
* Make IExceptionMapper configurable by the user - 
Application#newExceptionMapper()


Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/DefaultExceptionMapper.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java?rev=965525&r1=965524&r2=965525&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java Mon 
Jul 19 15:06:57 2010
@@ -59,6 +59,7 @@ import org.apache.wicket.protocol.http.D
 import org.apache.wicket.protocol.http.IRequestLogger;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.http.WebSession;
+import org.apache.wicket.request.IExceptionMapper;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
@@ -1483,9 +1484,8 @@ public abstract class Application implem
 
        public final RequestCycle createRequestCycle(Request request, Response 
response)
        {
-               // FIXME exception mapper should come from elsewhere
                RequestCycleContext context = new RequestCycleContext(request, 
response,
-                       getRootRequestMapper(), new DefaultExceptionMapper());
+                       getRootRequestMapper(), newExceptionMapper());
 
                RequestCycle requestCycle = 
getRequestCycleProvider().get(context);
                requestCycle.register(new RequestCycle.DetachCallback()
@@ -1499,6 +1499,15 @@ public abstract class Application implem
        }
 
        /**
+        * @return a mapper that knows what kind of error page to show when an 
exception occurs during
+        *         page rendering
+        */
+       protected IExceptionMapper newExceptionMapper()
+       {
+               return new DefaultExceptionMapper();
+       }
+
+       /**
         * Initialize the application
         */
        public final void initApplication()

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=965525&r1=965524&r2=965525&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 
Mon Jul 19 15:06:57 2010
@@ -20,13 +20,20 @@ import org.apache.wicket.markup.html.pag
 import org.apache.wicket.protocol.http.PageExpiredException;
 import org.apache.wicket.request.IExceptionMapper;
 import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.handler.EmptyRequestHandler;
+import org.apache.wicket.request.handler.IPageRequestHandler;
 import org.apache.wicket.request.handler.PageProvider;
 import org.apache.wicket.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.request.mapper.StalePageException;
 import org.apache.wicket.settings.IExceptionSettings;
 import 
org.apache.wicket.settings.IExceptionSettings.UnexpectedExceptionDisplay;
 
+/**
+ * If an exception is thrown when a page is being rendered this mapper will 
decide which error page
+ * to show depending on the exception type and {...@link 
Application#getExceptionSettings() application
+ * configuration}
+ */
 public class DefaultExceptionMapper implements IExceptionMapper
 {
 
@@ -51,9 +58,9 @@ public class DefaultExceptionMapper impl
 
                        if 
(IExceptionSettings.SHOW_EXCEPTION_PAGE.equals(unexpectedExceptionDisplay))
                        {
-                               return new RenderPageRequestHandler(new 
PageProvider(
-                               // TODO WICKET-NG How to provide the page to 
ExceptionErrorPage ?!
-                                       new ExceptionErrorPage(e, null)));
+                               Page currentPage = extractCurrentPage();
+                               return new RenderPageRequestHandler(new 
PageProvider(new ExceptionErrorPage(e,
+                                       currentPage)));
                        }
                        else if 
(IExceptionSettings.SHOW_INTERNAL_ERROR_PAGE.equals(unexpectedExceptionDisplay))
                        {
@@ -67,4 +74,24 @@ public class DefaultExceptionMapper impl
                        }
                }
        }
+
+       /**
+        * @return the page being rendered when the exception was thrown, or 
{...@code null} if it cannot
+        *         be extracted
+        */
+       private Page extractCurrentPage()
+       {
+               final RequestCycle requestCycle = RequestCycle.get();
+               final IRequestHandler activeRequestHandler = 
requestCycle.getActiveRequestHandler();
+
+               Page currentPage = null;
+
+               if (activeRequestHandler instanceof IPageRequestHandler)
+               {
+                       IPageRequestHandler pageRequestHandler = 
(IPageRequestHandler)activeRequestHandler;
+                       currentPage = (Page)pageRequestHandler.getPage();
+               }
+
+               return currentPage;
+       }
 }


Reply via email to