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