in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java [1035:1085]
private <T> Collection<T> mapCollection(final Mappings.CollectionMapping mapping, final JsonArray jsonArray,
final Adapter itemConverter, ObjectConverter.Reader objectConverter,
final JsonPointerTracker jsonPointer, final Type rootType) {
final Collection collection;
if (SortedSet.class == mapping.raw || NavigableSet.class == mapping.raw || TreeSet.class == mapping.raw) {
collection = new TreeSet<T>();
} else if (Set.class == mapping.raw || HashSet.class == mapping.raw) {
collection = new HashSet<T>(jsonArray.size());
} else if (Queue.class == mapping.raw || ArrayBlockingQueue.class == mapping.raw) {
collection = new ArrayBlockingQueue<T>(jsonArray.size());
} else if (List.class == mapping.raw || Collection.class == mapping.raw || ArrayList.class == mapping.raw || EnumSet.class == mapping.raw) {
collection = new ArrayList<T>(jsonArray.size());
} else if (LinkedHashSet.class == mapping.raw) {
collection = new LinkedHashSet<T>(jsonArray.size());
} else if (LinkedList.class == mapping.raw) {
collection = new LinkedList<T>();
} else if (Deque.class == mapping.raw || ArrayDeque.class == mapping.raw) {
collection = new ArrayDeque(jsonArray.size());
} else if (PriorityQueue.class == mapping.raw) {
collection = new PriorityQueue(jsonArray.size());
} else {
throw new IllegalStateException("not supported collection type: " + mapping.raw.getName());
}
int i = 0;
for (final JsonValue value : jsonArray) {
collection.add(JsonValue.NULL.equals(value)
? null
: toValue(null, value, null, itemConverter, mapping.arg, objectConverter,
isDedup() ? new JsonPointerTracker(jsonPointer, i) : null, rootType, MapperException::new));
i++;
}
if (EnumSet.class == mapping.raw) {
if (!config.isSupportEnumContainerDeserialization()) {
throw new MapperException("Enum container deserialization disabled, " +
"set supportEnumContainerDeserialization=true to enable it");
}
if (collection.isEmpty()) {
return EnumSet.noneOf(Class.class.cast(mapping.arg));
} else if (collection.size() == 1) {
return Collection.class.cast(EnumSet.of(Enum.class.cast(collection.iterator().next())));
} else {
final List<Enum> list = List.class.cast(collection);
return Collection.class.cast(EnumSet.of(list.get(0), list.subList(1, list.size()).toArray(new Enum[list.size() - 1])));
}
}
return collection;
}