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