You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by va...@apache.org on 2013/05/03 19:56:22 UTC

[1/2] git commit: refactoring of jacob-specific jackson configuration options into a JacksonModule.

Updated Branches:
  refs/heads/master 9c05eb2c3 -> b24164026


refactoring of jacob-specific jackson configuration options into a JacksonModule.


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

Branch: refs/heads/master
Commit: e9db3569390d6c3e7efa526b3b601130705a2b5d
Parents: 9c05eb2
Author: Tammo van Lessen <tv...@gmail.com>
Authored: Fri May 3 19:46:12 2013 +0200
Committer: Tammo van Lessen <tv...@gmail.com>
Committed: Fri May 3 19:46:12 2013 +0200

----------------------------------------------------------------------
 .../soup/jackson/JacksonExecutionQueueImpl.java    |   56 ---------------
 .../JacobJacksonAnnotationIntrospector.java        |   23 ++++++
 .../apache/ode/jacob/soup/jackson/JacobModule.java |   53 ++++++++++++++
 .../ode/jacob/examples/helloworld/HelloWorld.java  |    9 ++-
 4 files changed, 81 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode-jacob/blob/e9db3569/src/main/java/org/apache/ode/jacob/soup/jackson/JacksonExecutionQueueImpl.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/ode/jacob/soup/jackson/JacksonExecutionQueueImpl.java b/src/main/java/org/apache/ode/jacob/soup/jackson/JacksonExecutionQueueImpl.java
index fb08f10..3658a98 100644
--- a/src/main/java/org/apache/ode/jacob/soup/jackson/JacksonExecutionQueueImpl.java
+++ b/src/main/java/org/apache/ode/jacob/soup/jackson/JacksonExecutionQueueImpl.java
@@ -26,33 +26,20 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import org.apache.ode.jacob.Channel;
-import org.apache.ode.jacob.ChannelProxy;
 import org.apache.ode.jacob.soup.Continuation;
 import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.core.JsonGenerationException;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonToken;
-import com.fasterxml.jackson.core.Version;
-import com.fasterxml.jackson.databind.BeanDescription;
-import com.fasterxml.jackson.databind.DeserializationConfig;
 import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
 import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
-import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 
 /**
@@ -67,49 +54,6 @@ public class JacksonExecutionQueueImpl extends ExecutionQueueImpl {
 		super(null);
 	}
 	
-    public static void configureMapper(ObjectMapper om) {
-        
-        SimpleModule sm = new SimpleModule("jacob", Version.unknownVersion());
-        
-        final ChannelProxySerializer cps = new ChannelProxySerializer();
-        
-        sm.addSerializer(ChannelProxy.class, cps);
-        sm.addSerializer(Continuation.class, new ContinuationSerializer());
-        sm.addSerializer(JacksonExecutionQueueImpl.class, new ExecutionQueueImplSerializer(cps));
-        sm.addDeserializer(JacksonExecutionQueueImpl.class, new ExecutionQueueImplDeserializer());
-        sm.addDeserializer(Continuation.class, new ContinuationDeserializer());
-        sm.addDeserializer(Channel.class, new ChannelProxyDeserializer());
-        
-        sm.setDeserializerModifier(new BeanDeserializerModifier() {
-
-            public JsonDeserializer<?> modifyDeserializer(
-                    DeserializationConfig config, BeanDescription beanDesc,
-                    JsonDeserializer<?> deserializer) {
-                
-                // use channel proxy deserializer for channels.
-                if (Channel.class.isAssignableFrom(beanDesc.getBeanClass()) && beanDesc.getBeanClass().isInterface()) {
-                    return new ChannelProxyDeserializer();
-                }
-
-                return super.modifyDeserializer(config, beanDesc, deserializer);
-            }
-        });
-        
-        om.registerModule(sm);
-        om.disable(MapperFeature.AUTO_DETECT_CREATORS);
-        om.disable(MapperFeature.AUTO_DETECT_GETTERS);
-        om.disable(MapperFeature.AUTO_DETECT_IS_GETTERS);
-        om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
-        
-        om.setDefaultTyping(new JacobTypeResolverBuilder());
-        om.setAnnotationIntrospector(new JacobJacksonAnnotationIntrospector());
-        
-        om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
-        om.enable(SerializationFeature.WRITE_ENUMS_USING_INDEX);
-        //om.enable(SerializationFeature.INDENT_OUTPUT);
-    }
-
-	
     public static class ExecutionQueueImplSerializer extends StdSerializer<JacksonExecutionQueueImpl> {
 
         private ChannelProxySerializer channelProxySerializer;

http://git-wip-us.apache.org/repos/asf/ode-jacob/blob/e9db3569/src/main/java/org/apache/ode/jacob/soup/jackson/JacobJacksonAnnotationIntrospector.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/ode/jacob/soup/jackson/JacobJacksonAnnotationIntrospector.java b/src/main/java/org/apache/ode/jacob/soup/jackson/JacobJacksonAnnotationIntrospector.java
index ba8b7b1..f3c16b6 100644
--- a/src/main/java/org/apache/ode/jacob/soup/jackson/JacobJacksonAnnotationIntrospector.java
+++ b/src/main/java/org/apache/ode/jacob/soup/jackson/JacobJacksonAnnotationIntrospector.java
@@ -1,14 +1,22 @@
 package org.apache.ode.jacob.soup.jackson;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
 import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.cfg.MapperConfig;
 import com.fasterxml.jackson.databind.introspect.Annotated;
+import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
 import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
 import com.fasterxml.jackson.databind.introspect.ObjectIdInfo;
+import com.fasterxml.jackson.databind.introspect.VisibilityChecker;
+import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
 
 public class JacobJacksonAnnotationIntrospector extends
         JacksonAnnotationIntrospector {
 
     private static final long serialVersionUID = 1L;
+    private TypeResolverBuilder<?> jacobTypeResolver = new JacobTypeResolverBuilder();
 
     /* enable object ids for all objects. */
     @Override
@@ -16,4 +24,19 @@ public class JacobJacksonAnnotationIntrospector extends
         return new ObjectIdInfo("@id", Object.class, ObjectIdGenerators.IntSequenceGenerator.class);
     }
 
+    /* use custom type resolver */
+    @Override
+    public TypeResolverBuilder<?> findTypeResolver(MapperConfig<?> config,
+            AnnotatedClass ac, JavaType baseType) {
+        return jacobTypeResolver;
+    }
+
+    /* disable creator visibility */
+    // TODO: Check if there is a better way to only serialize non-transient fields.
+    @Override
+    public VisibilityChecker<?> findAutoDetectVisibility(AnnotatedClass ac,
+            VisibilityChecker<?> checker) {
+        return VisibilityChecker.Std.defaultInstance().with(Visibility.NONE).withVisibility(PropertyAccessor.FIELD, Visibility.ANY);
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/ode-jacob/blob/e9db3569/src/main/java/org/apache/ode/jacob/soup/jackson/JacobModule.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/ode/jacob/soup/jackson/JacobModule.java b/src/main/java/org/apache/ode/jacob/soup/jackson/JacobModule.java
new file mode 100644
index 0000000..52c3541
--- /dev/null
+++ b/src/main/java/org/apache/ode/jacob/soup/jackson/JacobModule.java
@@ -0,0 +1,53 @@
+package org.apache.ode.jacob.soup.jackson;
+
+import org.apache.ode.jacob.Channel;
+import org.apache.ode.jacob.ChannelProxy;
+import org.apache.ode.jacob.soup.Continuation;
+import org.apache.ode.jacob.soup.jackson.JacksonExecutionQueueImpl.ExecutionQueueImplDeserializer;
+import org.apache.ode.jacob.soup.jackson.JacksonExecutionQueueImpl.ExecutionQueueImplSerializer;
+
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.BeanDescription;
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+public class JacobModule extends SimpleModule {
+
+    private static final long serialVersionUID = 1L;
+
+    public JacobModule() {
+        super("jacob-module", Version.unknownVersion());
+        
+        final ChannelProxySerializer cps = new ChannelProxySerializer();
+        addSerializer(ChannelProxy.class, cps);
+        addSerializer(Continuation.class, new ContinuationSerializer());
+        addSerializer(JacksonExecutionQueueImpl.class, new ExecutionQueueImplSerializer(cps));
+        addDeserializer(JacksonExecutionQueueImpl.class, new ExecutionQueueImplDeserializer());
+        addDeserializer(Continuation.class, new ContinuationDeserializer());
+        addDeserializer(Channel.class, new ChannelProxyDeserializer());
+        
+        setDeserializerModifier(new BeanDeserializerModifier() {
+
+            public JsonDeserializer<?> modifyDeserializer(
+                    DeserializationConfig config, BeanDescription beanDesc,
+                    JsonDeserializer<?> deserializer) {
+                
+                // use channel proxy deserializer for channels.
+                if (Channel.class.isAssignableFrom(beanDesc.getBeanClass()) && beanDesc.getBeanClass().isInterface()) {
+                    return new ChannelProxyDeserializer();
+                }
+
+                return super.modifyDeserializer(config, beanDesc, deserializer);
+            }
+        });
+    }
+    
+    @Override
+    public void setupModule(SetupContext context) {
+        context.appendAnnotationIntrospector(new JacobJacksonAnnotationIntrospector());
+        super.setupModule(context);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/ode-jacob/blob/e9db3569/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java b/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java
index 053d049..ece6ca8 100644
--- a/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java
+++ b/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java
@@ -25,13 +25,14 @@ import org.apache.ode.jacob.Synch;
 import org.apache.ode.jacob.Val;
 import org.apache.ode.jacob.examples.sequence.Sequence;
 import org.apache.ode.jacob.soup.jackson.JacksonExecutionQueueImpl;
+import org.apache.ode.jacob.soup.jackson.JacobModule;
 import org.apache.ode.jacob.vpu.JacobVPU;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.dataformat.smile.SmileFactory;
-import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
 
 /**
  * Simple Hello World example to showcase different
@@ -264,9 +265,9 @@ public class HelloWorld extends JacobRunnable {
         // sf.enable(SmileGenerator.Feature.ENCODE_BINARY_AS_7BIT);
         
         ObjectMapper mapper = new ObjectMapper(sf); 
+        mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
         
-        
-        JacksonExecutionQueueImpl.configureMapper(mapper);
+        mapper.registerModule(new JacobModule());
 
         JacobVPU vpu = new JacobVPU();
         JacksonExecutionQueueImpl queue = new JacksonExecutionQueueImpl();
@@ -287,7 +288,7 @@ public class HelloWorld extends JacobRunnable {
     public static JacksonExecutionQueueImpl loadAndRestoreQueue(ObjectMapper mapper, JacksonExecutionQueueImpl in) throws Exception {
         byte[] json = mapper.writeValueAsBytes(in);
         // print json
-        //System.out.println(new String(json));
+        System.out.println(new String(json));
         JacksonExecutionQueueImpl q2 = mapper.readValue(json, JacksonExecutionQueueImpl.class);
         return q2;
     }


[2/2] git commit: less console garbage.

Posted by va...@apache.org.
less console garbage.


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

Branch: refs/heads/master
Commit: b241640266f2bdfae235e501cb88ee484ec504b4
Parents: e9db356
Author: Tammo van Lessen <tv...@gmail.com>
Authored: Fri May 3 19:46:57 2013 +0200
Committer: Tammo van Lessen <tv...@gmail.com>
Committed: Fri May 3 19:46:57 2013 +0200

----------------------------------------------------------------------
 src/test/java/JacksonTest.java.bak |  124 +++++++++++++++++++++++++++++++
 1 files changed, 124 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ode-jacob/blob/b2416402/src/test/java/JacksonTest.java.bak
----------------------------------------------------------------------
diff --git a/src/test/java/JacksonTest.java.bak b/src/test/java/JacksonTest.java.bak
new file mode 100644
index 0000000..7e7fc1c
--- /dev/null
+++ b/src/test/java/JacksonTest.java.bak
@@ -0,0 +1,124 @@
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper.DefaultTypeResolverBuilder;
+import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
+import com.fasterxml.jackson.databind.introspect.Annotated;
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
+import com.fasterxml.jackson.databind.util.StdConverter;
+
+
+public class JacksonTest {
+    
+    static int nextId = 0;
+    static Map<Integer, Base> objectsById = new HashMap<Integer, JacksonTest.Base>();
+    Root root;
+    
+    @JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class)
+    public static class Base {
+        public int id;
+        
+        public Base() {
+            id = nextId++;
+        }
+    }
+    
+    @JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class)
+    public static class Root {
+        public Object a;
+        public Object b;
+        
+        public String toString() {
+            return "root [a=" + a + "; b=" + b + "]";
+        }
+    }
+    
+    public static class A extends Base {
+        public String someField = "foo";
+    }
+    
+    public static class B extends Base {
+        public String otherField = "bar";
+    }
+    
+    public static class Placeholder extends Base {
+    }
+    
+    public static class BaseToPlaceholderConverter extends StdConverter<Base, Placeholder> {
+
+        public Placeholder convert(Base value) {
+            Placeholder p = new Placeholder();
+            p.id = value.id;
+            return p;
+        }
+    }
+    public static class PlaceholderToBaseConverter extends StdConverter<Placeholder, Base> {
+
+        public Base convert(Placeholder value) {
+            return objectsById.get(value.id);
+        }
+    }
+    
+    public static class MyAnnotationInspector extends JacksonAnnotationIntrospector {
+        @Override
+        public Object findSerializationConverter(Annotated a) {
+            if (Base.class.isAssignableFrom(a.getRawType())) {
+                return new BaseToPlaceholderConverter();
+            }
+            return super.findSerializationConverter(a);
+        }
+
+        @Override
+        public Object findDeserializationConverter(Annotated a) {
+            if (Base.class.isAssignableFrom(a.getRawType())) {
+                return new PlaceholderToBaseConverter();
+            }
+            return super.findSerializationConverter(a);
+        }
+
+    }
+    
+    @Before
+    public void setUp() {
+        root = new Root();
+        
+        A a = new A();
+        B b = new B();
+        
+        root.a = a;
+        root.b = b;
+    
+        objectsById.put(a.id, a);
+        objectsById.put(b.id, b);
+    }
+    
+    @Test
+    public void test() throws Exception {
+        ObjectMapper om = new ObjectMapper();
+//        om.disable(MapperFeature.AUTO_DETECT_CREATORS);
+//        om.disable(MapperFeature.AUTO_DETECT_GETTERS);
+//        om.disable(MapperFeature.AUTO_DETECT_IS_GETTERS);
+//        om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
+        om.setAnnotationIntrospector(new MyAnnotationInspector());
+        om.enableDefaultTyping();
+
+        String json = om.writeValueAsString(root);
+        System.out.println(json);
+        
+        //Root root2 = om.readValue(json, Root.class);
+        System.out.println(root);
+        //System.out.println(root2);
+
+    }
+    
+    
+}