UnwrappingInfo inTermsOf()

in bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java [75:105]


        UnwrappingInfo inTermsOf(Class<?> containerClass) {
            final Class<?> keyContainer = containerElementKey.getContainerClass();
            if (keyContainer.equals(containerClass)) {
                return this;
            }
            Validate.validState(keyContainer.isAssignableFrom(containerClass), "Cannot render %s in terms of %s",
                containerElementKey, containerClass);

            final ContainerElementKey key;

            if (containerElementKey.getTypeArgumentIndex() == null) {
                key = new ContainerElementKey(containerClass, null);
            } else {
                Integer typeArgumentIndex = null;
                final Map<TypeVariable<?>, Type> typeArguments =
                    TypeUtils.getTypeArguments(containerClass, keyContainer);
                Type t = typeArguments
                    .get(keyContainer.getTypeParameters()[containerElementKey.getTypeArgumentIndex().intValue()]);
                while (t instanceof TypeVariable<?>) {
                    final TypeVariable<?> var = (TypeVariable<?>) t;
                    if (containerClass.equals(var.getGenericDeclaration())) {
                        typeArgumentIndex =
                            Integer.valueOf(ObjectUtils.indexOf(containerClass.getTypeParameters(), var));
                        break;
                    }
                    t = typeArguments.get(t);
                }
                key = new ContainerElementKey(containerClass, typeArgumentIndex);
            }
            return new UnwrappingInfo(key, valueExtractor);
        }