Author: lukaszlenart
Date: Thu May 23 11:14:20 2013
New Revision: 1485645

URL: http://svn.apache.org/r1485645
Log:
WW-4052 Extends interceptor to propagate params during exception handling

Modified:
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptor.java

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptor.java?rev=1485645&r1=1485644&r2=1485645&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptor.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ExceptionMappingInterceptor.java
 Thu May 23 11:14:20 2013
@@ -20,7 +20,9 @@ import com.opensymphony.xwork2.config.en
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <!-- START SNIPPET: description -->
@@ -190,9 +192,12 @@ public class ExceptionMappingInterceptor
                 handleLogging(e);
             }
             List<ExceptionMappingConfig> exceptionMappings = 
invocation.getProxy().getConfig().getExceptionMappings();
-            String mappedResult = 
this.findResultFromExceptions(exceptionMappings, e);
-            if (mappedResult != null) {
-                result = mappedResult;
+            ExceptionMappingConfig mappingConfig = 
this.findMappingFromExceptions(exceptionMappings, e);
+            if (mappingConfig != null && mappingConfig.getResult()!=null) {
+                Map parameterMap = mappingConfig.getParams();
+                // create a mutable HashMap since some interceptors will 
remove parameters, and parameterMap is immutable
+                invocation.getInvocationContext().setParameters(new 
HashMap<String, Object>(parameterMap));
+                result = mappingConfig.getResult();
                 publishException(invocation, new ExceptionHolder(e));
             } else {
                 throw e;
@@ -248,9 +253,23 @@ public class ExceptionMappingInterceptor
        }
     }
 
+    /**
+     * @deprecated since 2.3.15 please use #findMappingFromExceptions directly 
instead
+     */
     protected String findResultFromExceptions(List<ExceptionMappingConfig> 
exceptionMappings, Throwable t) {
-        String result = null;
+       ExceptionMappingConfig result = 
findMappingFromExceptions(exceptionMappings, t);
+        return result==null?null:result.getResult();
+    }
 
+    /**
+     * Try to find appropriate {@link ExceptionMappingConfig} based on 
provided Throwable
+     *
+     * @param exceptionMappings list of defined exception mappings
+     * @param t caught exception
+     * @return appropriate mapping or null
+     */
+    protected ExceptionMappingConfig 
findMappingFromExceptions(List<ExceptionMappingConfig> exceptionMappings, 
Throwable t) {
+       ExceptionMappingConfig config = null;
         // Check for specific exception mappings.
         if (exceptionMappings != null) {
             int deepest = Integer.MAX_VALUE;
@@ -259,12 +278,11 @@ public class ExceptionMappingInterceptor
                 int depth = 
getDepth(exceptionMappingConfig.getExceptionClassName(), t);
                 if (depth >= 0 && depth < deepest) {
                     deepest = depth;
-                    result = exceptionMappingConfig.getResult();
+                    config = exceptionMappingConfig;
                 }
             }
         }
-
-        return result;
+        return config;
     }
 
     /**
@@ -301,4 +319,5 @@ public class ExceptionMappingInterceptor
     protected void publishException(ActionInvocation invocation, 
ExceptionHolder exceptionHolder) {
         invocation.getStack().push(exceptionHolder);
     }
+
 }


Reply via email to