in xstream/src/java/com/thoughtworks/xstream/converters/collections/TreeMapConverter.java [109:142]
protected void populateTreeMap(final HierarchicalStreamReader reader, final UnmarshallingContext context,
final TreeMap<?, ?> result, Comparator<?> comparator) {
final boolean inFirstElement = comparator == NULL_MARKER;
if (inFirstElement) {
comparator = null;
}
@SuppressWarnings("unchecked")
final SortedMap<Object, Object> sortedMap = new PresortedMap<>((Comparator<Object>)(comparator != null
&& JVM.hasOptimizedTreeMapPutAll() ? comparator : null));
if (inFirstElement) {
// we are already within the first entry
putCurrentEntryIntoMap(reader, context, result, sortedMap);
reader.moveUp();
}
populateMap(reader, context, result, sortedMap);
@SuppressWarnings("unchecked")
final TreeMap<Object, Object> typedResult = (TreeMap<Object, Object>)result;
try {
if (JVM.hasOptimizedTreeMapPutAll()) {
if (comparator != null && Reflections.comparatorField != null) {
Reflections.comparatorField.set(result, comparator);
}
typedResult.putAll(sortedMap); // internal optimization will not call comparator
} else if (Reflections.comparatorField != null) {
Reflections.comparatorField.set(result, sortedMap.comparator());
typedResult.putAll(sortedMap); // "sort" by index
Reflections.comparatorField.set(result, comparator);
} else {
typedResult.putAll(sortedMap); // will use comparator for already sorted map
}
} catch (final IllegalAccessException e) {
throw new ObjectAccessException("Cannot set comparator of TreeMap", e);
}
}