ExtendedInstanceProducer.java

package com.github.jonasrutishauser.jakarta.enterprise.inject.impl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import com.github.jonasrutishauser.jakarta.enterprise.inject.ExtendedInstance;

import jakarta.enterprise.inject.Instance;
import jakarta.enterprise.inject.Produces;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.enterprise.inject.spi.InjectionPoint;

class ExtendedInstanceProducer {

    private static final boolean CDI_4 = isCdiVersionAtLeast4();

    private static boolean isCdiVersionAtLeast4() {
        try {
            Instance.class.getMethod("getHandle");
            return true;
        } catch (NoSuchMethodException e) {
            return false;
        }
    }

    @Produces
    static <T> ExtendedInstance<T> createExtendedInstance(InjectionPoint injectionPoint, Instance<Object> instance) {
        throw new IllegalStateException("should not be called");
    }
    
    static <T> ExtendedInstance<T> create(BeanManager beanManager, InjectionPoint injectionPoint, Instance<T> instance) {
        if (CDI_4) {
            return new CDI4ExtendedInstance<>(beanManager, instance);
        } else {
            Type targetType = Object.class;
            if (injectionPoint.getType() instanceof ParameterizedType) {
                targetType = ((ParameterizedType) injectionPoint.getType()).getActualTypeArguments()[0];
            }
            return new CDI3ExtendedInstance<>(beanManager, instance, targetType, injectionPoint.getQualifiers());
        }
    }

    private ExtendedInstanceProducer() {
    }

}