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 <[email protected]> Authored: Fri May 3 19:46:12 2013 +0200 Committer: Tammo van Lessen <[email protected]> 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; }
