public Object getValue()

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