Log Message
Merge fix for XSTR-757 from 1.4.x branch to HEAD.
Modified Paths
- trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/TreeSetConverter.java
- trunk/xstream/src/test/com/thoughtworks/acceptance/TreeMapAndTreeSetTest.java
Diff
Modified: trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/TreeSetConverter.java (2288 => 2289)
--- trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/TreeSetConverter.java 2014-06-16 21:29:12 UTC (rev 2288)
+++ trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/TreeSetConverter.java 2014-06-16 21:36:39 UTC (rev 2289)
@@ -6,7 +6,7 @@
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
- *
+ *
* Created on 08. May 2004 by Joe Walnes
*/
package com.thoughtworks.xstream.converters.collections;
@@ -36,15 +36,49 @@
* <p>
* The converter assumes that the elements in the XML are already sorted according the comparator.
* </p>
- *
+ *
* @author Joe Walnes
* @author Jörg Schaible
*/
public class TreeSetConverter extends CollectionConverter {
private transient TreeMapConverter treeMapConverter;
- private final static Field sortedMapField = JVM.hasOptimizedTreeSetAddAll() ? Fields.locate(TreeSet.class,
- SortedMap.class, false) : null;
+ private final static Field sortedMapField;
+ private final static Object constantValue;
+ static {
+ Object value = null;
+ sortedMapField = JVM.hasOptimizedTreeSetAddAll() ? Fields.locate(TreeSet.class, SortedMap.class, false) : null;
+ if (sortedMapField != null) {
+ final TreeSet<String> set = new TreeSet<String>();
+ set.add("1");
+ set.add("2");
+ Map<String, Object> backingMap = null;
+ try {
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> map = (Map<String, Object>)sortedMapField.get(set);
+ backingMap = map;
+ } catch (final IllegalAccessException e) {
+ // give up;
+ }
+ if (backingMap != null) {
+ final Object[] values = backingMap.values().toArray();
+ if (values[0] == values[1]) {
+ value = values[0];
+ }
+ }
+ } else {
+ final Field valueField = Fields.locate(TreeSet.class, Object.class, true);
+ if (valueField != null) {
+ try {
+ value = valueField.get(null);
+ } catch (final IllegalAccessException e) {
+ // give up;
+ }
+ }
+ }
+ constantValue = value;
+ }
+
public TreeSetConverter(final Mapper mapper) {
super(mapper, TreeSet.class);
readResolve();
@@ -67,7 +101,7 @@
final Comparator<Object> comparator = inFirstElement ? null : (Comparator<Object>)unmarshalledComparator;
if (sortedMapField != null) {
final TreeSet<Object> possibleResult = comparator == null ? new TreeSet<Object>() : new TreeSet<Object>(
- comparator);
+ comparator);
Object backingMap = null;
try {
backingMap = sortedMapField.get(possibleResult);
@@ -112,7 +146,7 @@
public boolean add(final Object object) {
@SuppressWarnings("unchecked")
final Map<Object, Object> collectionTarget = (Map<Object, Object>)target;
- return collectionTarget.put(object, object) != null;
+ return collectionTarget.put(object, constantValue != null ? constantValue : object) != null;
}
@Override
Modified: trunk/xstream/src/test/com/thoughtworks/acceptance/TreeMapAndTreeSetTest.java (2288 => 2289)
--- trunk/xstream/src/test/com/thoughtworks/acceptance/TreeMapAndTreeSetTest.java 2014-06-16 21:29:12 UTC (rev 2288)
+++ trunk/xstream/src/test/com/thoughtworks/acceptance/TreeMapAndTreeSetTest.java 2014-06-16 21:36:39 UTC (rev 2289)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2005 Joe Walnes.
- * Copyright (C) 2006, 2007, 2010, 2011, 2013 XStream Committers.
+ * Copyright (C) 2006, 2007, 2010, 2011, 2013, 2014 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -200,4 +200,14 @@
assertEquals(new ArrayList(set), new ArrayList(result));
}
}
+
+ public void testTreeSetRemoveWorksProperlyAfterDeserialization() {
+ TreeSet set = new TreeSet();
+ set.add("guy");
+ set.add("hi");
+ set.add("bye");
+
+ TreeSet result = (TreeSet) xstream.fromXML(xstream.toXML(set));
+ assertTrue(result.remove("hi"));
+ }
}
To unsubscribe from this list please visit:
