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);
+
+ }
+
+
+}