You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ge...@apache.org on 2010/04/25 22:50:25 UTC

svn commit: r937872 - in /openwebbeans/trunk: webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java

Author: gerdogdu
Date: Sun Apr 25 20:50:24 2010
New Revision: 937872

URL: http://svn.apache.org/viewvc?rev=937872&view=rev
Log:
Updating EJB interceptor/decorator handling for the case no interceptor/decorator exist for EJB.

Modified:
    openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java

Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java?rev=937872&r1=937871&r2=937872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java Sun Apr 25 20:50:24 2010
@@ -103,6 +103,12 @@ public class OpenWebBeansEjbInterceptor
         
     }
     
+    private static class CallReturnValue
+    {
+        public boolean INTERCEPTOR_OR_DECORATOR_CALL = false;
+        public Object RETURN_VALUE = null;
+    }
+    
     /**
      * Sets thread local.
      * @param ejbBean bean
@@ -121,6 +127,9 @@ public class OpenWebBeansEjbInterceptor
     {
         threadLocal.set(null);
         threadLocalCreationalContext.set(null);
+        
+        threadLocal.remove();
+        threadLocalCreationalContext.remove();
     }
     
     /**
@@ -132,7 +141,7 @@ public class OpenWebBeansEjbInterceptor
     @AroundInvoke
     public Object callToOwbInterceptors(InvocationContext ejbContext) throws Exception
     {
-        Object rv = null;
+        CallReturnValue rv = null;
         boolean requestCreated = false;
         boolean applicationCreated = false;
         boolean requestAlreadyActive = false;
@@ -182,7 +191,14 @@ public class OpenWebBeansEjbInterceptor
             }
         }
         
-        return rv;
+        //If bean has no interceptor or decorator
+        //Call ejb bean instance
+        if(!rv.INTERCEPTOR_OR_DECORATOR_CALL)
+        {
+            return ejbContext.proceed();
+        }
+        
+        return rv.RETURN_VALUE;
     }
     
     /**
@@ -342,7 +358,7 @@ public class OpenWebBeansEjbInterceptor
      * @return result of operation
      * @throws Exception for any exception
      */    
-    private Object callInterceptorsForNonContextuals(Method method, Object instance, Object[] arguments, InvocationContext ejbContext) throws Exception
+    private CallReturnValue callInterceptorsForNonContextuals(Method method, Object instance, Object[] arguments, InvocationContext ejbContext) throws Exception
     {
         BeanManagerImpl manager = BeanManagerImpl.getManager();
         
@@ -366,17 +382,19 @@ public class OpenWebBeansEjbInterceptor
             }
         }        
         
+        CallReturnValue rv = new CallReturnValue();
+        rv.INTERCEPTOR_OR_DECORATOR_CALL = false;
         if(ejbBean == null)
         {
             logger.warn("Unable to find EJB bean with class : " + instance.getClass());
+            return rv;
         }
         else
         {
             CreationalContext<?> cc = manager.createCreationalContext(null);
             return runInterceptorStack(ejbBean.getInterceptorStack(), method, instance, arguments, ejbBean, cc, ejbContext);
         }
-        
-        return null;
+
     }
     
     /**
@@ -387,14 +405,15 @@ public class OpenWebBeansEjbInterceptor
      * @return result of operation
      * @throws Exception for any exception
      */
-    private Object callInterceptorsAndDecorators(Method method, Object instance, Object[] arguments, InvocationContext ejbContext) throws Exception
+    private CallReturnValue callInterceptorsAndDecorators(Method method, Object instance, Object[] arguments, InvocationContext ejbContext) throws Exception
     {
+        CallReturnValue rv = new CallReturnValue();
         InjectionTargetBean<?> injectionTarget = (InjectionTargetBean<?>) threadLocal.get();
         
         String methodName = method.getName();
         if(ClassUtil.isObjectMethod(methodName) && !methodName.equals("toString"))
         {
-            logger.warn("Calling method on proxy is restricted except Object.toString(), but current method is Object." + methodName);
+            logger.trace("Calling method on proxy is restricted except Object.toString(), but current method is Object." + methodName);
         }
                 
         if (InterceptorUtil.isWebBeansBusinessMethod(method) && 
@@ -413,7 +432,7 @@ public class OpenWebBeansEjbInterceptor
                     JavassistProxyFactory.getInterceptorProxyClasses().put(injectionTarget, proxyClass);
                 }
                 Object delegate = proxyClass.newInstance();
-                delegateHandler = new DelegateHandler(threadLocal.get());
+                delegateHandler = new DelegateHandler(threadLocal.get(),ejbContext);
                 ((ProxyObject)delegate).setHandler(delegateHandler);
 
                 // Gets component decorator stack
@@ -453,8 +472,11 @@ public class OpenWebBeansEjbInterceptor
                 // Call Around Invokes
                 if (WebBeansUtil.isContainsInterceptorMethod(this.interceptedMethodMap.get(method), InterceptorType.AROUND_INVOKE))
                 {
-                     return InterceptorUtil.callAroundInvokes(threadLocal.get(), instance, (CreationalContextImpl<?>)threadLocalCreationalContext.get(), method, 
+                     rv.INTERCEPTOR_OR_DECORATOR_CALL = true;
+                     rv.RETURN_VALUE = InterceptorUtil.callAroundInvokes(threadLocal.get(), instance, (CreationalContextImpl<?>)threadLocalCreationalContext.get(), method, 
                             arguments, InterceptorUtil.getInterceptorMethods(this.interceptedMethodMap.get(method), InterceptorType.AROUND_INVOKE), ejbContext);
+                     
+                     return rv;
                 }
                 
             }
@@ -463,16 +485,21 @@ public class OpenWebBeansEjbInterceptor
             // manage the stack
             if (decorators != null)
             {
-                return delegateHandler.invoke(instance, method, null, arguments);
+                rv.INTERCEPTOR_OR_DECORATOR_CALL = true;
+                rv.RETURN_VALUE = delegateHandler.invoke(instance, method, null, arguments); 
+                return rv;
             }
         }    
         
-        return null;
+        rv.INTERCEPTOR_OR_DECORATOR_CALL = false;
+        
+        return rv;
     }
     
-    private Object runInterceptorStack(List<InterceptorData> interceptorStack, Method method, Object instance, 
+    private CallReturnValue runInterceptorStack(List<InterceptorData> interceptorStack, Method method, Object instance, 
                                         Object[] arguments, BaseEjbBean<?> bean, CreationalContext<?> creationalContext, InvocationContext ejbContext) throws Exception
     {
+        CallReturnValue rv = new CallReturnValue();
         if (interceptorStack.size() > 0)
         {
             if(this.nonCtxInterceptedMethodMap.get(method) == null)
@@ -488,15 +515,19 @@ public class OpenWebBeansEjbInterceptor
             // Call Around Invokes
             if (WebBeansUtil.isContainsInterceptorMethod(this.nonCtxInterceptedMethodMap.get(method), InterceptorType.AROUND_INVOKE))
             {
-                 return InterceptorUtil.callAroundInvokes(bean, instance, (CreationalContextImpl<?>)creationalContext, method, 
+                 rv.INTERCEPTOR_OR_DECORATOR_CALL = true;
+                 rv.RETURN_VALUE = InterceptorUtil.callAroundInvokes(bean, instance, (CreationalContextImpl<?>)creationalContext, method, 
                         arguments, InterceptorUtil.getInterceptorMethods(this.nonCtxInterceptedMethodMap.get(method), InterceptorType.AROUND_INVOKE),
                         ejbContext);
+                 
+                 return rv;
             }
             
         }
         
+        rv.INTERCEPTOR_OR_DECORATOR_CALL = false;
         
-        return null;
+        return rv;
         
     }
     

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java?rev=937872&r1=937871&r2=937872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java Sun Apr 25 20:50:24 2010
@@ -17,6 +17,8 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Method;
 import java.util.List;
 
+import javax.interceptor.InvocationContext;
+
 import org.apache.webbeans.component.EnterpriseBeanMarker;
 import org.apache.webbeans.component.OwbBean;
 import org.apache.webbeans.config.OWBLogConst;
@@ -36,12 +38,20 @@ public class DelegateHandler implements 
     private transient Object actualBean = null;
     
     private transient OwbBean<?> bean = null;
+    
+    private transient InvocationContext ejbContext;
 
     public DelegateHandler(OwbBean<?> bean)
     {
         this.bean = bean;
     }
     
+    public DelegateHandler(OwbBean<?> bean, InvocationContext ejbContext)
+    {
+        this.bean = bean;
+        this.ejbContext = ejbContext;
+    }    
+    
     @Override
     public Object invoke(Object instance, Method method, Method proceed, Object[] arguments) throws Exception
     {
@@ -109,6 +119,13 @@ public class DelegateHandler implements 
         {
             result = method.invoke(actualBean, arguments);
         }
+        else
+        {
+            if(ejbContext != null)
+            {
+                result = ejbContext.proceed();
+            }
+        }
         
         return result;
 



Re: svn commit: r937872 - in /openwebbeans/trunk: webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java

Posted by Eric Covener <co...@gmail.com>.
>     @Override
>     public Object invoke(Object instance, Method method, Method proceed, Object[] arguments) throws Exception
>     {
> @@ -109,6 +119,13 @@ public class DelegateHandler implements
>         {
>             result = method.invoke(actualBean, arguments);
>         }
> +        else
> +        {
> +            if(ejbContext != null)
> +            {
> +                result = ejbContext.proceed();
> +            }
> +        }
>
>         return result;

FYI I am looking at this change now, appears to be broken when a
decorator of an EJB calls a method with a different signature on the
delegate

IOW:

299bean.echo()
  Decorator1.delegate.otherMethod()
     ejbcontext.proceed()
         realejb.echo()

Ultimately results in a ClassCastException between return type of
echo() and othermethod() that is obfuscated by a number of proxies.





-- 
Eric Covener
covener@gmail.com