You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:49:28 UTC

[24/50] brooklyn-server git commit: XML persist: fix serializing MutableSet

XML persist: fix serializing MutableSet


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/8aa09c50
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/8aa09c50
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/8aa09c50

Branch: refs/heads/0.6.0
Commit: 8aa09c50bbd35032b8ed01f812dfbec5c75246f4
Parents: c7ff592
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 12 11:18:22 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 12 21:53:10 2013 +0000

----------------------------------------------------------------------
 .../util/xstream/MutableSetConverter.java       | 26 ++++++
 .../brooklyn/util/xstream/XmlSerializer.java    | 11 ++-
 .../persister/XmlMementoSerializerTest.java     | 94 ++++++++++++++++++++
 3 files changed, 130 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8aa09c50/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java b/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java
new file mode 100644
index 0000000..10bb618
--- /dev/null
+++ b/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java
@@ -0,0 +1,26 @@
+package brooklyn.util.xstream;
+
+import brooklyn.util.collections.MutableSet;
+
+import com.thoughtworks.xstream.converters.collections.CollectionConverter;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+public class MutableSetConverter extends CollectionConverter {
+
+    // Although this class seems pointless (!), without registering an explicit converter for MutableSet then the
+    // declaration for Set interferes, causing MutableSet.map field to be null on deserialization.
+    
+    public MutableSetConverter(Mapper mapper) {
+        super(mapper);
+    }
+
+    @Override
+    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
+        return MutableSet.class.isAssignableFrom(type);
+    }
+
+    @Override
+    protected Object createCollection(Class type) {
+        return new MutableSet<Object>();
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8aa09c50/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java b/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
index 55e68b4..b266259 100644
--- a/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
+++ b/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
@@ -9,7 +9,9 @@ import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
+import brooklyn.util.collections.MutableList;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.collections.MutableSet;
 
 import com.google.common.collect.ImmutableList;
 import com.thoughtworks.xstream.XStream;
@@ -27,10 +29,17 @@ public class XmlSerializer<T> {
         
         xstream.registerConverter(new StringKeyMapConverter(xstream.getMapper()), /* priority */ 10);
         xstream.alias("MutableMap", MutableMap.class);
+        xstream.alias("MutableSet", MutableSet.class);
+        xstream.alias("MutableList", MutableList.class);
+        
+        // Needs an explicit MutableSet converter!
+        // Without it, the alias for "set" seems to interfere with the MutableSet.map field, so it gets
+        // a null field on deserialization.
+        xstream.registerConverter(new MutableSetConverter(xstream.getMapper()));
         
         xstream.aliasType("ImmutableList", ImmutableList.class);
         xstream.registerConverter(new ImmutableListConverter(xstream.getMapper()));
-        
+
         xstream.registerConverter(new EnumCaseForgivingConverter());
         xstream.registerConverter(new Inet4AddressConverter());
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8aa09c50/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
new file mode 100644
index 0000000..855de46
--- /dev/null
+++ b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
@@ -0,0 +1,94 @@
+package brooklyn.entity.rebind.persister;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.util.collections.MutableList;
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.collections.MutableSet;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+public class XmlMementoSerializerTest {
+
+    private XmlMementoSerializer<Object> serializer;
+
+    @BeforeMethod(alwaysRun=true)
+    public void setUp() throws Exception {
+        serializer = new XmlMementoSerializer<Object>(XmlMementoSerializerTest.class.getClassLoader());
+    }
+    
+    @Test
+    public void testMutableSet() throws Exception {
+        Set<?> obj = MutableSet.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testLinkedHashSet() throws Exception {
+        Set<String> obj = new LinkedHashSet<String>();
+        obj.add("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testImmutableSet() throws Exception {
+        Set<String> obj = ImmutableSet.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testMutableList() throws Exception {
+        List<?> obj = MutableList.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testLinkedList() throws Exception {
+        List<String> obj = new LinkedList<String>();
+        obj.add("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testImmutableList() throws Exception {
+        List<String> obj = ImmutableList.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testMutableMap() throws Exception {
+        Map<?,?> obj = MutableMap.of("mykey", "myval");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testLinkedHashMap() throws Exception {
+        Map<String,String> obj = new LinkedHashMap<String,String>();
+        obj.put("mykey", "myval");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testImmutableMap() throws Exception {
+        Map<?,?> obj = ImmutableMap.of("mykey", "myval");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    private void assertSerializeAndDeserialize(Object obj) throws Exception {
+        String serializedForm = serializer.toString(obj);
+        Object deserialized = serializer.fromString(serializedForm);
+        assertEquals(deserialized, obj);
+    }
+}