public final Groups computeCascadingGroups()

in bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java [89:127]


    public final Groups computeCascadingGroups(Set<GroupConversionDescriptor> groupConversions, Class<?> group) {
        final Groups preliminaryResult = computeGroups(Stream.of(group));

        final Map<Class<?>, Class<?>> gcMap = groupConversions.stream()
            .collect(Collectors.toMap(GroupConversionDescriptor::getFrom, GroupConversionDescriptor::getTo));

        final boolean simpleGroup = preliminaryResult.getSequences().isEmpty();

        // conversion of a simple (non-sequence) group:
        if (simpleGroup && gcMap.containsKey(group)) {
            return computeGroups(Stream.of(gcMap.get(group)));
        }
        final Groups result = new Groups();

        if (simpleGroup) {
            // ignore group inheritance from initial argument as that is handled elsewhere:
            result.insertGroup(preliminaryResult.getGroups().iterator().next());
        } else {
            // expand group sequence conversions in place:

            for (Group.Sequence seq : preliminaryResult.getSequences()) {
                final List<Group> converted = new ArrayList<>();
                for (Group gg : seq.getGroups()) {
                    final Class<?> c = gg.getGroup();
                    if (gcMap.containsKey(c)) {
                        final Groups convertedGroupExpansion = computeGroups(Stream.of(gcMap.get(c)));
                        if (convertedGroupExpansion.getSequences().isEmpty()) {
                            converted.add(gg);
                        } else {
                            convertedGroupExpansion.getSequences().stream().map(Group.Sequence::getGroups)
                                .flatMap(Collection::stream).forEach(converted::add);
                        }
                    }
                }
                result.insertSequence(converted);
            }
        }
        return result;
    }