in webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java [735:827]
public Object getReference(Bean<?> providedBean, Type beanType, CreationalContext<?> creationalContext)
{
Asserts.assertNotNull(providedBean, "bean parameter");
Context context = null;
Object instance = null;
Bean<?> bean = !OwbBean.class.isInstance(providedBean) ? thirdPartyMapping.get(providedBean) : providedBean;
if (bean == null) // more than unlikely but still possible and not invalid (user could create new instance of bean each time, not forbidden)
{
bean = providedBean;
}
if (bean instanceof SerializableBean)
{
bean = ((SerializableBean)bean).getBean();
}
if(!(creationalContext instanceof CreationalContextImpl))
{
creationalContext = webBeansContext.getCreationalContextFactory().wrappedCreationalContext(creationalContext, bean);
}
if (ManagedBean.class.isInstance(bean))
{
ManagedBean.class.cast(bean).valid();
}
//Check type if bean type is given
if(beanType != null && beanType != Object.class)
{
boolean isProducer = AbstractProducerBean.class.isInstance(bean);
if(!isProducer && // we have different rules for producers
!isBeanTypeAssignableToGivenType(bean.getTypes(), beanType, isProducer) &&
!GenericsUtil.satisfiesDependency(false, isProducer, beanType, bean.getBeanClass(), new HashMap<>()) &&
!GenericsUtil.satisfiesDependencyRaw(false, isProducer, beanType, bean.getBeanClass(), new HashMap<>()))
{
throw new IllegalArgumentException("Given bean type : " + beanType + " is not applicable for the bean instance : " + bean);
}
}
else if (bean instanceof OwbBean)
{
// we cannot always use getBeanClass() as this will
// return the containing class for producer methods and fields
beanType = ((OwbBean) bean).getReturnType();
}
else
{
beanType = bean.getBeanClass();
}
//Scope is normal
if (isNormalScope(bean.getScope()))
{
instance = getEjbOrJmsProxyReference(bean, beanType,creationalContext);
if(instance != null)
{
return instance;
}
instance = cacheProxies.get(bean);
if (instance == null)
{
//Create Managed Bean Proxy
instance = webBeansContext.getNormalScopeProxyFactory().createNormalScopeProxy(bean);
//Cached instance
cacheProxies.put(bean, instance);
}
}
//Create Pseudo-Scope Bean Instance
else
{
//Get bean context
context = getContext(bean.getScope());
//Get instance for ejb or jms
instance = getEjbOrJmsProxyReference(bean, beanType, creationalContext);
if(instance != null)
{
return instance;
}
//Get dependent from DependentContex that create contextual instance
instance = context.get((Bean<Object>)bean, (CreationalContext<Object>)creationalContext);
}
return instance;
}