You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by co...@apache.org on 2010/06/18 02:36:58 UTC
svn commit: r955801 - in /openwebbeans/trunk:
webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/interceptor/OpenWebBeansEjbInterceptor.java
webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
Author: covener
Date: Fri Jun 18 00:36:58 2010
New Revision: 955801
URL: http://svn.apache.org/viewvc?rev=955801&view=rev
Log:
[OWB-389] fix EJB's that are decorated and intercepted, a new WebBeansDecoratorInterceptor
(and DelegateHandler) is needed for each invocation but was being kept around in
the by-method cache of InterceptorDataImpl. This intermittently caused
the wrong EJB InvocationContext to be used at the end of the decorator stack.
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/intercept/InterceptorHandler.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=955801&r1=955800&r2=955801&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 Fri Jun 18 00:36:58 2010
@@ -248,9 +248,9 @@ public class OpenWebBeansEjbInterceptor
{
runPrePostForNonContextual(context, InterceptorType.POST_CONSTRUCT);
}
-
- if (OpenWebBeansConfiguration.getInstance().isUseEJBInterceptorInjection())
- {
+
+ if (OpenWebBeansConfiguration.getInstance().isUseEJBInterceptorInjection())
+ {
Object instance = context.getTarget();
this.injector = new OWBInjector();
try
@@ -485,7 +485,8 @@ public class OpenWebBeansEjbInterceptor
{
CallReturnValue rv = new CallReturnValue();
InjectionTargetBean<?> injectionTarget = (InjectionTargetBean<?>) threadLocal.get();
-
+ InterceptorDataImpl decoratorInterceptorDataImpl = null;
+
String methodName = method.getName();
if(ClassUtil.isObjectMethod(methodName) && !methodName.equals("toString"))
{
@@ -498,6 +499,8 @@ public class OpenWebBeansEjbInterceptor
List<Object> decorators = null;
DelegateHandler delegateHandler = null;
+ logger.debug("Decorator stack for target {0}", injectionTarget.getDecoratorStack());
+
if (injectionTarget.getDecoratorStack().size() > 0)
{
Class<?> proxyClass = JavassistProxyFactory.getInterceptorProxyClasses().get(injectionTarget);
@@ -523,7 +526,16 @@ public class OpenWebBeansEjbInterceptor
List<InterceptorData> interceptorStack = injectionTarget.getInterceptorStack();
if (interceptorStack.size() > 0)
{
- if(this.interceptedMethodMap.get(method) == null)
+ if (decorators != null)
+ {
+ // We have interceptors and decorators, Our delegateHandler will need to be wrapped in an interceptor
+ WebBeansDecoratorInterceptor lastInterceptor = new WebBeansDecoratorInterceptor(delegateHandler, instance);
+ decoratorInterceptorDataImpl = new InterceptorDataImpl(true, lastInterceptor);
+ decoratorInterceptorDataImpl.setDefinedInInterceptorClass(true);
+ decoratorInterceptorDataImpl.setAroundInvoke(SecurityUtil.doPrivilegedGetDeclaredMethods(lastInterceptor.getClass())[0]);
+ }
+
+ if (this.interceptedMethodMap.get(method) == null)
{
//Holds filtered interceptor stack
List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>(interceptorStack);
@@ -531,28 +543,22 @@ public class OpenWebBeansEjbInterceptor
// Filter both EJB and WebBeans interceptors
InterceptorUtil.filterCommonInterceptorStackList(filteredInterceptorStack, method);
- logger.debug("Interceptor stack for method {0}: {1}", method, filteredInterceptorStack);
- // If there are both interceptors and decorators, add hook
- // point to the end of the interceptor stack.
- if (decorators != null && filteredInterceptorStack.size() > 0)
- {
- WebBeansDecoratorInterceptor lastInterceptor = new WebBeansDecoratorInterceptor(delegateHandler, instance);
- InterceptorDataImpl data = new InterceptorDataImpl(true,lastInterceptor);
- data.setDefinedInInterceptorClass(true);
- data.setAroundInvoke(SecurityUtil.doPrivilegedGetDeclaredMethods(lastInterceptor.getClass())[0]);
- //Add to last
- filteredInterceptorStack.add(data);
- }
-
this.interceptedMethodMap.put(method, filteredInterceptorStack);
}
+ List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>(this.interceptedMethodMap.get(method));
+ if (decoratorInterceptorDataImpl != null)
+ {
+ // created an intereceptor to run our decorators, add it to the calculated stack
+ filteredInterceptorStack.add(decoratorInterceptorDataImpl);
+ }
+
// Call Around Invokes
- if (WebBeansUtil.isContainsInterceptorMethod(this.interceptedMethodMap.get(method), InterceptorType.AROUND_INVOKE))
+ if (WebBeansUtil.isContainsInterceptorMethod(filteredInterceptorStack, InterceptorType.AROUND_INVOKE))
{
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);
+ arguments, InterceptorUtil.getInterceptorMethods(filteredInterceptorStack, InterceptorType.AROUND_INVOKE), ejbContext);
return rv;
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=955801&r1=955800&r2=955801&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java Fri Jun 18 00:36:58 2010
@@ -194,10 +194,13 @@ public abstract class InterceptorHandler
{
InjectionTargetBean<?> injectionTarget = (InjectionTargetBean<?>) this.bean;
DelegateHandler delegateHandler = null;
+ InterceptorDataImpl decoratorInterceptorDataImpl = null;
+
//Check method is business method
if (InterceptorUtil.isWebBeansBusinessMethod(method))
{
List<Object> decorators = null;
+ logger.debug("Decorator stack for target {0}", injectionTarget.getDecoratorStack());
if (injectionTarget.getDecoratorStack().size() > 0)
{
Class<?> proxyClass = JavassistProxyFactory.getInterceptorProxyClasses().get(bean);
@@ -215,14 +218,21 @@ public abstract class InterceptorHandler
decorators = WebBeansDecoratorConfig.getDecoratorStack(injectionTarget, instance, delegate, ownerCreationalContext);
//Sets decorator stack of delegate
delegateHandler.setDecorators(decorators);
-
}
// Run around invoke chain
List<InterceptorData> interceptorStack = injectionTarget.getInterceptorStack();
if (interceptorStack.size() > 0)
{
- if(this.interceptedMethodMap.get(method) == null)
+ if (decorators != null)
+ {
+ // We have interceptors and decorators, Our delegateHandler will need to be wrapped in an interceptor
+ WebBeansDecoratorInterceptor lastInterceptor = new WebBeansDecoratorInterceptor(delegateHandler, instance);
+ decoratorInterceptorDataImpl = new InterceptorDataImpl(true, lastInterceptor);
+ decoratorInterceptorDataImpl.setDefinedInInterceptorClass(true);
+ decoratorInterceptorDataImpl.setAroundInvoke(SecurityUtil.doPrivilegedGetDeclaredMethods(lastInterceptor.getClass())[0]);
+ }
+ if (this.interceptedMethodMap.get(method) == null)
{
//Holds filtered interceptor stack
List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>(interceptorStack);
@@ -230,28 +240,22 @@ public abstract class InterceptorHandler
// Filter both EJB and WebBeans interceptors
InterceptorUtil.filterCommonInterceptorStackList(filteredInterceptorStack, method);
- // If there are both interceptors and decorators, add hook
- // point to the end of the interceptor stack.
- if (decorators != null && filteredInterceptorStack.size() > 0)
- {
- WebBeansDecoratorInterceptor lastInterceptor = new WebBeansDecoratorInterceptor(delegateHandler, instance);
- InterceptorDataImpl data = new InterceptorDataImpl(true,lastInterceptor);
- data.setDefinedInInterceptorClass(true);
- data.setAroundInvoke(SecurityUtil.doPrivilegedGetDeclaredMethods(lastInterceptor.getClass())[0]);
- //Add to last
- filteredInterceptorStack.add(data);
- }
-
this.interceptedMethodMap.put(method, filteredInterceptorStack);
}
+ List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>(this.interceptedMethodMap.get(method));
+ if (decoratorInterceptorDataImpl != null)
+ {
+ // created an intereceptor to run our decorators, add it to the calculated stack
+ filteredInterceptorStack.add(decoratorInterceptorDataImpl);
+ }
+
// Call Around Invokes
- if (WebBeansUtil.isContainsInterceptorMethod(this.interceptedMethodMap.get(method), InterceptorType.AROUND_INVOKE))
+ if (WebBeansUtil.isContainsInterceptorMethod(filteredInterceptorStack, InterceptorType.AROUND_INVOKE))
{
- return callAroundInvokes(method, arguments, InterceptorUtil.getInterceptorMethods(this.interceptedMethodMap.get(method),
+ return callAroundInvokes(method, arguments, InterceptorUtil.getInterceptorMethods(filteredInterceptorStack,
InterceptorType.AROUND_INVOKE));
}
-
}
// If there are Decorators, allow the delegate handler to