protected void populateTreeMap()

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