public Object getReference()

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;
    }