public Object unmarshal()

in xstream/src/java/com/thoughtworks/xstream/converters/collections/TreeSetConverter.java [59:99]


    public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) {
        TreeSet<Object> result = null;
        final TreeMap<?, ?> treeMap;
        final Comparator<?> unmarshalledComparator = treeMapConverter.unmarshalComparator(reader, context, null);
        final boolean inFirstElement = unmarshalledComparator instanceof Mapper.Null;
        @SuppressWarnings("unchecked")
        final Comparator<Object> comparator = inFirstElement ? null : (Comparator<Object>)unmarshalledComparator;
        if (Reflections.sortedMapField != null) {
            final TreeSet<Object> possibleResult = comparator == null ? new TreeSet<>() : new TreeSet<>(comparator);
            Object backingMap = null;
            try {
                backingMap = Reflections.sortedMapField.get(possibleResult);
            } catch (final IllegalAccessException e) {
                throw new ObjectAccessException("Cannot get backing map of TreeSet", e);
            }
            if (backingMap instanceof TreeMap) {
                treeMap = (TreeMap<?, ?>)backingMap;
                result = possibleResult;
            } else {
                treeMap = null;
            }
        } else {
            treeMap = null;
        }
        if (treeMap == null) {
            final PresortedSet<Object> set = new PresortedSet<>(comparator);
            result = comparator == null ? new TreeSet<>() : new TreeSet<>(comparator);
            if (inFirstElement) {
                // we are already within the first element
                addCurrentElementToCollection(reader, context, result, set);
                reader.moveUp();
            }
            populateCollection(reader, context, result, set);
            if (set.size() > 0) {
                result.addAll(set); // comparator will not be called if internally optimized
            }
        } else {
            treeMapConverter.populateTreeMap(reader, context, treeMap, unmarshalledComparator);
        }
        return result;
    }