You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2013/01/15 10:46:29 UTC
svn commit: r1433330 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/intercept/
main/java/org/apache/webbeans/portable/
test/java/org/apache/webbeans/newtests/interceptors/business/tests/
test/java/org/apache/webbeans/newtests...
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)