You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mc...@apache.org on 2011/01/18 23:42:54 UTC

svn commit: r1060603 - in /struts/struts2/trunk/xwork-core: ./ src/main/java/com/opensymphony/xwork2/interceptor/PrepareInterceptor.java src/test/java/com/opensymphony/xwork2/interceptor/PrepareInterceptorTest.java

Author: mcucchiara
Date: Tue Jan 18 22:42:54 2011
New Revision: 1060603

URL: http://svn.apache.org/viewvc?rev=1060603&view=rev
Log:
WW-3559 - PrepareInterceptor is eating exceptions that occur in prepare{methodName} methods

Modified:
    struts/struts2/trunk/xwork-core/   (props changed)
    struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/PrepareInterceptor.java
    struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/PrepareInterceptorTest.java

Propchange: struts/struts2/trunk/xwork-core/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Tue Jan 18 22:42:54 2011
@@ -1,11 +1,10 @@
+cobertura.ser
 *.ipr
+.classpath
 *.iws
-*.iml
-build
-dist
 .project
-.classpath
+target
 ivyrep.properties
-cobertura.ser
+build
 .settings
-target
+dist

Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/PrepareInterceptor.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/PrepareInterceptor.java?rev=1060603&r1=1060602&r2=1060603&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/PrepareInterceptor.java (original)
+++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/PrepareInterceptor.java Tue Jan 18 22:42:54 2011
@@ -1,4 +1,5 @@
 /*
+ * $Id$
  * Copyright 2002-2007,2009 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -99,8 +100,6 @@ public class PrepareInterceptor extends 
 
     private static final long serialVersionUID = -5216969014510719786L;
 
-    private static final Logger LOG = LoggerFactory.getLogger(PrepareInterceptor.class);
-
     private final static String PREPARE_PREFIX = "prepare";
     private final static String ALT_PREPARE_PREFIX = "prepareDo";
 
@@ -144,18 +143,24 @@ public class PrepareInterceptor extends 
                 PrefixMethodInvocationUtil.invokePrefixMethod(invocation, prefixes);
             }
             catch (InvocationTargetException e) {
-                // just in case there's an exception while doing reflection,
-                // we still want prepare() to be able to get called.
-                LOG.warn("an exception occured while trying to execute prefixed method", e);
-            }
-            catch (IllegalAccessException e) {
-                // just in case there's an exception while doing reflection,
-                // we still want prepare() to be able to get called.
-                LOG.warn("an exception occured while trying to execute prefixed method", e);
-            } catch (Exception e) {
-                // just in case there's an exception while doing reflection,
-                // we still want prepare() to be able to get called.
-                LOG.warn("an exception occured while trying to execute prefixed method", e);
+                /*
+                 * The invoked method threw an exception and reflection wrapped it
+                 * in an InvocationTargetException.
+                 * If possible re-throw the original exception so that normal
+                 * exception handling will take place.
+                 */
+                Throwable cause = e.getCause();
+                if (cause instanceof Exception) {
+                    throw (Exception) cause;
+                } else if(cause instanceof Error) {
+                    throw (Error) cause;
+                } else {
+                    /*
+                     * The cause is not an Exception or Error (must be Throwable) so
+                     * just re-throw the wrapped exception.
+                     */
+                    throw e;
+                }
             }
 
             if (alwaysInvokePrepare) {

Modified: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/PrepareInterceptorTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/PrepareInterceptorTest.java?rev=1060603&r1=1060602&r2=1060603&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/PrepareInterceptorTest.java (original)
+++ struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/PrepareInterceptorTest.java Tue Jan 18 22:42:54 2011
@@ -1,4 +1,5 @@
 /*
+ * $Id$
  * Copyright 2002-2007,2009 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -175,7 +176,25 @@ public class PrepareInterceptorTest exte
     	controlActionProxy.verify();
     	controlActionInvocation.verify();
     }
-    
+
+    public void testPrepareThrowException() throws Exception {
+        MockActionInvocation mai = new MockActionInvocation();
+        MockActionProxy mockActionProxy = new MockActionProxy();
+        mockActionProxy.setMethod("submit");
+        mai.setProxy(mockActionProxy);
+        mai.setAction(mock.proxy());
+
+        IllegalAccessException illegalAccessException = new IllegalAccessException();
+        mock.expectAndThrow("prepareSubmit", illegalAccessException);
+        mock.matchAndThrow("prepare", new RuntimeException());
+
+        try {
+            interceptor.intercept(mai);
+            fail("Should not have reached this point.");
+        } catch (Throwable t) {
+            assertSame(illegalAccessException, t);
+        }
+    }
 
     @Override
     protected void setUp() throws Exception {
@@ -196,7 +215,7 @@ public class PrepareInterceptorTest exte
      * @author tm_jee
      */
     public interface ActionInterface extends Action, Preparable {
-    	void prepareSubmit();
+    	void prepareSubmit() throws Exception;
     }
 
 }