in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java [763:824]
private Object buildArray(final Type type, final JsonArray jsonArray, final Adapter itemConverter,
final ObjectConverter.Reader objectConverter,
final JsonPointerTracker jsonPointer, final Type rootType) {
if (Class.class.isInstance(type)) {
final Class clazz = Class.class.cast(type);
if (clazz.isArray()) {
final Class<?> componentType = clazz.getComponentType();
return buildArrayWithComponentType(jsonArray, componentType, itemConverter, jsonPointer, rootType);
}
if (Collection.class.isAssignableFrom(clazz)) {
final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(
new JohnzonParameterizedType(clazz, Object.class), rootType);
if (mapping != null) {
return mapCollection(mapping, jsonArray, itemConverter, objectConverter, jsonPointer, rootType);
}
}
}
if (ParameterizedType.class.isInstance(type)) {
final ParameterizedType genericType = ParameterizedType.class.cast(type);
if (Stream.class == genericType.getRawType()) {
return Stream.of(1).flatMap(seed -> Collection.class.cast(buildArray(
new JohnzonParameterizedType(List.class, genericType.getActualTypeArguments()),
jsonArray, itemConverter, objectConverter, jsonPointer, rootType)).stream());
}
final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(genericType, rootType);
if (mapping != null) {
return mapCollection(mapping, jsonArray, itemConverter, objectConverter, jsonPointer, rootType);
}
}
if (GenericArrayType.class.isInstance(type)) {
Type genericComponentType = GenericArrayType.class.cast(type).getGenericComponentType();
while (ParameterizedType.class.isInstance(genericComponentType)) {
genericComponentType = ParameterizedType.class.cast(genericComponentType).getRawType();
}
if (Class.class.isInstance(genericComponentType)) {
return buildArrayWithComponentType(jsonArray, Class.class.cast(genericComponentType), itemConverter, jsonPointer, rootType);
} // else: fail for now
}
if (Object.class == type) {
return buildArray(ANY_LIST, jsonArray, null, null, jsonPointer, rootType);
}
// guess we don't want to map stream impls - keep it lazy since it is the only advantage to have streams there
if (IntStream.class == type) {
return Stream.of(1).flatMapToInt(seed -> IntStream.of(int[].class.cast(
buildArray(int[].class, jsonArray, null, null, jsonPointer, rootType))));
}
if (LongStream.class == type) {
return Stream.of(1).flatMapToLong(seed -> LongStream.of(long[].class.cast(
buildArray(long[].class, jsonArray, null, null, jsonPointer, rootType))));
}
if (DoubleStream.class == type) {
return Stream.of(1).flatMapToDouble(seed -> DoubleStream.of(double[].class.cast(
buildArray(double[].class, jsonArray, null, null, jsonPointer, rootType))));
}
throw new UnsupportedOperationException("type " + type + " not supported");
}