Title: [2289] trunk/xstream/src: Merge fix for XSTR-757 from 1.4.x branch to HEAD.
Revision
2289
Author
joehni
Date
2014-06-16 16:36:39 -0500 (Mon, 16 Jun 2014)

Log Message

Merge fix for XSTR-757 from 1.4.x branch to HEAD.

Modified Paths


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&ouml;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:

http://xircles.codehaus.org/manage_email

Reply via email to