adding jackson key serializer for maps

Project: http://git-wip-us.apache.org/repos/asf/ode/repo
Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/ed28ffae
Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/ed28ffae
Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/ed28ffae

Branch: refs/heads/ODE-912
Commit: ed28ffaeb4f57b4b65d6431b55b4ae354569043f
Parents: 3da01a1
Author: fangzhen <[email protected]>
Authored: Thu Jul 24 14:53:45 2014 +0800
Committer: fangzhen <[email protected]>
Committed: Thu Jul 24 14:53:45 2014 +0800

----------------------------------------------------------------------
 .../ode/bpel/obj/serde/JsonOmDeserializer.java  |  4 ++
 .../ode/bpel/obj/serde/JsonOmSerializer.java    |  7 ++++
 .../bpel/obj/serde/KeyAsJsonDeserializer.java   | 22 +++++++++++
 .../ode/bpel/obj/serde/KeyAsJsonSerializer.java | 30 +++++++++++++++
 .../bpel/obj/serde/jacksonhack/JacksonTest.java | 40 +++++++++++++++++++-
 5 files changed, 101 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java
index 40345fe..3141c0a 100644
--- 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java
@@ -2,10 +2,12 @@ package org.apache.ode.bpel.obj.serde;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.wsdl.OperationType;
+import javax.xml.namespace.QName;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -71,6 +73,8 @@ public class JsonOmDeserializer implements OmDeserializer {
                                        (JsonDeserializer) 
deserializers.get(d));
                }
                simpleModule.setDeserializerModifier(new OModelDeserModifier());
+               simpleModule.addKeyDeserializer(Object.class, new 
KeyAsJsonDeserializer());
+               simpleModule.addKeyDeserializer(String.class, new 
KeyAsJsonDeserializer());
                mapper.registerModule(simpleModule);
 
                wrapper = mapper.readValue(is, OProcessWrapper.class);

http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java
index 1daa427..c5503fc 100644
--- 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java
@@ -3,13 +3,16 @@ package org.apache.ode.bpel.obj.serde;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.Type;
+import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.wsdl.OperationType;
+import javax.xml.namespace.QName;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.elang.xpath10.obj.OXPath10Expression;
 import org.apache.ode.bpel.obj.OProcessWrapper;
 import org.apache.ode.bpel.obj.serde.jacksonhack.TypeBeanSerializerFactory;
 import org.apache.ode.utils.NSContext;
@@ -70,6 +73,10 @@ public class JsonOmSerializer implements OmSerializer {
                        simpleModule.addSerializer((Class) ss,
                                        (JsonSerializer) serializers.get(ss));
                }
+//             simpleModule.addKeySerializer(QName.class, new 
KeyAsJsonSerializer());
+//             simpleModule.addKeySerializer(URI.class, new 
KeyAsJsonSerializer());
+//             
simpleModule.addKeySerializer(OXPath10Expression.SigGetVariableData.class, new 
KeyAsJsonSerializer());
+               simpleModule.addKeySerializer(Object.class, new 
KeyAsJsonSerializer());
                mapper.registerModule(simpleModule);
                
                mapper.enable(SerializationFeature.INDENT_OUTPUT);

http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java
 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java
new file mode 100644
index 0000000..2baa787
--- /dev/null
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonDeserializer.java
@@ -0,0 +1,22 @@
+package org.apache.ode.bpel.obj.serde;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.KeyDeserializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class KeyAsJsonDeserializer extends KeyDeserializer{
+       static ObjectMapper mapper = new ObjectMapper();
+       static {
+               
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);       
+       }
+       @Override
+       public Object deserializeKey(String key, DeserializationContext ctxt)
+                       throws IOException, JsonProcessingException {
+               return mapper.readValue(key, Object.class);
+       }
+       
+
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java
 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java
new file mode 100644
index 0000000..ede595e
--- /dev/null
+++ 
b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/KeyAsJsonSerializer.java
@@ -0,0 +1,30 @@
+package org.apache.ode.bpel.obj.serde;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public class KeyAsJsonSerializer extends JsonSerializer<Object> {
+       static ObjectMapper mapper = new ObjectMapper();
+       static {
+               
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+       }
+       @Override
+       public void serialize(Object value, JsonGenerator jgen,
+                       SerializerProvider provider) throws IOException,
+                       JsonProcessingException {
+               String json;
+               if (value instanceof String) {
+                       json = (String)value;
+               }else{
+                       json = mapper.writeValueAsString(value);
+               }
+               json = mapper.writeValueAsString(value);
+               jgen.writeFieldName(json);
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/ode/blob/ed28ffae/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java
----------------------------------------------------------------------
diff --git 
a/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java
 
b/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java
index 2756cc1..ae92799 100644
--- 
a/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java
+++ 
b/bpel-nobj/src/test/java/org/apache/ode/bpel/obj/serde/jacksonhack/JacksonTest.java
@@ -8,13 +8,22 @@ import java.io.IOException;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import javax.xml.namespace.QName;
+
+import org.apache.ode.bpel.obj.serde.KeyAsJsonDeserializer;
+import org.apache.ode.bpel.obj.serde.KeyAsJsonSerializer;
 import org.junit.Test;
 
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
 import com.fasterxml.jackson.annotation.JsonIdentityInfo;
 import com.fasterxml.jackson.annotation.ObjectIdGenerators;
 import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 
 public class JacksonTest {
        /**
@@ -26,14 +35,14 @@ public class JacksonTest {
        @Test
        public void testReference() throws JsonGenerationException,
                        JsonMappingException, IOException {
-               Map<String, Object> map = new LinkedHashMap<String, Object>();
+               Map<Object, Object> map = new LinkedHashMap<Object, Object>();
                A a = new A();
                a.next = a;
                a.val = 100;
                map.put("i1", 100);
                map.put("i2", a);
                map.put("i4", a);
-               Map<String, Object> map2 = new LinkedHashMap<String, Object>();
+               Map<Object, Object> map2 = new LinkedHashMap<Object, Object>();
                String s = "a string";
                map2.put("i31", s);
                map2.put("i33", s);
@@ -47,6 +56,7 @@ public class JacksonTest {
                ObjectMapper mapper = new ObjectMapper();
                mapper.setSerializerFactory(TypeBeanSerializerFactory.instance);
                
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+               mapper.enable(SerializationFeature.INDENT_OUTPUT);
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                mapper.writeValue(os, map);
                ByteArrayInputStream is = new 
ByteArrayInputStream(os.toByteArray());
@@ -93,5 +103,31 @@ public class JacksonTest {
                        return parent;
                }
        }
+       static class C{
+               @JsonSerialize(keyUsing=KeyAsJsonSerializer.class)
+               @JsonDeserialize(keyUsing=KeyAsJsonDeserializer.class)
+               Map<Object, Object> map = new LinkedHashMap<Object, Object>();
+       
+       }
+       @Test
+       public void testMapTypeInfo() throws JsonParseException, 
JsonMappingException, IOException{
+               ObjectMapper mapper = new ObjectMapper();
+               mapper.setSerializerFactory(TypeBeanSerializerFactory.instance);
+               
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+               mapper.enable(SerializationFeature.INDENT_OUTPUT);
+               ByteArrayOutputStream os = new ByteArrayOutputStream();
+               
+               C c = new C();
+               QName qname = new QName("uri","localtest");
+               c.map.put(qname, qname);
+               mapper.writeValue(os, c);
 
+               ByteArrayInputStream is = new 
ByteArrayInputStream(os.toByteArray());
+               ObjectMapper m2 = new ObjectMapper();
+               m2.setSerializerFactory(TypeBeanSerializerFactory.instance);
+               m2.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+
+               C de = m2.readValue(is, C.class);
+               assertEquals(c.map, de.map);
+       }
 }

Reply via email to