diff --git a/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractDecorableBuiltInBean.java b/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractDecorableBuiltInBean.java index ed16326e1f8..1d641528d25 100644 --- a/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractDecorableBuiltInBean.java +++ b/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractDecorableBuiltInBean.java @@ -16,8 +16,6 @@ */ package org.jboss.weld.bean.builtin; -import static org.jboss.weld.logging.messages.BeanMessage.DYNAMIC_LOOKUP_OF_BUILT_IN_NOT_ALLOWED; - import java.util.List; import javax.enterprise.context.spi.CreationalContext; @@ -25,7 +23,6 @@ import javax.enterprise.inject.spi.InjectionPoint; import org.jboss.weld.bean.DecorableBean; -import org.jboss.weld.exceptions.IllegalArgumentException; import org.jboss.weld.injection.CurrentInjectionPoint; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.util.Decorators; @@ -47,12 +44,7 @@ protected AbstractDecorableBuiltInBean(String idSuffix, BeanManagerImpl beanMana @Override public T create(CreationalContext creationalContext) { - InjectionPoint ip = cip.peek(); - // some of the built-in beans require injection point metadata while other can do without it - if (ip == null && (isInjectionPointMetadataRequired() || !getDecorators(ip).isEmpty())) { - injectionPointNotAvailable(); - return null; - } + InjectionPoint ip = getInjectionPoint(cip); List> decorators = getDecorators(ip); T instance = newInstance(ip, creationalContext); @@ -68,8 +60,8 @@ public T create(CreationalContext creationalContext) { protected abstract Class getProxyClass(); - protected boolean isInjectionPointMetadataRequired() { - return false; + protected InjectionPoint getInjectionPoint(CurrentInjectionPoint cip) { + return cip.peek(); } @Override @@ -77,10 +69,6 @@ public Class getBeanClass() { return getClass(); } - protected void injectionPointNotAvailable() { - throw new IllegalArgumentException(DYNAMIC_LOOKUP_OF_BUILT_IN_NOT_ALLOWED, toString()); - } - @Override public List> getDecorators() { return beanManager.resolveDecorators(getTypes(), getQualifiers()); diff --git a/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java b/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java index 6e52cb36fa1..2286ad2e1d2 100644 --- a/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java +++ b/impl/src/main/java/org/jboss/weld/bean/builtin/AbstractFacadeBean.java @@ -16,6 +16,8 @@ */ package org.jboss.weld.bean.builtin; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; import java.util.Collections; import java.util.List; @@ -24,6 +26,8 @@ import javax.enterprise.inject.spi.InjectionPoint; import org.jboss.weld.bean.proxy.ProxyFactory; +import org.jboss.weld.injection.CurrentInjectionPoint; +import org.jboss.weld.injection.EmptyInjectionPoint; import org.jboss.weld.manager.BeanManagerImpl; /** @@ -62,7 +66,13 @@ protected List> getDecorators(InjectionPoint ip) { } @Override - protected boolean isInjectionPointMetadataRequired() { - return true; + protected InjectionPoint getInjectionPoint(CurrentInjectionPoint cip) { + InjectionPoint ip = super.getInjectionPoint(cip); + if (ip == null) { + ip = new DynamicLookupInjectionPoint(EmptyInjectionPoint.INSTANCE, getDefaultType(), Collections.emptySet()); + } + return ip; } + + protected abstract Type getDefaultType(); } diff --git a/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java b/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java index c5efdd621bc..62b33c66ae1 100644 --- a/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java +++ b/impl/src/main/java/org/jboss/weld/bean/builtin/EventBean.java @@ -18,9 +18,12 @@ import static org.jboss.weld.util.reflection.Reflections.cast; +import java.lang.reflect.Type; + import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.event.Event; import javax.enterprise.inject.spi.InjectionPoint; +import javax.enterprise.util.TypeLiteral; import org.jboss.weld.event.EventImpl; import org.jboss.weld.manager.BeanManagerImpl; @@ -28,6 +31,8 @@ public class EventBean extends AbstractFacadeBean> { private static final Class> TYPE = cast(Event.class); + @SuppressWarnings("serial") + private static final Type DEFAULT_TYPE = new TypeLiteral>(){}.getType(); public EventBean(BeanManagerImpl manager) { super(Event.class.getSimpleName(), manager, TYPE); @@ -48,4 +53,9 @@ public String toString() { return "Implicit Bean [javax.enterprise.event.Event] with qualifiers [@Default]"; } + @Override + protected Type getDefaultType() { + return DEFAULT_TYPE; + } + } diff --git a/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java b/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java index 240998d05bb..5167a23879a 100644 --- a/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java +++ b/impl/src/main/java/org/jboss/weld/bean/builtin/InjectionPointBean.java @@ -16,9 +16,12 @@ */ package org.jboss.weld.bean.builtin; +import static org.jboss.weld.logging.messages.BeanMessage.DYNAMIC_LOOKUP_OF_BUILT_IN_NOT_ALLOWED; + import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.InjectionPoint; +import org.jboss.weld.exceptions.IllegalArgumentException; import org.jboss.weld.injection.CurrentInjectionPoint; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.util.bean.SerializableForwardingInjectionPoint; @@ -58,9 +61,14 @@ public void destroy(InjectionPoint instance, CreationalContext c } + @Override - protected boolean isInjectionPointMetadataRequired() { - return true; + protected InjectionPoint getInjectionPoint(CurrentInjectionPoint cip) { + InjectionPoint ip = super.getInjectionPoint(cip); + if (ip == null) { + throw new IllegalArgumentException(DYNAMIC_LOOKUP_OF_BUILT_IN_NOT_ALLOWED, toString()); + } + return ip; } @Override diff --git a/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java b/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java index 5cb86974969..a10a34a7600 100644 --- a/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java +++ b/impl/src/main/java/org/jboss/weld/bean/builtin/InstanceBean.java @@ -27,18 +27,19 @@ import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.util.collections.Arrays2; +import org.jboss.weld.util.reflection.Reflections; public class InstanceBean extends AbstractFacadeBean> { - private static final Class> INSTANCE_TYPE = new TypeLiteral>() { + private static final Type INSTANCE_TYPE = new TypeLiteral>() { private static final long serialVersionUID = -1246199714407637856L; - }.getRawType(); - private static final Class> PROVIDER_TYPE = new TypeLiteral>() { + }.getType(); + private static final Type PROVIDER_TYPE = new TypeLiteral>() { private static final long serialVersionUID = -5256050387550468441L; - }.getRawType(); + }.getType(); private static final Set DEFAULT_TYPES = Arrays2.asSet(INSTANCE_TYPE, PROVIDER_TYPE, Object.class); public InstanceBean(BeanManagerImpl manager) { - super(Instance.class.getSimpleName(), manager, INSTANCE_TYPE); + super(Instance.class.getSimpleName(), manager, Reflections.>>cast(Instance.class)); } @Override @@ -60,4 +61,9 @@ public String toString() { return "Implicit Bean [javax.enterprise.inject.Instance] with qualifiers [@Default]"; } + @Override + protected Type getDefaultType() { + return INSTANCE_TYPE; + } + } diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/resolution/LookupInstanceTest.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/resolution/LookupInstanceTest.java index f568d920e6c..7a1c8ed8cd0 100644 --- a/tests-arquillian/src/test/java/org/jboss/weld/tests/resolution/LookupInstanceTest.java +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/resolution/LookupInstanceTest.java @@ -16,6 +16,12 @@ */ package org.jboss.weld.tests.resolution; +import static org.junit.Assert.assertEquals; + +import javax.enterprise.inject.Instance; +import javax.enterprise.util.TypeLiteral; +import javax.inject.Inject; + import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; @@ -24,15 +30,9 @@ import org.jboss.weld.literal.DefaultLiteral; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.test.util.Utils; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; -import javax.enterprise.inject.Instance; -import javax.enterprise.util.TypeLiteral; -import javax.inject.Inject; -import java.util.List; - @RunWith(Arquillian.class) public class LookupInstanceTest { @Deployment @@ -45,16 +45,13 @@ public static Archive deploy() { @Inject private BeanManagerImpl beanManager; + @SuppressWarnings("serial") @Test public void testLookupInstance() throws Exception { - try { - Utils.getReference( - beanManager, - new TypeLiteral>>() { - }.getRawType(), DefaultLiteral.INSTANCE); - Assert.fail(); - } catch (IllegalArgumentException expected) { - } + Instance instance = Utils.getReference(beanManager, new TypeLiteral>() { + }.getRawType(), DefaultLiteral.INSTANCE); + Foo foo = instance.select(Foo.class).get(); + assertEquals("foo", foo.getName()); } }