Author: struberg
Date: Tue Jan 15 09:46:28 2013
New Revision: 1433330
URL: http://svn.apache.org/viewvc?rev=1433330&view=rev
Log:
OWB-344 imporove interception tests and hooks
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
Tue Jan 15 09:46:28 2013
@@ -20,6 +20,7 @@ package org.apache.webbeans.intercept;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
+import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Bean;
@@ -27,6 +28,7 @@ import javax.enterprise.inject.spi.BeanM
import javax.enterprise.inject.spi.Decorator;
import javax.enterprise.inject.spi.InterceptionType;
import javax.enterprise.inject.spi.Interceptor;
+import javax.interceptor.ExcludeClassInterceptors;
import javax.interceptor.Interceptors;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
@@ -93,13 +95,14 @@ public class InterceptorResolutionServic
AnnotationManager annotationManager =
webBeansContext.getAnnotationManager();
BeanManager beanManager = webBeansContext.getBeanManagerImpl();
- List<Interceptor> classLevelEjbInterceptors = new
ArrayList<Interceptor>();
-
// pick up CDI interceptors from a class level
Set<Annotation> classInterceptorBindings =
annotationManager.getInterceptorAnnotations(annotatedType.getAnnotations());
- //X pick up EJB-style interceptors from a class level
- Interceptors interceptorsAnnot =
annotatedType.getAnnotation(Interceptors.class);
+ // pick up EJB-style interceptors from a class level
+ Set<Interceptor<?>> allUsedEjbInterceptors = new
HashSet<Interceptor<?>>();
+ List<Interceptor<?>> classLevelEjbInterceptors = new
ArrayList<Interceptor<?>>();
+
+ collectEjbInterceptors(classLevelEjbInterceptors, annotatedType);
// pick up the decorators
List<Decorator<?>> decorators =
beanManager.resolveDecorators(bean.getTypes(),
AnnotationUtil.asArray(bean.getQualifiers()));
@@ -109,7 +112,6 @@ public class InterceptorResolutionServic
}
Set<Interceptor<?>> allUsedCdiInterceptors = new
HashSet<Interceptor<?>>();
- Set<Interceptor<?>> allUsedEjbInterceptors = new
HashSet<Interceptor<?>>();
Map<Method, MethodInterceptorInfo> businessMethodInterceptorInfos =
new HashMap<Method, MethodInterceptorInfo>();
@@ -119,7 +121,7 @@ public class InterceptorResolutionServic
InterceptionType interceptionType =
calculateInterceptionType(annotatedMethod);
MethodInterceptorInfo methodInterceptorInfo = new
MethodInterceptorInfo(interceptionType);
- calculateEjbMethodInterceptors(methodInterceptorInfo,
allUsedEjbInterceptors, interceptorsAnnot);
+ calculateEjbMethodInterceptors(methodInterceptorInfo,
allUsedEjbInterceptors, classLevelEjbInterceptors, annotatedMethod);
calculateCdiMethodInterceptors(methodInterceptorInfo,
allUsedCdiInterceptors, annotatedMethod, classInterceptorBindings);
@@ -143,15 +145,43 @@ public class InterceptorResolutionServic
return new BeanInterceptorInfo(decorators, allUsedCdiInterceptors,
businessMethodInterceptorInfos);
}
- private void calculateEjbMethodInterceptors(MethodInterceptorInfo
methodInterceptorInfo, Set<Interceptor<?>> allUsedEjbInterceptors, Interceptors
interceptorsAnnot)
+ private <T> void collectEjbInterceptors(List<Interceptor<?>>
ejbInterceptors, Annotated annotatedType)
{
- if (interceptorsAnnot == null)
+ Interceptors interceptorsAnnot =
annotatedType.getAnnotation(Interceptors.class);
+ if (interceptorsAnnot != null)
{
- return;
+ for (Class interceptorClass : interceptorsAnnot.value())
+ {
+ Interceptor ejbInterceptor =
webBeansContext.getInterceptorsManager().getEjbInterceptorForClass(interceptorClass);
+ ejbInterceptors.add(ejbInterceptor);
+ }
+ }
+ }
+
+ private void calculateEjbMethodInterceptors(MethodInterceptorInfo
methodInterceptorInfo, Set<Interceptor<?>> allUsedEjbInterceptors,
+ List<Interceptor<?>>
classLevelEjbInterceptors, AnnotatedMethod annotatedMethod)
+ {
+ List<Interceptor<?>> methodInterceptors = new
ArrayList<Interceptor<?>>();
+
+ if (classLevelEjbInterceptors != null &&
classLevelEjbInterceptors.size() > 0)
+ {
+ // add the class level defined Interceptors first
+
+ ExcludeClassInterceptors excludeClassInterceptors =
annotatedMethod.getAnnotation(ExcludeClassInterceptors.class);
+ if (excludeClassInterceptors == null)
+ {
+ // but only if there is no exclusion of all class-level
interceptors
+ methodInterceptors.addAll(classLevelEjbInterceptors);
+ }
}
- Class<?>[] ejbInterceptorClasses = interceptorsAnnot.value();
+ collectEjbInterceptors(methodInterceptors, annotatedMethod);
+ allUsedEjbInterceptors.addAll(methodInterceptors);
+ if (methodInterceptors.size() > 0)
+ {
+ methodInterceptorInfo.setEjbInterceptors(methodInterceptors);
+ }
}
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java
Tue Jan 15 09:46:28 2013
@@ -74,14 +74,22 @@ public class LifecycleInterceptorInvocat
}
else
{
- for (AnnotatedMethod<?> lifecycleMethod : lifecycleMethods)
- { Method m = lifecycleMethod.getJavaMember();
- if (!m.isAccessible())
- {
- m.setAccessible(true);
+ if (lifecycleMethods != null)
+ {
+ // only if there is a lifecycle method, otherwise re
immediately return
+ for (AnnotatedMethod<?> lifecycleMethod : lifecycleMethods)
+ { Method m = lifecycleMethod.getJavaMember();
+ if (!m.isAccessible())
+ {
+ m.setAccessible(true);
+ }
+ m.invoke(getTarget());
}
- m.invoke(getTarget());
}
+ // else, see interceptors spec
+ // "For lifecycle callback interceptor methods, if there is no
callback method
+ // defined on the target class, the invocation of proceed in the
last
+ // interceptor method in the chain is a no-op, and null is
returned."
return null;
}
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
Tue Jan 15 09:46:28 2013
@@ -53,6 +53,8 @@ import org.apache.webbeans.util.Asserts;
import org.apache.webbeans.util.ExceptionUtil;
+import static
org.apache.webbeans.intercept.InterceptorResolutionService.BeanInterceptorInfo;
+
public class InjectionTargetImpl<T> extends AbstractProducer<T> implements
InjectionTarget<T>
{
@@ -76,6 +78,11 @@ public class InjectionTargetImpl<T> exte
*/
private List<AnnotatedMethod<?>> preDestroyMethods;
+ /**
+ * static information about Interceptors and Decorators of that bean
+ */
+ private BeanInterceptorInfo interceptorInfo;
+
public InjectionTargetImpl(AnnotatedType<T> annotatedType,
Set<InjectionPoint> points, WebBeansContext webBeansContext,
List<AnnotatedMethod<?>> postConstructMethods,
List<AnnotatedMethod<?>> preDestroyMethods)
{
@@ -88,10 +95,23 @@ public class InjectionTargetImpl<T> exte
this.preDestroyMethods = preDestroyMethods;
}
+ public void setInterceptorInfo(BeanInterceptorInfo interceptorInfo)
+ {
+ this.interceptorInfo = interceptorInfo;
+ }
+
@Override
public T produce(CreationalContext<T> creationalContext)
{
- return new InjectableConstructor<T>(getConstructor().getJavaMember(),
this, (CreationalContextImpl<T>) creationalContext).doInjection();
+ T instance = new
InjectableConstructor<T>(getConstructor().getJavaMember(), this,
(CreationalContextImpl<T>) creationalContext).doInjection();
+
+ if (interceptorInfo != null)
+ {
+ // apply interceptorInfo
+ interceptorInfo.getInterceptors();
+ }
+
+ return instance;
}
@Override
@@ -169,7 +189,7 @@ public class InjectionTargetImpl<T> exte
@Override
public void postConstruct(T instance)
{
- if (postConstructMethods == null)
+ if (postConstructMethods == null /*X TODO && postConstructInterceptors
== null */)
{
return;
}
Modified:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
Tue Jan 15 09:46:28 2013
@@ -84,6 +84,8 @@ public class NewProxyTest extends Abstra
RuntimeExceptionBindingTypeBean instance =
factory.createProxyInstance(proxyClass, target, interceptorHandler);
int result = instance.business();
Assert.assertEquals(42, result);
+
+ Assert.assertEquals(1, interceptor.invoked);
shutDownContainer();
Modified:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java
Tue Jan 15 09:46:28 2013
@@ -32,11 +32,14 @@ import javax.interceptor.InvocationConte
@RuntimeExceptions
public class RuntimeExceptionsInterceptor
{
+ public int invoked = 0;
+
@AroundInvoke
public Object invoke(InvocationContext context)
{
try
{
+ invoked++;
return context.proceed();
}
catch (Exception e)