Author: mrdon
Date: Mon Jul 10 21:08:40 2006
New Revision: 420703

URL: http://svn.apache.org/viewvc?rev=420703&view=rev
Log:
Improving JSF navigation to fail over to configured handler if Struts
result cannot be located
WW-1358

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/FacesSetupInterceptor.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/StrutsNavigationHandler.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/FacesSetupInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/FacesSetupInterceptor.java?rev=420703&r1=420702&r2=420703&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/FacesSetupInterceptor.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/FacesSetupInterceptor.java
 Mon Jul 10 21:08:40 2006
@@ -83,7 +83,8 @@
                                .getFactory(FactoryFinder.APPLICATION_FACTORY))
                                .getApplication();
                if (!(application.getNavigationHandler() instanceof 
StrutsNavigationHandler)) {
-                       application.setNavigationHandler(new 
StrutsNavigationHandler());
+                       application.setNavigationHandler(new 
StrutsNavigationHandler(
+                    application.getNavigationHandler()));
                }
                if (!(application.getVariableResolver() instanceof 
StrutsVariableResolver)) {
                        application.setVariableResolver(new 
StrutsVariableResolver(

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/StrutsNavigationHandler.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/StrutsNavigationHandler.java?rev=420703&r1=420702&r2=420703&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/StrutsNavigationHandler.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/jsf/StrutsNavigationHandler.java
 Mon Jul 10 21:08:40 2006
@@ -17,19 +17,37 @@
  */
 package org.apache.struts2.jsf;
 
+import java.util.Map;
+
+import javax.faces.FactoryFinder;
 import javax.faces.application.NavigationHandler;
 import javax.faces.context.FacesContext;
 
 import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+import com.opensymphony.xwork2.config.entities.ResultConfig;
 
 /**
  * Overrides the JFS navigation by delegating the result to handling by the 
core
- * result code lookup and execution.
+ * result code lookup and execution.  If a result cannot be found, the previous
+ * NavigationHandler is called.
  */
 public class StrutsNavigationHandler extends NavigationHandler {
+    
+    private NavigationHandler parent;
+    
+    /**
+     * Creates the handler
+     * 
+     * @param handler The old NavigationHandler to possibly delegate to
+     */
+    public StrutsNavigationHandler(NavigationHandler handler) {
+        this.parent = handler;
+    }
 
        /**
-        * Stores any outcomes as the result code
+        * Stores any outcomes as the result code, failing over to the old
+     * NavigationHandler
         * 
         * @param facesContext The faces context
         * @param fromAction The action we are coming from
@@ -39,7 +57,27 @@
        public void handleNavigation(FacesContext facesContext, String 
fromAction, String outcome) {
                ActionContext ctx = ActionContext.getContext();
                if (outcome != null) {
-                       ctx.getActionInvocation().setResultCode(outcome);
+            ActionConfig config = 
ctx.getActionInvocation().getProxy().getConfig();
+            Map results = config.getResults();
+
+            ResultConfig resultConfig = null;
+
+            synchronized (config) {
+                try {
+                    resultConfig = (ResultConfig) results.get(outcome);
+                } catch (NullPointerException e) {
+                }
+                if (resultConfig == null) {
+                    // If no result is found for the given resultCode, try to 
get a wildcard '*' match.
+                    resultConfig = (ResultConfig) results.get("*");
+                }
+            }
+            if (resultConfig != null) {
+                ctx.getActionInvocation().setResultCode(outcome);
+            } else {
+                // Failing over to parent handler
+                parent.handleNavigation(facesContext, fromAction, outcome);
+            }
                }
        }
 


Reply via email to