From 5060dce47be41afb97669c86d0829a249292ef71 Mon Sep 17 00:00:00 2001 From: Kevin Gallardo Date: Thu, 22 Sep 2016 11:56:20 +0100 Subject: [PATCH] Fixed SerializerProvider for GraphSON 2.0. --- .../graphson/GraphSONSerializerProvider.java | 12 +++++++--- .../GraphSONMessageSerializerV2d0Test.java | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java index c373692bbaa..60c320008b6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java @@ -33,7 +33,7 @@ */ final class GraphSONSerializerProvider extends DefaultSerializerProvider { private static final long serialVersionUID = 1L; - private static JsonSerializer unknownTypeSerializer = new ToStringSerializer(); + private final JsonSerializer unknownTypeSerializer; public GraphSONSerializerProvider(GraphSONVersion version) { super(); @@ -47,8 +47,10 @@ public GraphSONSerializerProvider(GraphSONVersion version) { } protected GraphSONSerializerProvider(final SerializerProvider src, - final SerializationConfig config, final SerializerFactory f) { + final SerializationConfig config, final SerializerFactory f, + final JsonSerializer unknownTypeSerializer) { super(src, config, f); + this.unknownTypeSerializer = unknownTypeSerializer; } @Override @@ -59,6 +61,10 @@ public JsonSerializer getUnknownTypeSerializer(final Class aClass) { @Override public GraphSONSerializerProvider createInstance(final SerializationConfig config, final SerializerFactory jsf) { - return new GraphSONSerializerProvider(this, config, jsf); + // createInstance is called pretty often to create a new SerializerProvider + // we give it the unknownTypeSerializer that we had in the first place, + // when the object was first constructed through the public constructor + // that has a GraphSONVersion. + return new GraphSONSerializerProvider(this, config, jsf, unknownTypeSerializer); } } diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java index de9b493d590..d3dbecc0274 100644 --- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java +++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java @@ -29,8 +29,12 @@ import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.io.AbstractIoRegistry; +import org.apache.tinkerpop.gremlin.structure.io.GraphWriter; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONIo; +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens; +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion; +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; @@ -46,6 +50,7 @@ import org.junit.Test; import java.awt.Color; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -467,6 +472,25 @@ public void shouldSerializeToTreeJson() throws Exception { .get(GraphSONTokens.VALUE).asText()); } + @Test + public void shouldToStringUnknownObjects() { + GraphSONMapper gm20 = GraphSONMapper.build().version(GraphSONVersion.V2_0).create(); + GraphSONMapper gm10 = GraphSONMapper.build().version(GraphSONVersion.V1_0).create(); + + GraphWriter writer = GraphSONWriter.build().mapper(gm20).create(); + // subsequent creations of GraphWriters and GraphSONMappers should not affect + // each other. + GraphWriter writer2 = GraphSONWriter.build().mapper(gm10).create(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + writer.writeObject(baos, new FunObject("value")); + assertEquals(baos.toString(), "\"value\""); + } catch (Exception e) { + fail("should have succeeded serializing the unknown object to a string"); + } + } + private class FunObject { private String val;