in src/main/java/org/apache/geronimo/microprofile/impl/jwtauth/cdi/GeronimoJwtAuthExtension.java [133:239]
private Optional<Injection> createInjection(final Claim claim, final Type type) {
if (ParameterizedType.class.isInstance(type)) {
final ParameterizedType pt = ParameterizedType.class.cast(type);
if (pt.getActualTypeArguments().length == 1) {
final Type raw = pt.getRawType();
final Type arg = pt.getActualTypeArguments()[0];
if (raw == Provider.class || raw == Instance.class) {
return createInjection(claim, arg);
}
if (raw == Optional.class) {
return createInjection(claim, arg)
.map(it -> new Injection(claim.value(), claim.standard(), type) {
@Override
Object createInstance(final TokenAccessor jwtRequest) {
return ofNullable(it.createInstance(jwtRequest));
}
});
}
if (raw == ClaimValue.class) {
final String name = getClaimName(claim);
return createInjection(claim, arg)
.map(it -> new Injection(claim.value(), claim.standard(), type) {
@Override
Object createInstance(final TokenAccessor jwtRequest) {
return new ClaimValue<Object>() {
@Override
public String getName() {
return name;
}
@Override
public Object getValue() {
return it.createInstance(jwtRequest);
}
};
}
});
}
if (Class.class.isInstance(raw) && Collection.class.isAssignableFrom(Class.class.cast(raw))) {
return of(new Injection(claim.value(), claim.standard(), type));
}
}
} else if (Class.class.isInstance(type)) {
final Class<?> clazz = Class.class.cast(type);
if (JsonValue.class.isAssignableFrom(clazz)) {
if (JsonString.class.isAssignableFrom(clazz)) {
return of(new Injection(claim.value(), claim.standard(), clazz) {
@Override
Object createInstance(final TokenAccessor jwtRequest) {
final Object instance = super.createInstance(jwtRequest);
if (JsonString.class.isInstance(instance)) {
return instance;
}
return json.createValue(String.class.cast(instance));
}
});
}
if (JsonNumber.class.isAssignableFrom(clazz)) {
return of(new Injection(claim.value(), claim.standard(), clazz) {
@Override
Object createInstance(final TokenAccessor jwtRequest) {
final Object instance = super.createInstance(jwtRequest);
if (JsonNumber.class.isInstance(instance)) {
return instance;
}
return json.createValue(Number.class.cast(instance).doubleValue());
}
});
}
if (JsonObject.class.isAssignableFrom(clazz)) {
return of(new Injection(claim.value(), claim.standard(), clazz));
}
if (JsonArray.class.isAssignableFrom(clazz)) {
return of(new Injection(claim.value(), claim.standard(), clazz) {
@Override
Object createInstance(final TokenAccessor jwtRequest) {
final Object instance = super.createInstance(jwtRequest);
if (instance == null) {
return null;
}
if (JsonArray.class.isInstance(instance)) {
return instance;
}
if (Set.class.isInstance(instance)) {
return ((Set<String>) instance).stream()
.collect(Collector.of(
json::createArrayBuilder,
JsonArrayBuilder::add,
JsonArrayBuilder::addAll,
JsonArrayBuilder::build));
}
throw new IllegalArgumentException("Unsupported value: " + instance);
}
});
}
} else {
final Class<?> objectType = wrapPrimitives(clazz);
if (CharSequence.class.isAssignableFrom(clazz) || Double.class.isAssignableFrom(objectType) ||
Long.class.isAssignableFrom(objectType) || Integer.class.isAssignableFrom(objectType)) {
return of(new Injection(claim.value(), claim.standard(), objectType));
}
}
}
errors.add(new IllegalArgumentException(type + " not supported by JWT-Auth implementation"));
return empty();
}