You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by ge...@apache.org on 2011/05/26 05:46:46 UTC

svn commit: r1127780 - /openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java

Author: genspring
Date: Thu May 26 03:46:45 2011
New Revision: 1127780

URL: http://svn.apache.org/viewvc?rev=1127780&view=rev
Log:
OPENEJB-1558 Clean up exception handling logic in async.There are some requirements on the exceptions when executing async method:

1, Unchecked exception must be wrapped with EJBExcpetion before being wrraped with ExecutionException and throwing out.
2, All checked exception should be wrapped with ExecutionException before throwing out.

The client code could get the root exception from the aync method with ExecutionException.getCause();

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java?rev=1127780&r1=1127779&r2=1127780&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbObjectProxyHandler.java Thu May 26 03:46:45 2011
@@ -33,6 +33,7 @@ import java.util.concurrent.TimeoutExcep
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.ejb.AccessLocalException;
+import javax.ejb.ConcurrentAccessTimeoutException;
 import javax.ejb.EJBAccessException;
 import javax.ejb.EJBException;
 import javax.ejb.EJBLocalObject;
@@ -356,7 +357,16 @@ public abstract class EjbObjectProxyHand
             if(canceled) {
                 throw new CancellationException();
             }
-            return target.get();
+            
+            T object = null;
+
+            try {
+                object = target.get();
+            } catch (Throwable e) {
+                handleException(e);
+            }
+
+            return object;
         }
 
         @Override
@@ -364,7 +374,37 @@ public abstract class EjbObjectProxyHand
             if (canceled) {
                 throw new CancellationException();
             }
-            return target.get(timeout, unit);
+            
+            T object = null;
+
+            try {
+                object = target.get(timeout, unit);
+            } catch (Throwable e) {
+                handleException(e);
+            }
+
+            return object;
+            
+        }
+        
+        private void handleException(Throwable e) throws ExecutionException {
+            
+            //unwarp the exception to find the root cause
+            while (e.getCause() != null) {
+                e = (Throwable) e.getCause();
+            }
+
+            boolean isExceptionUnchecked = (e instanceof Error) || (e instanceof RuntimeException);
+
+            // throw checked excpetion and ConcurrentAccessTimeoutException directly.
+            if (!isExceptionUnchecked || e instanceof EJBException) {
+                throw new ExecutionException(e);
+            }
+
+            // wrap unchecked exception with EJBException before throwing.
+            throw (e instanceof Exception) ? new ExecutionException(new EJBException((Exception) e))
+                    : new ExecutionException(new EJBException(new Exception(e)));
+            
         }
 
         @Override