You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by cr...@apache.org on 2006/05/26 06:22:07 UTC

svn commit: r409553 - in /struts/shale/trunk/core-library/src/java/org/apache/shale: component/Subview.java view/faces/ViewPhaseListener.java

Author: craigmcc
Date: Thu May 25 21:22:06 2006
New Revision: 409553

URL: http://svn.apache.org/viewvc?rev=409553&view=rev
Log:
Cache exceptions from calls to prerender() and preprocess() callbacks, to
avoid having the preprocess() method called twice.  This is further progress
towards coherent exception handling (SHALE-125), although it surfaces a need
to refactor the multiple cases where exceptions are being cached into a common
strategy-pattern based implementation.

JIRA Issue:  SHALE-30
Reported By:  Darren Boyd <darren AT bitcraft.ca>

Modified:
    struts/shale/trunk/core-library/src/java/org/apache/shale/component/Subview.java
    struts/shale/trunk/core-library/src/java/org/apache/shale/view/faces/ViewPhaseListener.java

Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/component/Subview.java
URL: http://svn.apache.org/viewvc/struts/shale/trunk/core-library/src/java/org/apache/shale/component/Subview.java?rev=409553&r1=409552&r2=409553&view=diff
==============================================================================
--- struts/shale/trunk/core-library/src/java/org/apache/shale/component/Subview.java (original)
+++ struts/shale/trunk/core-library/src/java/org/apache/shale/component/Subview.java Thu May 25 21:22:06 2006
@@ -70,7 +70,11 @@
 
         ViewController vc = getViewController(context, false);
         if (vc != null) {
-            vc.prerender();
+            try {
+                vc.prerender();
+            } catch (Exception e) {
+                cacheException(e);
+            }
         }
         super.processDecodes(context);
 
@@ -88,7 +92,11 @@
 
         ViewController vc = getViewController(context, true);
         if (vc != null) {
-            vc.preprocess();
+            try {
+                vc.preprocess();
+            } catch (Exception e) {
+                cacheException(e);
+            }
         }
         super.processDecodes(context);
 
@@ -158,6 +166,74 @@
 
         // Return the initialized ViewController
         return vc;
+
+    }
+
+
+    /**
+     * <p>Log the specified exception, and cache it on the list of exceptions
+     * to be reported after all of the appropriate <code>destroy()</code> calls
+     * have been completed.</p>
+     *
+     * @param exception Exception to be cached
+     */
+    private void cacheException(Exception exception) {
+
+        // Log the exception unconditionally
+        log(exception.getMessage(), exception);
+
+        // Are we within the context of a JavaServer Faces request?
+        // If so, accumulate this exception to the list that can be
+        // reported at the completion of the request.
+        FacesContext context = FacesContext.getCurrentInstance();
+        if (context == null) {
+            return;
+        }
+        List list = (List) context.getExternalContext().getRequestMap().
+                get(Constants.EXCEPTIONS_LIST);
+        if (list == null) {
+            list = new ArrayList(4);
+            context.getExternalContext().getRequestMap().
+                    put(Constants.EXCEPTIONS_LIST, list);
+        }
+        list.add(exception);
+
+    }
+
+
+    /**
+     * <p>Log the specified message via <code>FacesContext</code> if it is
+     * not null, or directly to the container otherwise.</p>
+     *
+     * @param message Message to be logged
+     */
+    private void log(String message) {
+
+        FacesContext context = FacesContext.getCurrentInstance();
+        if (context != null) {
+            context.getExternalContext().log(message);
+        } else {
+            System.out.println(message);
+        }
+
+    }
+
+
+    /**
+     * <p>Log the specified message and exception via <code>FacesContext</code>
+     * if it is not null, or directly to the container otherwise.</p>
+     *
+     * @param message Message to be logged
+     * @param throwable Exception to be logged
+     */
+    private void log(String message, Throwable throwable) {
+
+        FacesContext context = FacesContext.getCurrentInstance();
+        if (context != null) {
+            context.getExternalContext().log(message);
+        } else {
+            System.out.println(message);
+        }
 
     }
 

Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/view/faces/ViewPhaseListener.java
URL: http://svn.apache.org/viewvc/struts/shale/trunk/core-library/src/java/org/apache/shale/view/faces/ViewPhaseListener.java?rev=409553&r1=409552&r2=409553&view=diff
==============================================================================
--- struts/shale/trunk/core-library/src/java/org/apache/shale/view/faces/ViewPhaseListener.java (original)
+++ struts/shale/trunk/core-library/src/java/org/apache/shale/view/faces/ViewPhaseListener.java Thu May 25 21:22:06 2006
@@ -16,6 +16,7 @@
 
 package org.apache.shale.view.faces;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -161,7 +162,11 @@
         Iterator vcs = list.iterator();
         while (vcs.hasNext()) {
             Object vc = vcs.next();
-            viewControllerCallbacks(event.getFacesContext()).preprocess(vc);
+            try {
+                viewControllerCallbacks(event.getFacesContext()).preprocess(vc);
+            } catch (Exception e) {
+                cacheException(e);
+            }
         }
 
     }
@@ -181,8 +186,80 @@
         if (vc == null) {
             return;
         }
-        viewControllerCallbacks(event.getFacesContext()).prerender(vc);
+        try {
+            viewControllerCallbacks(event.getFacesContext()).prerender(vc);
+        } catch (Exception e) {
+            cacheException(e);
+        }
         map.remove(Constants.VIEW_RENDERED);
+
+    }
+
+
+    /**
+     * <p>Log the specified exception, and cache it on the list of exceptions
+     * to be reported after all of the appropriate <code>destroy()</code> calls
+     * have been completed.</p>
+     *
+     * @param exception Exception to be cached
+     */
+    private void cacheException(Exception exception) {
+
+        // Log the exception unconditionally
+        log(exception.getMessage(), exception);
+
+        // Are we within the context of a JavaServer Faces request?
+        // If so, accumulate this exception to the list that can be
+        // reported at the completion of the request.
+        FacesContext context = FacesContext.getCurrentInstance();
+        if (context == null) {
+            return;
+        }
+        List list = (List) context.getExternalContext().getRequestMap().
+                get(Constants.EXCEPTIONS_LIST);
+        if (list == null) {
+            list = new ArrayList(4);
+            context.getExternalContext().getRequestMap().
+                    put(Constants.EXCEPTIONS_LIST, list);
+        }
+        list.add(exception);
+
+    }
+
+
+    /**
+     * <p>Log the specified message via <code>FacesContext</code> if it is
+     * not null, or directly to the container otherwise.</p>
+     *
+     * @param message Message to be logged
+     */
+    private void log(String message) {
+
+        FacesContext context = FacesContext.getCurrentInstance();
+        if (context != null) {
+            context.getExternalContext().log(message);
+        } else {
+            System.out.println(message);
+        }
+
+    }
+
+
+    /**
+     * <p>Log the specified message and exception via <code>FacesContext</code>
+     * if it is not null, or directly to the container otherwise.</p>
+     *
+     * @param message Message to be logged
+     * @param throwable Exception to be logged
+     */
+    private void log(String message, Throwable throwable) {
+
+        FacesContext context = FacesContext.getCurrentInstance();
+        if (context != null) {
+            context.getExternalContext().log(message);
+        } else {
+            System.out.println(message);
+        }
 
     }