in src/main/java/org/apache/sling/models/caconfig/impl/injectors/ContextAwareConfigurationInjector.java [83:146]
public Object getValue(
@NotNull Object adaptable,
String name,
@NotNull Type declaredType,
@NotNull AnnotatedElement element,
@NotNull DisposalCallbackRegistry callbackRegistry) {
ContextAwareConfiguration annotation = getAnnotation(element);
if (annotation == null) {
// support injections only with explicit @ContextAwareConfiguration annotation
log.debug("Injection only supported using @ContextAwareConfiguration annotation.");
return null;
}
// get resource
Resource resource = getResource(adaptable);
if (resource == null) {
log.warn("Unable to get resource from {}", adaptable);
return null;
}
// initialize configuration builder
ConfigurationBuilder configurationBuilder = configurationResolver.get(resource);
if (StringUtils.isNotBlank(annotation.name())) {
configurationBuilder = configurationBuilder.name(annotation.name());
}
// detect from declared type if a single configuration or configuration collection is requested and return the
// configuration
if (declaredType instanceof Class) {
Class<?> clazz = (Class<?>) declaredType;
if (clazz.isArray()) {
Collection<?> result = getConfigurationCollection(configurationBuilder, clazz.getComponentType());
Object array = Array.newInstance(clazz.getComponentType(), result.size());
Iterator<?> resultIterator = result.iterator();
int i = 0;
while (resultIterator.hasNext()) {
Array.set(array, i++, resultIterator.next());
}
return array;
} else {
return getConfiguration(configurationBuilder, clazz);
}
} else if (declaredType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) declaredType;
if (parameterizedType.getActualTypeArguments().length != 1) {
return null;
}
Class<?> collectionType = (Class<?>) parameterizedType.getRawType();
if (!(collectionType.equals(Collection.class) || collectionType.equals(List.class))) {
return null;
}
Class<?> clazz = (Class<?>) parameterizedType.getActualTypeArguments()[0];
Collection<?> result = getConfigurationCollection(configurationBuilder, clazz);
if (collectionType.equals(List.class)) {
return new ArrayList<>(result);
} else {
return result;
}
} else {
log.warn("Cannot handle type {}", declaredType);
return null;
}
}