in bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java [143:177]
Map<String, PropertyDescriptor> getProperties(BeanD<T> parent) {
final Map<String, List<PropertyD<?>>> properties = new LinkedHashMap<>();
final Function<? super String, ? extends List<PropertyD<?>>> descriptorList = k -> new ArrayList<>();
beanBuilder.getFields(meta).forEach((f, builder) -> {
final Field fld = Reflection.find(meta.getHost(), t -> Reflection.getDeclaredField(t, f));
properties.computeIfAbsent(f, descriptorList).add(
new PropertyD.ForField(new MetadataReader.ForContainer<>(new Meta.ForField(fld), builder), parent));
});
beanBuilder.getGetters(meta).forEach((g, builder) -> {
final Method getter = Methods.getter(meta.getHost(), g);
if (getter == null) {
Exceptions.raise(IllegalStateException::new, "Getter method for property %s not found", g);
}
properties.computeIfAbsent(g, descriptorList).add(new PropertyD.ForMethod(
new MetadataReader.ForContainer<>(new Meta.ForMethod(getter), builder), parent));
});
return properties.entrySet().stream().collect(ToUnmodifiable.map(Map.Entry::getKey, e -> {
final List<PropertyD<?>> delegates = e.getValue();
if (delegates.size() == 1) {
return delegates.get(0);
}
final Set<PropertyD<?>> constrained =
delegates.stream().filter(DescriptorManager::isConstrained).collect(Collectors.toSet());
if (constrained.isEmpty()) {
return delegates.get(0);
}
if (constrained.size() == 1) {
return constrained.iterator().next();
}
return new ComposedD.ForProperty(delegates);
}));
}