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/12 17:32:12 UTC
svn commit: r1432468 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/component/
main/java/org/apache/webbeans/component/creation/
test/java/org/apache/webbeans/newtests/interceptors/resolution/
Author: struberg
Date: Sat Jan 12 16:32:11 2013
New Revision: 1432468
URL: http://svn.apache.org/viewvc?rev=1432468&view=rev
Log:
OWB-344 add CdiInterceptor constructor handling and instance creation
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java
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/AbstractInjectionTargetBeanBuilder.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java Sat Jan 12 16:32:11 2013
@@ -18,11 +18,16 @@
*/
package org.apache.webbeans.component;
+import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
import java.util.Set;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.inject.InjectableConstructor;
+import org.apache.webbeans.portable.InjectionTargetImpl;
/**
* <p>{@link javax.enterprise.inject.spi.Interceptor}
@@ -33,6 +38,11 @@ import org.apache.webbeans.config.WebBea
public class CdiInterceptorBean<T> extends InterceptorBean<T>
{
/**
+ * Constructor of the web bean component
+ */
+ private Constructor<T> constructor;
+
+ /**
*
* @param annotatedType AnnotatedType will be returned by some methods in the SPI
* @param webBeansContext
@@ -45,6 +55,41 @@ public class CdiInterceptorBean<T> exten
private Set<Annotation> interceptorBindings;
+ /**
+ * Get constructor.
+ *
+ * @return constructor
+ */
+ public Constructor<T> getConstructor()
+ {
+ return constructor;
+ }
+
+ /**
+ * Set constructor.
+ *
+ * @param constructor constructor instance
+ */
+ public void setConstructor(Constructor<T> constructor)
+ {
+ this.constructor = constructor;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected T createComponentInstance(CreationalContext<T> creationalContext)
+ {
+ Constructor<T> con = getConstructor();
+ InjectionTargetImpl<T> injectionTarget = new InjectionTargetImpl<T>(getAnnotatedType(), getInjectionPoints(), getWebBeansContext());
+ InjectableConstructor<T> ic = new InjectableConstructor<T>(con, injectionTarget, (CreationalContextImpl<T>) creationalContext);
+
+ T instance = ic.doInjection();
+
+ return instance;
+ }
+
public void setInterceptorBindings(Set<Annotation> interceptorBindings)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java Sat Jan 12 16:32:11 2013
@@ -20,6 +20,7 @@ package org.apache.webbeans.component;
/**
* Marker interface for enterprise beans.
+ * All those beans will not get intercepted.
*
* @version $Rev$ $Date$
*
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java Sat Jan 12 16:32:11 2013
@@ -39,8 +39,9 @@ import org.apache.webbeans.util.Exceptio
* <p>Any Interceptor is also an InjectionTarget as they can contain
* @Inject InjectionPoints.</p>
*/
-public abstract class InterceptorBean<T> extends AbstractInjectionTargetBean<T> implements Interceptor<T>
+public abstract class InterceptorBean<T> extends AbstractInjectionTargetBean<T> implements Interceptor<T>, EnterpriseBeanMarker
{
+
/**
*
* @param annotatedType AnnotatedType will be returned by some methods in the SPI
@@ -144,6 +145,7 @@ public abstract class InterceptorBean<T>
return Dependent.class;
}
+
/**
* @param interceptionType
* @return the underlying interceptor method for the given InterceptionType or <code>null</code>
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=1432468&r1=1432467&r2=1432468&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 Sat Jan 12 16:32:11 2013
@@ -78,6 +78,7 @@ public class ManagedBean<T> extends Abst
T instance = ic.doInjection();
//If this is an abstract Decorator, we need to set the handler on the Proxy instance
+ //X TODO should be done in DecoratorBean
if(isAbstractDecorator)
{
webBeansContext.getProxyFactory().setHandler(instance, new AbstractDecoratorMethodHandler());
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java Sat Jan 12 16:32:11 2013
@@ -37,6 +37,7 @@ import javax.enterprise.event.Reception;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.Specializes;
+import javax.enterprise.inject.spi.AnnotatedConstructor;
import javax.enterprise.inject.spi.AnnotatedField;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedParameter;
@@ -99,6 +100,71 @@ public abstract class AbstractInjectionT
defineName(WebBeansUtil.getManagedBeanDefaultName(getAnnotated().getJavaClass().getSimpleName()));
}
+
+
+ protected AnnotatedConstructor<T> getBeanConstructor()
+ {
+ Asserts.assertNotNull(getAnnotated(),"Type is null");
+ AnnotatedConstructor<T> result = null;
+
+ Set<AnnotatedConstructor<T>> annConsts = getAnnotated().getConstructors();
+ if(annConsts != null)
+ {
+ boolean found = false;
+ boolean noParamConsIsDefined = false;
+ for(AnnotatedConstructor<T> annConst : annConsts)
+ {
+ if(annConst.isAnnotationPresent(Inject.class))
+ {
+ if (found)
+ {
+ throw new WebBeansConfigurationException("There are more than one constructor with @Inject annotation in annotation type : "
+ + getAnnotated());
+ }
+
+ found = true;
+ result = annConst;
+ }
+ else
+ {
+ if(!found && !noParamConsIsDefined)
+ {
+ List<AnnotatedParameter<T>> parameters = annConst.getParameters();
+ if(parameters != null && parameters.isEmpty())
+ {
+ result = annConst;
+ noParamConsIsDefined = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (result == null)
+ {
+ throw new WebBeansConfigurationException("No constructor is found for the annotated type : " + getAnnotated());
+ }
+
+ List<AnnotatedParameter<T>> parameters = result.getParameters();
+ for(AnnotatedParameter<T> parameter : parameters)
+ {
+ if (parameter.isAnnotationPresent(Disposes.class))
+ {
+ throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Disposes annotation in annotated constructor : "
+ + result);
+ }
+
+ if(parameter.isAnnotationPresent(Observes.class))
+ {
+ throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Observes annotation in annotated constructor : " + result);
+ }
+
+ }
+
+ return result;
+ }
+
+
/**
* {@inheritDoc}
*/
@@ -506,7 +572,7 @@ public abstract class AbstractInjectionT
{
producerFieldBean.getTypes().addAll(annotatedField.getTypeClosure());
}
- WebBeansUtil.checkProducerGenericType(producerFieldBean,annotatedField.getJavaMember());
+ WebBeansUtil.checkProducerGenericType(producerFieldBean, annotatedField.getJavaMember());
producerBeans.add(producerFieldBean);
}
@@ -563,8 +629,8 @@ public abstract class AbstractInjectionT
}
webBeansContext.getWebBeansUtil().setBeanEnableFlagForProducerBean(bean,
- producerMethodBean,
- AnnotationUtil.asArray(annotatedMethod.getAnnotations()));
+ producerMethodBean,
+ AnnotationUtil.asArray(annotatedMethod.getAnnotations()));
if (producerMethodBean.getReturnType().isArray())
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java Sat Jan 12 16:32:11 2013
@@ -19,13 +19,17 @@
package org.apache.webbeans.component.creation;
+import javax.enterprise.inject.spi.AnnotatedConstructor;
import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.InjectionPoint;
import java.lang.annotation.Annotation;
+import java.util.List;
import org.apache.webbeans.component.CdiInterceptorBean;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.inject.impl.InjectionPointFactory;
import org.apache.webbeans.util.ArrayUtil;
/**
@@ -33,6 +37,8 @@ import org.apache.webbeans.util.ArrayUti
*/
public class CdiInterceptorBeanBuilder<T> extends InterceptorBeanBuilder<T>
{
+ private AnnotatedConstructor<T> constructor;
+
public CdiInterceptorBeanBuilder(WebBeansContext webBeansContext, AnnotatedType<T> annotatedType)
{
super(new CdiInterceptorBean<T>(webBeansContext, annotatedType));
@@ -63,6 +69,30 @@ public class CdiInterceptorBeanBuilder<T
getBean().setInterceptorBindings(ArrayUtil.asSet(bindings));
}
+ public void defineConstructor()
+ {
+ constructor = getBeanConstructor();
+ addConstructorInjectionPointMetaData();
+ }
+
+
+ protected void addConstructorInjectionPointMetaData()
+ {
+ if (constructor == null)
+ {
+ return;
+ }
+ CdiInterceptorBean<T> bean = getBean();
+ InjectionPointFactory injectionPointFactory = webBeansContext.getInjectionPointFactory();
+ List<InjectionPoint> injectionPoints = injectionPointFactory.getConstructorInjectionPointData(bean, constructor);
+ for (InjectionPoint injectionPoint : injectionPoints)
+ {
+ addImplicitComponentForInjectionPoint(injectionPoint);
+ bean.addInjectionPoint(injectionPoint);
+ }
+ bean.setConstructor(constructor.getJavaMember());
+ }
+
public CdiInterceptorBean<T> getBean()
{
return (CdiInterceptorBean<T>)super.getBean();
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java Sat Jan 12 16:32:11 2013
@@ -75,6 +75,8 @@ public abstract class InterceptorBeanBui
*/
public abstract boolean isInterceptorEnabled();
+ public abstract void defineConstructor();
+
protected void checkInterceptorConditions()
{
Set<AnnotatedMethod<? super T>> methods = getAnnotated().getMethods();
@@ -95,6 +97,7 @@ public abstract class InterceptorBeanBui
protected void defineInterceptorRules()
{
+ defineConstructor();
defineInterceptorMethods();
defineInjectedMethods();
defineInjectedFields();
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=1432468&r1=1432467&r2=1432468&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 Sat Jan 12 16:32:11 2013
@@ -27,18 +27,14 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.spi.AnnotatedConstructor;
import javax.enterprise.inject.spi.AnnotatedField;
import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.ObserverMethod;
import javax.enterprise.inject.spi.ProcessInjectionTarget;
import javax.enterprise.inject.spi.Producer;
-import javax.inject.Inject;
import org.apache.webbeans.component.ManagedBean;
import org.apache.webbeans.component.ProducerFieldBean;
@@ -49,14 +45,12 @@ import org.apache.webbeans.container.Bea
import org.apache.webbeans.decorator.DecoratorUtil;
import org.apache.webbeans.decorator.WebBeansDecoratorConfig;
import org.apache.webbeans.event.ObserverMethodImpl;
-import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.exception.inject.DeploymentException;
import org.apache.webbeans.inject.impl.InjectionPointFactory;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
import org.apache.webbeans.portable.events.ProcessBeanImpl;
import org.apache.webbeans.portable.events.ProcessProducerImpl;
import org.apache.webbeans.portable.events.generics.GProcessManagedBean;
-import org.apache.webbeans.util.Asserts;
import org.apache.webbeans.util.WebBeansUtil;
/**
@@ -269,69 +263,7 @@ public class ManagedBeanBuilder<T> exten
}
}
-
- protected AnnotatedConstructor<T> getBeanConstructor()
- {
- Asserts.assertNotNull(getAnnotated(),"Type is null");
- AnnotatedConstructor<T> result = null;
-
- Set<AnnotatedConstructor<T>> annConsts = getAnnotated().getConstructors();
- if(annConsts != null)
- {
- boolean found = false;
- boolean noParamConsIsDefined = false;
- for(AnnotatedConstructor<T> annConst : annConsts)
- {
- if(annConst.isAnnotationPresent(Inject.class))
- {
- if (found)
- {
- throw new WebBeansConfigurationException("There are more than one constructor with @Inject annotation in annotation type : "
- + getAnnotated());
- }
-
- found = true;
- result = annConst;
- }
- else
- {
- if(!found && !noParamConsIsDefined)
- {
- List<AnnotatedParameter<T>> parameters = annConst.getParameters();
- if(parameters != null && parameters.isEmpty())
- {
- result = annConst;
- noParamConsIsDefined = true;
- }
- }
- }
- }
- }
-
- if (result == null)
- {
- throw new WebBeansConfigurationException("No constructor is found for the annotated type : " + getAnnotated());
- }
-
- List<AnnotatedParameter<T>> parameters = result.getParameters();
- for(AnnotatedParameter<T> parameter : parameters)
- {
- if (parameter.isAnnotationPresent(Disposes.class))
- {
- throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Disposes annotation in annotated constructor : "
- + result);
- }
-
- if(parameter.isAnnotationPresent(Observes.class))
- {
- throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Observes annotation in annotated constructor : " + result);
- }
-
- }
- return result;
- }
-
protected void addConstructorInjectionPointMetaData(ManagedBean<T> bean)
{
if (constructor == null)
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java Sat Jan 12 16:32:11 2013
@@ -19,6 +19,7 @@
package org.apache.webbeans.newtests.interceptors.resolution;
+import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.InterceptionType;
import javax.enterprise.inject.spi.Interceptor;
@@ -124,6 +125,10 @@ public class InterceptorBeanBuilderTest
Assert.assertEquals(2, bean.getInterceptorMethods(InterceptionType.POST_CONSTRUCT).length);
Assert.assertEquals(2, bean.getInterceptorMethods(InterceptionType.PRE_DESTROY).length);
+ CreationalContext<TestInterceptor1> cc = getBeanManager().createCreationalContext(bean);
+ TestInterceptor1 interceptorInstance = bean.create(cc);
+ Assert.assertNotNull(interceptorInstance);
+
shutDownContainer();
}
}