private T toInstance()

in impl/src/main/java/org/apache/geronimo/config/cdi/ConfigInjectionBean.java [126:190]


    private T toInstance(final Type baseType, final String key,
                         final String defaultValue, final boolean skipProviderLevel,
                         final boolean acceptNull) {
        if (baseType instanceof ParameterizedType) {
            ParameterizedType paramType = (ParameterizedType) baseType;
            Type rawType = paramType.getRawType();
            if (paramType.getActualTypeArguments().length == 0) {
                throw new IllegalArgumentException("No argument to " + paramType);
            }

            Type arg = paramType.getActualTypeArguments()[0];
            if (!Class.class.isInstance(arg)) {
                if (ParameterizedType.class.isInstance(arg)) {
                    ParameterizedType nested = ParameterizedType.class.cast(arg);
                    if (rawType == Optional.class) {
                        return (T) ofNullable(toInstance(nested, key, defaultValue, false, true));
                    }
                    if (rawType == Provider.class) {
                        if (nested.getActualTypeArguments().length != 1) {
                            throw new IllegalArgumentException("Invalid arguments for " + paramType);
                        }
                        return skipProviderLevel ?
                                toInstance(nested, key, defaultValue, false, acceptNull) :
                                (T) (Provider<?>) () -> toInstance(nested, key, defaultValue, false, true);
                    }
                    if (rawType == Supplier.class) {
                        if (nested.getActualTypeArguments().length != 1) {
                            throw new IllegalArgumentException("Invalid arguments for " + paramType);
                        }
                        return (T) (Supplier<?>) () -> toInstance(nested, key, defaultValue, false, true);
                    }
                }
                throw new IllegalArgumentException("Unsupported multiple generics level: " + paramType);
            }

            Class clazzParam = (Class) arg;

            // handle Provider<T>
            if (rawType instanceof Class && rawType == Provider.class && paramType.getActualTypeArguments().length == 1) {
                return skipProviderLevel ?
                        toInstance(clazzParam, key, defaultValue, false, acceptNull) :
                        (T) (Provider<?>) () -> toInstance(clazzParam, key, defaultValue, false, true);
            }

            // handle Optional<T>
            if (rawType instanceof Class && rawType == Optional.class && paramType.getActualTypeArguments().length == 1) {
                return (T) getConfig().getOptionalValue(key, clazzParam);
            }

            if (rawType instanceof Class && rawType == Supplier.class && paramType.getActualTypeArguments().length == 1) {
                return (T) (Supplier<?>) () -> toInstance(clazzParam, key, defaultValue, false, true);
            }

            if (Set.class.equals(rawType)) {
                final List list = getList(key, clazzParam, defaultValue, acceptNull);
                return list == null ? null : (T) new HashSet(list);
            }
            if (List.class.equals(rawType)) {
                return (T) getList(key, clazzParam, defaultValue, acceptNull);
            }
            throw new IllegalStateException("unhandled ConfigProperty");
        }
        Class clazz = (Class) baseType;
        return getConfigValue(key, defaultValue, clazz, acceptNull);
    }