You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ar...@apache.org on 2012/10/14 11:54:52 UTC
svn commit: r1398045 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/component/
main/java/org/apache/webbeans/inject/instance/
test/java/org/apache/webbeans/newtests/managed/instance/
test/java/org/apache/webbeans/newtests/man...
Author: arne
Date: Sun Oct 14 09:54:52 2012
New Revision: 1398045
URL: http://svn.apache.org/viewvc?rev=1398045&view=rev
Log:
OWB-714 Fixed accessing of an Instance that is produced by a producer method that has an InjectionPoint as parameter
Added:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBeanProducer.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/MeaningOfLife.java (with props)
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InstanceBean.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/InjectedInstanceComponentTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBean.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/InstanceForDependentBean.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InstanceBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InstanceBean.java?rev=1398045&r1=1398044&r2=1398045&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InstanceBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InstanceBean.java Sun Oct 14 09:54:52 2012
@@ -52,17 +52,12 @@ public class InstanceBean<T> extends Abs
InjectionPoint injectionPoint = local.get();
Set<Annotation> qualifiers;
Type type;
- Class injectionPointClass = null;
if (injectionPoint != null)
{
ParameterizedType injectedType = (ParameterizedType)injectionPoint.getType();
qualifiers = injectionPoint.getQualifiers();
type = injectedType.getActualTypeArguments()[0];
- if (injectionPoint.getBean() != null)
- {
- injectionPointClass = injectionPoint.getBean().getBeanClass();
- }
}
else
{
@@ -72,7 +67,7 @@ public class InstanceBean<T> extends Abs
Object ownerInstance = AbstractInjectable.instanceUnderInjection.get();
- Instance<T> instance = InstanceFactory.getInstance(type, injectionPointClass, getWebBeansContext(),
+ Instance<T> instance = InstanceFactory.getInstance(type, injectionPoint, getWebBeansContext(),
creationalContext, ownerInstance,
qualifiers.toArray(new Annotation[qualifiers.size()]));
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceFactory.java?rev=1398045&r1=1398044&r2=1398045&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceFactory.java Sun Oct 14 09:54:52 2012
@@ -23,6 +23,7 @@ import java.lang.reflect.Type;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.InjectionPoint;
import org.apache.webbeans.config.WebBeansContext;
@@ -36,18 +37,18 @@ public final class InstanceFactory
/**
*
* @param injectedType injection class type
- * @param injectionPointClass null or the class of the injection point
+ * @param injectionPoint null or the injection point
* @param webBeansContext
* @param creationalContext will get used for creating @Dependent beans
* @param ownerInstance the object the current Instance got injected into
* @param annotations qualifier annotations
* @return the {@link Instance<T>} for the given type.
*/
- public static <T> Instance<T> getInstance(Type injectedType, Class<?> injectionPointClass,
+ public static <T> Instance<T> getInstance(Type injectedType, InjectionPoint injectionPoint,
WebBeansContext webBeansContext, CreationalContext<?> creationalContext,
Object ownerInstance, Annotation... annotations)
{
- InstanceImpl<T> instance = new InstanceImpl<T>(injectedType,injectionPointClass, webBeansContext,
+ InstanceImpl<T> instance = new InstanceImpl<T>(injectedType,injectionPoint, webBeansContext,
creationalContext, ownerInstance, annotations);
return instance;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java?rev=1398045&r1=1398044&r2=1398045&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java Sun Oct 14 09:54:52 2012
@@ -31,8 +31,10 @@ import java.util.Set;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.util.TypeLiteral;
+import org.apache.webbeans.component.InjectionPointBean;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.container.InjectionResolver;
@@ -54,9 +56,9 @@ class InstanceImpl<T> implements Instanc
private Type injectionClazz;
/**
- * injection point class used to determine the BDA it was loaded from or null.
+ * injection point, needed for injection into producer method and used to determine the BDA it was loaded from or null.
*/
- private Class<?> injectionPointClazz;
+ private InjectionPoint injectionPoint;
/** Qualifier annotations appeared on the injection point */
private Set<Annotation> qualifierAnnotations = new HashSet<Annotation>();
@@ -71,17 +73,17 @@ class InstanceImpl<T> implements Instanc
* Creates new instance.
*
* @param injectionClazz injection class type
- * @param injectionPointClazz null or class of injection point
+ * @param injectionPoint null or injection point
* @param webBeansContext
* @param creationalContext will get used for creating @Dependent beans
* @param ownerInstance the object the current Instance got injected into
* @param annotations qualifier annotations
*/
- InstanceImpl(Type injectionClazz, Class<?> injectionPointClazz, WebBeansContext webBeansContext,
+ InstanceImpl(Type injectionClazz, InjectionPoint injectionPoint, WebBeansContext webBeansContext,
CreationalContext<?> creationalContext, Object ownerInstance, Annotation... annotations)
{
this.injectionClazz = injectionClazz;
- this.injectionPointClazz=injectionPointClazz;
+ this.injectionPoint = injectionPoint;
this.parentCreationalContext = creationalContext;
this.ownerInstance = ownerInstance;
@@ -102,32 +104,40 @@ class InstanceImpl<T> implements Instanc
{
T instance;
- Annotation[] anns = new Annotation[qualifierAnnotations.size()];
- anns = qualifierAnnotations.toArray(anns);
+ InjectionPointBean.setThreadLocal(injectionPoint);
+ try
+ {
+ Annotation[] anns = new Annotation[qualifierAnnotations.size()];
+ anns = qualifierAnnotations.toArray(anns);
- Set<Bean<?>> beans = resolveBeans();
+ Set<Bean<?>> beans = resolveBeans();
- webBeansContext.getResolutionUtil().checkResolvedBeans(beans, ClassUtil.getClazz(injectionClazz), anns, null);
- BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+ webBeansContext.getResolutionUtil().checkResolvedBeans(beans, ClassUtil.getClazz(injectionClazz), anns, null);
+ BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
- Bean<?> bean = beanManager.resolve(beans);
+ Bean<?> bean = beanManager.resolve(beans);
- // since Instance<T> is Dependent, we we gonna use the parent CreationalContext by default
- CreationalContext<?> creationalContext = parentCreationalContext;
+ // since Instance<T> is Dependent, we we gonna use the parent CreationalContext by default
+ CreationalContext<?> creationalContext = parentCreationalContext;
- boolean isDependentBean = WebBeansUtil.isDependent(bean);
+ boolean isDependentBean = WebBeansUtil.isDependent(bean);
- if (!isDependentBean)
- {
- // but for all NormalScoped beans we will need to create a fresh CreationalContext
- creationalContext = beanManager.createCreationalContext(bean);
- }
+ if (!isDependentBean)
+ {
+ // but for all NormalScoped beans we will need to create a fresh CreationalContext
+ creationalContext = beanManager.createCreationalContext(bean);
+ }
- instance = (T) beanManager.getReference(bean, null, creationalContext);
+ instance = (T) beanManager.getReference(bean, null, creationalContext);
- if (isDependentBean && ownerInstance != null && creationalContext instanceof CreationalContextImpl)
+ if (isDependentBean && ownerInstance != null && creationalContext instanceof CreationalContextImpl)
+ {
+ ((CreationalContextImpl<?>) creationalContext).addDependent(ownerInstance, bean, instance);
+ }
+ }
+ finally
{
- ((CreationalContextImpl<?>) creationalContext).addDependent(ownerInstance, bean, instance);
+ InjectionPointBean.removeThreadLocal();
}
return instance;
@@ -146,7 +156,13 @@ class InstanceImpl<T> implements Instanc
InjectionResolver injectionResolver = webBeansContext.getBeanManagerImpl().getInjectionResolver();
InjectionResolver resolver = injectionResolver;
- Set<Bean<?>> beans = resolver.implResolveByType(injectionClazz, injectionPointClazz, anns);
+ Bean<?> injectionPointBean = injectionPoint.getBean();
+ Class<?> injectionPointClass = null;
+ if (injectionPointBean != null)
+ {
+ injectionPointClass = injectionPointBean.getBeanClass();
+ }
+ Set<Bean<?>> beans = resolver.implResolveByType(injectionClazz, injectionPointClass, anns);
return beans;
}
@@ -176,7 +192,7 @@ class InstanceImpl<T> implements Instanc
public Instance<T> select(Annotation... qualifiers)
{
Annotation[] newQualifiersArray = getAdditionalQualifiers(qualifiers);
- InstanceImpl<T> newInstance = new InstanceImpl<T>(injectionClazz, injectionPointClazz,
+ InstanceImpl<T> newInstance = new InstanceImpl<T>(injectionClazz, injectionPoint,
webBeansContext, parentCreationalContext,
ownerInstance, newQualifiersArray);
@@ -229,7 +245,7 @@ class InstanceImpl<T> implements Instanc
Annotation[] newQualifiers = getAdditionalQualifiers(qualifiers);
- InstanceImpl<U> newInstance = new InstanceImpl(sub, injectionPointClazz, webBeansContext,
+ InstanceImpl<U> newInstance = new InstanceImpl(sub, injectionPoint, webBeansContext,
parentCreationalContext, ownerInstance,
newQualifiers);
@@ -252,10 +268,18 @@ class InstanceImpl<T> implements Instanc
{
Set<Bean<?>> beans = resolveBeans();
Set<T> instances = new HashSet<T>();
- for(Bean<?> bean : beans)
+ InjectionPointBean.setThreadLocal(injectionPoint);
+ try
+ {
+ for(Bean<?> bean : beans)
+ {
+ T instance = (T) webBeansContext.getBeanManagerImpl().getReference(bean,null, parentCreationalContext);
+ instances.add(instance);
+ }
+ }
+ finally
{
- T instance = (T) webBeansContext.getBeanManagerImpl().getReference(bean,null, parentCreationalContext);
- instances.add(instance);
+ InjectionPointBean.removeThreadLocal();
}
return instances.iterator();
@@ -266,7 +290,7 @@ class InstanceImpl<T> implements Instanc
ObjectOutputStream oos = new ObjectOutputStream(op);
oos.writeObject(injectionClazz);
oos.writeObject(qualifierAnnotations);
- oos.writeObject(injectionPointClazz);
+ oos.writeObject(injectionPoint);
oos.flush();
}
@@ -277,7 +301,7 @@ class InstanceImpl<T> implements Instanc
final ObjectInputStream inputStream = new OwbCustomObjectInputStream(in, WebBeansUtil.getCurrentClassLoader());
injectionClazz = (Type)inputStream.readObject();
qualifierAnnotations = (Set<Annotation>)inputStream.readObject();
- injectionPointClazz = (Class<?>) inputStream.readObject();
+ injectionPoint = (InjectionPoint) inputStream.readObject();
}
@@ -286,7 +310,7 @@ class InstanceImpl<T> implements Instanc
StringBuilder builder = new StringBuilder();
builder.append("Instance<");
builder.append(ClassUtil.getClazz(injectionClazz).getName());
- builder.append("> injectionPointClazz=").append(injectionPointClazz);
+ builder.append("> injectionPointClazz=").append(injectionPoint);
builder.append(",with qualifier annotations {");
int i = 0;
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/InjectedInstanceComponentTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/InjectedInstanceComponentTest.java?rev=1398045&r1=1398044&r2=1398045&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/InjectedInstanceComponentTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/InjectedInstanceComponentTest.java Sun Oct 14 09:54:52 2012
@@ -19,9 +19,20 @@
package org.apache.webbeans.newtests.managed.instance;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Set;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.util.TypeLiteral;
+
import junit.framework.Assert;
+
import org.apache.webbeans.newtests.AbstractUnitTest;
import org.apache.webbeans.newtests.managed.instance.beans.DependentBean;
+import org.apache.webbeans.newtests.managed.instance.beans.DependentBeanProducer;
import org.apache.webbeans.newtests.managed.instance.beans.InstanceForDependentBean;
import org.apache.webbeans.newtests.managed.instance.beans.InstanceInjectedComponent;
import org.apache.webbeans.test.component.CheckWithCheckPayment;
@@ -30,14 +41,6 @@ import org.apache.webbeans.test.componen
import org.apache.webbeans.test.component.PaymentProcessorComponent;
import org.junit.Test;
-import javax.enterprise.context.spi.CreationalContext;
-import javax.enterprise.inject.Instance;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.util.TypeLiteral;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Set;
-
public class InjectedInstanceComponentTest extends AbstractUnitTest
{
@@ -74,6 +77,25 @@ public class InjectedInstanceComponentTe
}
@Test
+ public void testInstanceProducedWithInjectionPoint()
+ {
+ Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+
+ beanClasses.add(InstanceForDependentBean.class);
+ beanClasses.add(DependentBean.class);
+ beanClasses.add(DependentBeanProducer.class);
+ startContainer(beanClasses, null);
+
+ InstanceForDependentBean holder = getInstance(InstanceForDependentBean.class);
+ Assert.assertNotNull(holder);
+
+ Assert.assertEquals(42, holder.getMeaningOfLife());
+ Assert.assertEquals(0, holder.getSecondaryMeaning());
+
+ shutDownContainer();
+ }
+
+ @Test
public void testInstanceDestroyal()
{
Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBean.java?rev=1398045&r1=1398044&r2=1398045&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBean.java Sun Oct 14 09:54:52 2012
@@ -30,9 +30,11 @@ public class DependentBean
public static boolean properlyDestroyed = false;
+ int meaningOfLife = 42;
+
public int getMeaningOfLife()
{
- return 42;
+ return meaningOfLife;
}
@PreDestroy
Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBeanProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBeanProducer.java?rev=1398045&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBeanProducer.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/DependentBeanProducer.java Sun Oct 14 09:54:52 2012
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.newtests.managed.instance.beans;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+public class DependentBeanProducer {
+
+ @Produces
+ @Dependent
+ @MeaningOfLife
+ public DependentBean produce(InjectionPoint ip, DependentBean bean) {
+ bean.meaningOfLife = ip.getAnnotated().getAnnotation(MeaningOfLife.class).value();
+ return bean;
+ }
+}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/InstanceForDependentBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/InstanceForDependentBean.java?rev=1398045&r1=1398044&r2=1398045&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/InstanceForDependentBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/InstanceForDependentBean.java Sun Oct 14 09:54:52 2012
@@ -32,9 +32,17 @@ public class InstanceForDependentBean
@Inject
private Instance<DependentBean> instance;
-
+ @Inject
+ @MeaningOfLife(0)
+ private Instance<DependentBean> secondaryInstance;
+
public int getMeaningOfLife()
{
return instance.get().getMeaningOfLife();
}
+
+ public int getSecondaryMeaning()
+ {
+ return secondaryInstance.get().getMeaningOfLife();
+ }
}
Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/MeaningOfLife.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/MeaningOfLife.java?rev=1398045&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/MeaningOfLife.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/MeaningOfLife.java Sun Oct 14 09:54:52 2012
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.newtests.managed.instance.beans;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+
+@Target( { TYPE, METHOD, PARAMETER, FIELD })
+@Retention(RUNTIME)
+@Documented
+@Qualifier
+public @interface MeaningOfLife
+{
+ @Nonbinding int value() default 42;
+}
Propchange: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/managed/instance/beans/MeaningOfLife.java
------------------------------------------------------------------------------
svn:executable = *