Map getProperties()

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