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/16 15:14:43 UTC
svn commit: r1433946 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/component/
main/java/org/apache/webbeans/component/creation/
main/java/org/apache/webbeans/intercept/
test/java/org/apache/webbeans/newtests/interceptors/fac...
Author: struberg
Date: Wed Jan 16 14:14:43 2013
New Revision: 1433946
URL: http://svn.apache.org/viewvc?rev=1433946&view=rev
Log:
OWB-344 apply interception info in validate phase
doing this during Bean construction is too early as not
all Interceptor<?> might yet be known because they might
get scanned/created only later during class-scanning
Added:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/StereotypeInterceptedClass.java
- copied, changed from r1433842, openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java?rev=1433946&r1=1433945&r2=1433946&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java Wed Jan 16 14:14:43 2013
@@ -24,7 +24,6 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Type;
import java.util.Set;
-import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Decorator;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java?rev=1433946&r1=1433945&r2=1433946&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java Wed Jan 16 14:14:43 2013
@@ -19,13 +19,9 @@
package org.apache.webbeans.component.creation;
import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
@@ -34,8 +30,6 @@ import javax.enterprise.inject.spi.Annot
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.InjectionTarget;
-import javax.enterprise.inject.spi.Interceptor;
import org.apache.webbeans.component.ManagedBean;
import org.apache.webbeans.component.WebBeansType;
@@ -45,10 +39,7 @@ import org.apache.webbeans.decorator.Dec
import org.apache.webbeans.decorator.WebBeansDecoratorConfig;
import org.apache.webbeans.exception.inject.DeploymentException;
import org.apache.webbeans.inject.impl.InjectionPointFactory;
-import org.apache.webbeans.intercept.InterceptorResolutionService;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
-import org.apache.webbeans.portable.InjectionTargetImpl;
-import org.apache.webbeans.proxy.InterceptorDecoratorProxyFactory;
import org.apache.webbeans.portable.AbstractDecoratorInjectionTarget;
import org.apache.webbeans.util.WebBeansUtil;
@@ -143,65 +134,6 @@ public class ManagedBeanBuilder<T, M ext
return webBeansContext.getInterceptorUtil().getLifecycleMethods(getAnnotated(), PreDestroy.class, false);
}
- @Override
- protected InjectionTarget<T> buildInjectionTarget(Set<Type> types, Set<Annotation> qualifiers, AnnotatedType<T> annotatedType, Set<InjectionPoint> points, WebBeansContext webBeansContext, List<AnnotatedMethod<?>> postConstructMethods, List<AnnotatedMethod<?>> preDestroyMethods)
- {
- InjectionTargetImpl<T> injectionTarget = (InjectionTargetImpl<T>) super.buildInjectionTarget(types, qualifiers, annotatedType, points, webBeansContext, postConstructMethods, preDestroyMethods); //To change body of overridden methods use File | Settings | File Templates.
- InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = webBeansContext.getInterceptorResolutionService().calculateInterceptorInfo(types, qualifiers, annotatedType);
-
- Map<Method, List<Interceptor<?>>> methodInterceptors = new HashMap<Method, List<Interceptor<?>>>();
- List<Method> nonBusinessMethods = new ArrayList<Method>();
- for (Map.Entry<Method, InterceptorResolutionService.BusinessMethodInterceptorInfo> miEntry : interceptorInfo.getBusinessMethodsInfo().entrySet())
- {
- Method interceptedMethod = miEntry.getKey();
- InterceptorResolutionService.BusinessMethodInterceptorInfo mii = miEntry.getValue();
- List<Interceptor<?>> activeInterceptors = new ArrayList<Interceptor<?>>();
-
- if (mii.getEjbInterceptors() != null)
- {
- for (Interceptor<?> i : mii.getEjbInterceptors())
- {
- activeInterceptors.add(i);
- }
- }
- if (mii.getCdiInterceptors() != null)
- {
- for (Interceptor<?> i : mii.getCdiInterceptors())
- {
- activeInterceptors.add(i);
- }
- }
- if (activeInterceptors.size() > 0)
- {
- methodInterceptors.put(interceptedMethod, activeInterceptors);
- }
-
- // empty InterceptionType -> AROUND_INVOKE
- if (!mii.getInterceptionTypes().isEmpty())
- {
- nonBusinessMethods.add(interceptedMethod);
- }
- }
-
- if (methodInterceptors.size() > 0)
- {
- // we only need to create a proxy class for intercepted or decorated Beans
- InterceptorDecoratorProxyFactory pf = webBeansContext.getInterceptorDecoratorProxyFactory();
-
- // we take a fresh URLClassLoader to not blur the test classpath with synthetic classes.
- ClassLoader classLoader = this.getClass().getClassLoader();
-
- Method[] businessMethods = methodInterceptors.keySet().toArray(new Method[methodInterceptors.size()]);
- Method[] nonInterceptedMethods = interceptorInfo.getNonInterceptedMethods().toArray(new Method[interceptorInfo.getNonInterceptedMethods().size()]);
-
- Class<? extends T> proxyClass = pf.createProxyClass(classLoader, getBeanType(), businessMethods, nonInterceptedMethods);
-
- injectionTarget.setInterceptorInfo(interceptorInfo, proxyClass, methodInterceptors);
- }
-
- return injectionTarget;
- }
-
/**
* @deprecated replaced via the various {@link InterceptorBeanBuilder}s
*/
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java?rev=1433946&r1=1433945&r2=1433946&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java Wed Jan 16 14:14:43 2013
@@ -21,12 +21,15 @@ package org.apache.webbeans.intercept;
import org.apache.webbeans.annotation.AnnotationManager;
import org.apache.webbeans.component.InjectionTargetBean;
import org.apache.webbeans.component.EnterpriseBeanMarker;
+import org.apache.webbeans.component.InterceptedMarker;
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.intercept.webbeans.WebBeansInterceptorBeanPleaseRemove;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
import org.apache.webbeans.plugins.OpenWebBeansEjbLCAPlugin;
+import org.apache.webbeans.portable.InjectionTargetImpl;
+import org.apache.webbeans.proxy.InterceptorDecoratorProxyFactory;
import org.apache.webbeans.spi.BDABeansXmlScanner;
import org.apache.webbeans.spi.ScannerService;
import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
@@ -46,13 +49,18 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
+import static org.apache.webbeans.intercept.InterceptorResolutionService.BeanInterceptorInfo;
+
+
/**
* Configures the Web Beans related interceptors.
*
@@ -60,7 +68,7 @@ import java.util.logging.Logger;
* @version $Rev$ $Date$
* @see org.apache.webbeans.intercept.webbeans.WebBeansInterceptorBeanPleaseRemove
*
- * @deprecated this class can most probably get removed. All important logic is contained in {@link InterceptorResolutionService}
+ * TODO most of the stuff in this class can most probably get removed. All important logic is contained in {@link InterceptorResolutionService}
*/
public final class WebBeansInterceptorConfig
{
@@ -77,15 +85,83 @@ public final class WebBeansInterceptorCo
/**
* Configure bean instance interceptor stack.
* @param bean bean instance
- * @deprecated old InterceptorData based config
*/
public void defineBeanInterceptorStack(InjectionTargetBean<?> bean)
{
- if (WebBeansContext.TODO_USING_NEW_INTERCEPTORS)
+ if (!WebBeansContext.TODO_USING_NEW_INTERCEPTORS)
{
- return; //X TODO
+ defineBeanInterceptorStackRemove(bean);
+ return;
+ }
+
+ if (bean instanceof InterceptedMarker)
+ {
+ InjectionTargetImpl<?> injectionTarget = (InjectionTargetImpl<?>) bean.getInjectionTarget();
+ BeanInterceptorInfo interceptorInfo = webBeansContext.getInterceptorResolutionService().
+ calculateInterceptorInfo(bean.getTypes(), bean.getQualifiers(), bean.getAnnotatedType());
+
+ Map<Method, List<Interceptor<?>>> methodInterceptors = new HashMap<Method, List<Interceptor<?>>>();
+ List<Method> nonBusinessMethods = new ArrayList<Method>();
+ for (Map.Entry<Method, InterceptorResolutionService.BusinessMethodInterceptorInfo> miEntry : interceptorInfo.getBusinessMethodsInfo().entrySet())
+ {
+ Method interceptedMethod = miEntry.getKey();
+ InterceptorResolutionService.BusinessMethodInterceptorInfo mii = miEntry.getValue();
+ List<Interceptor<?>> activeInterceptors = new ArrayList<Interceptor<?>>();
+
+ if (mii.getEjbInterceptors() != null)
+ {
+ for (Interceptor<?> i : mii.getEjbInterceptors())
+ {
+ activeInterceptors.add(i);
+ }
+ }
+ if (mii.getCdiInterceptors() != null)
+ {
+ for (Interceptor<?> i : mii.getCdiInterceptors())
+ {
+ activeInterceptors.add(i);
+ }
+ }
+ if (activeInterceptors.size() > 0)
+ {
+ methodInterceptors.put(interceptedMethod, activeInterceptors);
+ }
+
+ // empty InterceptionType -> AROUND_INVOKE
+ if (!mii.getInterceptionTypes().isEmpty())
+ {
+ nonBusinessMethods.add(interceptedMethod);
+ }
+ }
+
+ if (methodInterceptors.size() > 0)
+ {
+ // we only need to create a proxy class for intercepted or decorated Beans
+ InterceptorDecoratorProxyFactory pf = webBeansContext.getInterceptorDecoratorProxyFactory();
+
+ // we take a fresh URLClassLoader to not blur the test classpath with synthetic classes.
+ ClassLoader classLoader = this.getClass().getClassLoader();
+
+ Method[] businessMethods = methodInterceptors.keySet().toArray(new Method[methodInterceptors.size()]);
+ Method[] nonInterceptedMethods = interceptorInfo.getNonInterceptedMethods().toArray(new Method[interceptorInfo.getNonInterceptedMethods().size()]);
+
+ Class proxyClass = pf.createProxyClass(classLoader, bean.getReturnType(), businessMethods, nonInterceptedMethods);
+
+ injectionTarget.setInterceptorInfo(interceptorInfo, proxyClass, methodInterceptors);
+ }
+
}
+ }
+
+ /**
+ * Configure bean instance interceptor stack.
+ * @param bean bean instance
+ * @deprecated old InterceptorData based config
+ */
+ public void defineBeanInterceptorStackRemove(InjectionTargetBean<?> bean)
+ {
+
Asserts.assertNotNull(bean, "bean parameter can no be null");
if (!bean.getInterceptorStack().isEmpty())
{
@@ -192,7 +268,7 @@ public final class WebBeansInterceptorCo
/**
* Configures the given class for applicable interceptors.
- *
+ * @deprecated old interceptor stuff
*/
public void configure(InjectionTargetBean<?> component, List<InterceptorData> stack)
{
Copied: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/StereotypeInterceptedClass.java (from r1433842, openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java)
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/StereotypeInterceptedClass.java?p2=openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/StereotypeInterceptedClass.java&p1=openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java&r1=1433842&r2=1433946&rev=1433946&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/ClassInterceptedClass.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/beans/StereotypeInterceptedClass.java Wed Jan 16 14:14:43 2013
@@ -18,51 +18,25 @@
*/
package org.apache.webbeans.newtests.interceptors.factory.beans;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-
-import org.apache.webbeans.test.component.intercept.webbeans.bindings.Transactional;
+import org.apache.webbeans.test.component.intercept.webbeans.bindings.Secure;
/**
- * A simple class which is class-level intercepted
+ * A simple class which is class-level intercepted by a Stereotype.
*/
-@Transactional
-public class ClassInterceptedClass
+public class StereotypeInterceptedClass
{
- private boolean defaultCtInvoked = false;
private int meaningOfLife;
- private float f;
- private char c;
- public ClassInterceptedClass()
- {
- defaultCtInvoked = true;
- }
-
- @PostConstruct
- public void postConstruct()
- {
- System.out.println("postConstruct invoked");
- }
-
- @PreDestroy
- private void preDestroy()
- {
- System.out.println("preDestroy invoked");
- }
public void init()
{
- f = 2.4f;
- c = 'c';
meaningOfLife = 42;
}
+ @Secure
public int getMeaningOfLife() throws NumberFormatException
{
- System.out.println("answering the question about life, the universe and everything!");
- System.out.println("and being in " + this.getClass());
return meaningOfLife;
}
@@ -71,24 +45,10 @@ public class ClassInterceptedClass
this.meaningOfLife = meaningOfLife;
}
- public float getFloat()
- {
- return f;
- }
-
- public ClassInterceptedClass getSelf()
+ public StereotypeInterceptedClass getSelf()
{
return this;
}
- public char getChar()
- {
- return c;
- }
-
- public String doThaBlowup() throws NumberFormatException
- {
- throw new NumberFormatException("should fit");
- }
}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java?rev=1433946&r1=1433945&r2=1433946&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java Wed Jan 16 14:14:43 2013
@@ -33,6 +33,7 @@ import org.apache.webbeans.newtests.inte
import org.apache.webbeans.newtests.interceptors.factory.beans.ClassMultiInterceptedClass;
import org.apache.webbeans.newtests.interceptors.factory.beans.DecoratedClass;
import org.apache.webbeans.newtests.interceptors.factory.beans.MethodInterceptedClass;
+import org.apache.webbeans.newtests.interceptors.factory.beans.StereotypeInterceptedClass;
import org.apache.webbeans.test.annotation.binding.Binding1;
import org.apache.webbeans.test.component.decorator.clean.ServiceDecorator;
import org.apache.webbeans.test.component.intercept.webbeans.ActionInterceptor;
@@ -102,6 +103,32 @@ public class InterceptorResolutionServic
}
@Test
+ public void testStereotypeInterceptorBinding() throws Exception
+ {
+ Collection<String> beanXmls = new ArrayList<String>();
+ beanXmls.add(getXmlPath(this.getClass().getPackage().getName(), this.getClass().getSimpleName()));
+
+ Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+ beanClasses.add(StereotypeInterceptedClass.class);
+ beanClasses.add(Transactional.class);
+ beanClasses.add(TransactionalInterceptor.class);
+
+ startContainer(beanClasses, beanXmls);
+
+ InterceptorResolutionService ir = new InterceptorResolutionService(getWebBeansContext());
+ AnnotatedType<StereotypeInterceptedClass> annotatedType = getBeanManager().createAnnotatedType(StereotypeInterceptedClass.class);
+ Bean<StereotypeInterceptedClass> bean = (Bean<StereotypeInterceptedClass>) getBeanManager().resolve(getBeanManager().getBeans(StereotypeInterceptedClass.class));
+
+ BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean.getTypes(), bean.getQualifiers(), annotatedType);
+ Assert.assertNotNull(interceptorInfo);
+
+ Assert.assertNotNull(interceptorInfo.getInterceptors());
+ Assert.assertEquals(1, interceptorInfo.getInterceptors().size());
+
+ shutDownContainer();
+ }
+
+ @Test
public void testClassLevelMultipleInterceptor() throws Exception
{
Collection<String> beanXmls = new ArrayList<String>();