private void hierarchy()

in bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java [186:213]


    private void hierarchy(Consumer<ContainerElementKey> sink) {
        final TypeVariable<?> var;
        if (typeArgumentIndex == null) {
            var = null;
        } else {
            var = containerClass.getTypeParameters()[typeArgumentIndex.intValue()];
        }
        final Lazy<Set<ContainerElementKey>> round = new Lazy<>(LinkedHashSet::new);
        Stream
            .concat(Stream.of(containerClass.getAnnotatedSuperclass()),
                Stream.of(containerClass.getAnnotatedInterfaces()))
            .filter(AnnotatedParameterizedType.class::isInstance).map(AnnotatedParameterizedType.class::cast)
            .forEach(t -> {
                final AnnotatedType[] args = ((AnnotatedParameterizedType) t).getAnnotatedActualTypeArguments();
                for (int i = 0; i < args.length; i++) {
                    final Type boundArgumentType = args[i].getType();
                    if (boundArgumentType instanceof Class<?> || boundArgumentType.equals(var)) {
                        round.get().add(new ContainerElementKey(t, Integer.valueOf(i)));
                    }
                }
            });

        round.optional().ifPresent(s -> {
            s.forEach(sink);
            // recurse:
            s.forEach(k -> k.hierarchy(sink));
        });
    }