in bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java [390:424]
private Stream<GraphContext> multiplex() {
final GraphContext multiplexContext = getMultiplexContext();
final Object value = multiplexContext.getValue();
if (value == null) {
return Stream.empty();
}
if (value.getClass().isArray()) {
// inconsistent: use Object[] here but specific type for Iterable? RI compatibility
final Class<?> arrayType = value instanceof Object[] ? Object[].class : value.getClass();
return IntStream.range(0, Array.getLength(value)).mapToObj(
i -> multiplexContext.child(NodeImpl.atIndex(i).inContainer(arrayType, null), Array.get(value, i)));
}
if (Map.class.isInstance(value)) {
return ((Map<?, ?>) value).entrySet().stream()
.map(e -> multiplexContext.child(
setContainerInformation(NodeImpl.atKey(e.getKey()), MAP_VALUE, descriptor.getElementClass()),
e.getValue()));
}
if (List.class.isInstance(value)) {
final List<?> l = (List<?>) value;
return IntStream.range(0, l.size())
.mapToObj(i -> multiplexContext.child(
setContainerInformation(NodeImpl.atIndex(i), ITERABLE_ELEMENT, descriptor.getElementClass()),
l.get(i)));
}
if (Iterable.class.isInstance(value)) {
final Stream.Builder<Object> b = Stream.builder();
((Iterable<?>) value).forEach(b);
return b.build()
.map(o -> multiplexContext.child(
setContainerInformation(NodeImpl.atIndex(null), ITERABLE_ELEMENT, descriptor.getElementClass()),
o));
}
return Stream.of(multiplexContext);
}