You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2018/09/05 22:08:06 UTC

[1/2] tinkerpop git commit: TINKERPOP-2028: Register GremlinServerModule to GraphSON message serializer

Repository: tinkerpop
Updated Branches:
  refs/heads/master bcee71a93 -> d6677350b


TINKERPOP-2028: Register GremlinServerModule to GraphSON message serializer


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

Branch: refs/heads/master
Commit: 66d6a865be1da049918487bad3d493df43876063
Parents: c9fcc13
Author: Kevin Gallardo <ke...@datastax.com>
Authored: Tue Aug 28 15:34:30 2018 -0400
Committer: Kevin Gallardo <ke...@datastax.com>
Committed: Wed Sep 5 16:31:43 2018 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../structure/io/graphson/GraphSONMapper.java   | 17 ++++++
 .../AbstractGraphSONMessageSerializerV2d0.java  | 11 ++--
 .../GraphSONMessageSerializerGremlinV2d0.java   | 26 ++++++++-
 .../ser/GraphSONMessageSerializerV2d0.java      | 26 ++++++++-
 .../ser/GraphSONMessageSerializerV3d0.java      | 30 +++++++++--
 .../ser/GraphSONMessageSerializerV2d0Test.java  | 55 +++++++++++++++++++-
 .../ser/GraphSONMessageSerializerV3d0Test.java  | 49 ++++++++++++++++-
 8 files changed, 200 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index cbb4b21..5b6c65d 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 
 This release also includes changes from <<release-3-3-3, 3.3.3>>.
 
+* GraphSON `MessageSerializer`s will automatically register the GremlinServerModule to a provided GraphSONMapper.
 * Implemented `ShortestPathVertexProgram` and the `shortestPath()` step.
 * `AbstractGraphProvider` uses `g.io()` for loading test data.
 * Added the `io()` start step and `read()` and `write()` termination steps to the Gremlin language.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapper.java
index e8b83ce..b553271 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapper.java
@@ -161,6 +161,23 @@ public class GraphSONMapper implements Mapper<ObjectMapper> {
         return new Builder();
     }
 
+    /**
+     * Create a new Builder from a given {@link GraphSONMapper}.
+     *
+     * @return a new builder, with properties taken from the original mapper already applied.
+     */
+    public static Builder build(final GraphSONMapper mapper) {
+        Builder builder = build();
+
+        builder.customModules = mapper.customModules;
+        builder.version = mapper.version;
+        builder.loadCustomModules = mapper.loadCustomSerializers;
+        builder.normalize = mapper.normalize;
+        builder.typeInfo = mapper.typeInfo;
+
+        return builder;
+    }
+
     public TypeInfo getTypeInfo() {
         return this.typeInfo;
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java
index 7ae17a3..fcd389a 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/AbstractGraphSONMessageSerializerV2d0.java
@@ -54,18 +54,20 @@ public abstract class AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
 
     protected ObjectMapper mapper;
 
-    protected final TypeReference<Map<String, Object>> mapTypeReference = new TypeReference<Map<String, Object>>() {
-    };
-
     public AbstractGraphSONMessageSerializerV2d0() {
         final GraphSONMapper.Builder builder = configureBuilder(initBuilder(null));
         mapper = builder.create().createMapper();
     }
 
+    @Deprecated
     public AbstractGraphSONMessageSerializerV2d0(final GraphSONMapper mapper) {
         this.mapper = mapper.createMapper();
     }
 
+    public AbstractGraphSONMessageSerializerV2d0(final GraphSONMapper.Builder mapperBuilder) {
+        this.mapper = configureBuilder(mapperBuilder).create().createMapper();
+    }
+
     abstract byte[] obtainHeader();
 
     abstract GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder);
@@ -140,8 +142,7 @@ public abstract class AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
 
     private GraphSONMapper.Builder initBuilder(final GraphSONMapper.Builder builder) {
         final GraphSONMapper.Builder b = null == builder ? GraphSONMapper.build() : builder;
-        return b.addCustomModule(new AbstractGraphSONMessageSerializerV2d0.GremlinServerModule())
-                .addCustomModule(GraphSONXModuleV2d0.build().create(false))
+        return b.addCustomModule(GraphSONXModuleV2d0.build().create(false))
                 .version(GraphSONVersion.V2_0);
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0.java
index 9ae4798..d7db881 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0.java
@@ -41,14 +41,38 @@ public final class GraphSONMessageSerializerGremlinV2d0 extends AbstractGraphSON
         header = buffer.array();
     }
 
+    /**
+     * Creates a default GraphSONMessageSerializerGremlin.
+     * <p>
+     * By default this will internally instantiate a {@link GraphSONMapper} and register
+     * a {@link GremlinServerModule} and {@link org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV2d0} to the mapper.
+     *
+     * @see #GraphSONMessageSerializerGremlinV2d0(GraphSONMapper.Builder)
+     */
     public GraphSONMessageSerializerGremlinV2d0() {
         super();
     }
 
+    /**
+     * Create a GraphSONMessageSerializer from a {@link GraphSONMapper}. Deprecated, use
+     * {@link #GraphSONMessageSerializerGremlinV2d0(GraphSONMapper.Builder)} instead.
+     */
+    @Deprecated
     public GraphSONMessageSerializerGremlinV2d0(final GraphSONMapper mapper) {
         super(mapper);
     }
 
+    /**
+     * Create a GraphSONMessageSerializerGremlin with a provided {@link GraphSONMapper.Builder}.
+     * <p>
+     * Note that to make this mapper usable in the context of request messages and responses,
+     * this method will automatically register a {@link GremlinServerModule} to the provided
+     * mapper.
+     */
+    public GraphSONMessageSerializerGremlinV2d0(final GraphSONMapper.Builder mapperBuilder) {
+        super(mapperBuilder);
+    }
+
     @Override
     public String[] mimeTypesSupported() {
         return new String[]{MIME_TYPE};
@@ -62,6 +86,6 @@ public final class GraphSONMessageSerializerGremlinV2d0 extends AbstractGraphSON
     @Override
     GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
         // already set to 2.0 in AbstractGraphSONMessageSerializerV2d0
-        return builder.typeInfo(TypeInfo.PARTIAL_TYPES);
+        return builder.typeInfo(TypeInfo.PARTIAL_TYPES).addCustomModule(new GremlinServerModule());
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0.java
index 251b5c1..2321485 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0.java
@@ -50,14 +50,38 @@ public final class GraphSONMessageSerializerV2d0 extends AbstractGraphSONMessage
         header = buffer.array();
     }
 
+        /**
+         * Creates a default GraphSONMessageSerializer.
+         *
+         * By default this will internally instantiate a {@link GraphSONMapper} and register
+         * a {@link GremlinServerModule} and {@link GraphSONXModuleV2d0} to the mapper.
+         *
+         * @see #GraphSONMessageSerializerV2d0(GraphSONMapper.Builder)
+         */
     public GraphSONMessageSerializerV2d0() {
         super();
     }
 
+    /**
+     * Create a GraphSONMessageSerializer from a {@link GraphSONMapper}. Deprecated, use
+     * {@link #GraphSONMessageSerializerV2d0(GraphSONMapper.Builder)} instead.
+     */
+    @Deprecated
     public GraphSONMessageSerializerV2d0(final GraphSONMapper mapper) {
         super(mapper);
     }
 
+    /**
+     * Create a GraphSONMessageSerializer with a provided {@link GraphSONMapper.Builder}.
+     *
+     * Note that to make this mapper usable in the context of request messages and responses,
+     * this method will automatically register a {@link GremlinServerModule} to the provided
+     * mapper.
+     */
+    public GraphSONMessageSerializerV2d0(final GraphSONMapper.Builder mapperBuilder) {
+        super(mapperBuilder);
+    }
+
     @Override
     public String[] mimeTypesSupported() {
         return new String[]{MIME_TYPE};
@@ -66,7 +90,7 @@ public final class GraphSONMessageSerializerV2d0 extends AbstractGraphSONMessage
     @Override
     GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
         // already set to 2.0 in AbstractGraphSONMessageSerializerV2d0
-        return builder.typeInfo(TypeInfo.PARTIAL_TYPES);
+        return builder.typeInfo(TypeInfo.PARTIAL_TYPES).addCustomModule(new GremlinServerModule());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0.java
index 502a2ff..53668f4 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0.java
@@ -20,16 +20,12 @@ package org.apache.tinkerpop.gremlin.driver.ser;
 
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
-import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.TypeInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.nio.ByteBuffer;
-import java.util.Map;
-import java.util.UUID;
 
 /**
  * Serialize results to JSON with version 3.0.x schema and the extended module.
@@ -49,14 +45,38 @@ public final class GraphSONMessageSerializerV3d0 extends AbstractGraphSONMessage
         header = buffer.array();
     }
 
+    /**
+     * Creates a default GraphSONMessageSerializer.
+     * <p>
+     * By default this will internally instantiate a {@link GraphSONMapper} and register
+     * a {@link GremlinServerModule} and {@link org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV3d0} to the mapper.
+     *
+     * @see #GraphSONMessageSerializerV3d0(GraphSONMapper.Builder)
+     */
     public GraphSONMessageSerializerV3d0() {
         super();
     }
 
+    /**
+     * Create a GraphSONMessageSerializer from a {@link GraphSONMapper}. Deprecated, use
+     * {@link #GraphSONMessageSerializerV3d0(GraphSONMapper.Builder)} instead.
+     */
+    @Deprecated
     public GraphSONMessageSerializerV3d0(final GraphSONMapper mapper) {
         super(mapper);
     }
 
+    /**
+     * Create a GraphSONMessageSerializer with a provided {@link GraphSONMapper.Builder}.
+     *
+     * Note that to make this mapper usable in the context of request messages and responses,
+     * this method will automatically register a {@link GremlinServerModule} to the provided
+     * mapper.
+     */
+    public GraphSONMessageSerializerV3d0(final GraphSONMapper.Builder mapperBuilder) {
+        super(mapperBuilder);
+    }
+
     @Override
     public String[] mimeTypesSupported() {
         return new String[]{MIME_TYPE, "application/json"};
@@ -65,7 +85,7 @@ public final class GraphSONMessageSerializerV3d0 extends AbstractGraphSONMessage
     @Override
     GraphSONMapper.Builder configureBuilder(final GraphSONMapper.Builder builder) {
         // override the 2.0 in AbstractGraphSONMessageSerializerV2d0
-        return builder.version(GraphSONVersion.V3_0);
+        return builder.version(GraphSONVersion.V3_0).addCustomModule(new GremlinServerModule());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV2d0Test.java
----------------------------------------------------------------------
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 0bdc08d..dc23179 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
@@ -18,6 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.driver.ser;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import io.netty.buffer.UnpooledByteBufAllocator;
+import org.apache.log4j.Level;
+import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
@@ -35,11 +40,13 @@ 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.structure.io.graphson.GraphSONXModuleV2d0;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.apache.tinkerpop.shaded.jackson.core.JsonGenerationException;
 import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
+import org.apache.tinkerpop.shaded.jackson.databind.JsonMappingException;
 import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
 import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
@@ -64,6 +71,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 /**
@@ -72,6 +80,7 @@ import static org.junit.Assert.fail;
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
+@SuppressWarnings("unchecked")
 public class GraphSONMessageSerializerV2d0Test {
 
     public static final GraphSONMessageSerializerV2d0 SERIALIZER = new GraphSONMessageSerializerV2d0();
@@ -79,6 +88,10 @@ public class GraphSONMessageSerializerV2d0Test {
             .overrideRequestId(UUID.fromString("2D62161B-9544-4F39-AF44-62EC49F9A595")).create();
     private static final ObjectMapper mapper = new ObjectMapper();
 
+    private final UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
+    private final ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId);
+    private final static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
+
     @Test
     public void shouldConfigureIoRegistry() throws Exception {
         final GraphSONMessageSerializerV1d0 serializer = new GraphSONMessageSerializerV1d0();
@@ -363,7 +376,6 @@ public class GraphSONMessageSerializerV2d0Test {
 
     @Test
     public void shouldDeserializeRequestNicelyWithArgs() throws Exception {
-        final GraphSONMessageSerializerV2d0 serializer = new GraphSONMessageSerializerV2d0();
         final UUID request = UUID.fromString("011CFEE9-F640-4844-AC93-034448AC0E80");
         final RequestMessage m = SERIALIZER.deserializeRequest(String.format("{\"requestId\":\"%s\",\"op\":\"eval\",\"args\":{\"x\":\"y\"}}", request));
         assertEquals(request, m.getRequestId());
@@ -540,6 +552,47 @@ public class GraphSONMessageSerializerV2d0Test {
         assertEquals(responseMessage.getStatus().getMessage(), responseMessageRead.getStatus().getMessage());
     }
 
+    @Test
+    public void shouldRegisterGremlinServerModuleAutomaticallyWithMapper() throws SerializationException {
+        GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV2d0.build().create(false));
+        GraphSONMessageSerializerV2d0 graphSONMessageSerializerV2d0 = new GraphSONMessageSerializerV2d0(builder);
+
+        ResponseMessage rm = convert("hello", graphSONMessageSerializerV2d0);
+        assertEquals(rm.getRequestId(), requestId);
+        assertEquals(rm.getResult().getData(), "hello");
+    }
+
+
+    @Test
+    @SuppressWarnings("deprecation")
+    public void shouldFailOnMessageSerializerWithMapperIfNoGremlinServerModule() {
+        org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(AbstractGraphSONMessageSerializerV2d0.class);
+        Level previousLevel = logger.getLevel();
+
+        // Disable temporarily logging for this test
+        logger.setLevel(Level.OFF);
+
+        GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV2d0.build().create(false));
+        GraphSONMessageSerializerV2d0 graphSONMessageSerializerV2d0 = new GraphSONMessageSerializerV2d0(builder.create());
+
+        try {
+            convert("hello", graphSONMessageSerializerV2d0);
+            fail("Serialization should have failed since no GremlinServerModule registered.");
+        } catch (SerializationException e) {
+            assertTrue(e.getMessage().contains("Could not find a type identifier for the class"));
+            assertTrue(e.getCause() instanceof JsonMappingException);
+            assertTrue(e.getCause().getCause() instanceof IllegalArgumentException);
+        }
+
+        // Put logger level back to its original value
+        logger.setLevel(previousLevel);
+    }
+
+    private ResponseMessage convert(final Object toSerialize, MessageSerializer serializer) throws SerializationException {
+        final ByteBuf bb = serializer.serializeResponseAsBinary(responseMessageBuilder.result(toSerialize).create(), allocator);
+        return serializer.deserializeResponse(bb);
+    }
+
     private class FunObject {
         private String val;
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/66d6a865/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
index 88dfcf0..00c5b2e 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
@@ -21,6 +21,8 @@ package org.apache.tinkerpop.gremlin.driver.ser;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.buffer.UnpooledByteBufAllocator;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
 import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
@@ -32,9 +34,12 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONXModuleV3d0;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.apache.tinkerpop.shaded.jackson.databind.JsonMappingException;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -48,6 +53,7 @@ import java.util.UUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 /**
@@ -55,6 +61,7 @@ import static org.junit.Assert.fail;
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
+@SuppressWarnings("unchecked")
 public class GraphSONMessageSerializerV3d0Test {
 
     private final UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
@@ -337,14 +344,52 @@ public class GraphSONMessageSerializerV3d0Test {
         assertEquals("bytecode", m.getOp());
         assertNotNull(m.getArgs());
     }
-    
+
+    @Test
+    public void shouldRegisterGremlinServerModuleAutomaticallyWithMapper() throws SerializationException {
+        GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV3d0.build().create(false));
+        GraphSONMessageSerializerV3d0 graphSONMessageSerializerV3d0 = new GraphSONMessageSerializerV3d0(builder);
+
+        ResponseMessage rm = convert("hello", graphSONMessageSerializerV3d0);
+        assertEquals(rm.getRequestId(), requestId);
+        assertEquals(rm.getResult().getData(), "hello");
+    }
+
+    @Test
+    public void shouldFailOnMessageSerializerWithMapperIfNoGremlinServerModule() {
+        Logger logger = Logger.getLogger(AbstractGraphSONMessageSerializerV2d0.class);
+        Level previousLevel = logger.getLevel();
+
+        // Disable temporarily logging for this test
+        logger.setLevel(Level.OFF);
+
+        GraphSONMapper.Builder builder = GraphSONMapper.build().addCustomModule(GraphSONXModuleV3d0.build().create(false));
+        GraphSONMessageSerializerV3d0 graphSONMessageSerializerV3d0 = new GraphSONMessageSerializerV3d0(builder.create());
+
+        try {
+            convert("hello", graphSONMessageSerializerV3d0);
+            fail("Serialization should have failed since no GremlinServerModule registered.");
+        } catch (SerializationException e) {
+            assertTrue(e.getMessage().contains("Could not find a type identifier for the class"));
+            assertTrue(e.getCause() instanceof JsonMappingException);
+            assertTrue(e.getCause().getCause() instanceof IllegalArgumentException);
+        }
+
+        // Put logger level back to its original value
+        logger.setLevel(previousLevel);
+    }
+
     private void assertCommon(final ResponseMessage response) {
         assertEquals(requestId, response.getRequestId());
         assertEquals(ResponseStatusCode.SUCCESS, response.getStatus().getCode());
     }
 
-    private ResponseMessage convert(final Object toSerialize) throws SerializationException {
+    private ResponseMessage convert(final Object toSerialize, MessageSerializer serializer) throws SerializationException {
         final ByteBuf bb = serializer.serializeResponseAsBinary(responseMessageBuilder.result(toSerialize).create(), allocator);
         return serializer.deserializeResponse(bb);
     }
+
+    private ResponseMessage convert(final Object toSerialize) throws SerializationException {
+        return convert(toSerialize, this.serializer);
+    }
 }


[2/2] tinkerpop git commit: Merge branch 'pr-923'

Posted by sp...@apache.org.
Merge branch 'pr-923'


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

Branch: refs/heads/master
Commit: d6677350b51180d1cd8d3f1b70a07871966e3264
Parents: bcee71a 66d6a86
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Sep 5 16:40:17 2018 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Sep 5 16:40:17 2018 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../structure/io/graphson/GraphSONMapper.java   | 17 ++++++
 .../AbstractGraphSONMessageSerializerV2d0.java  | 11 ++--
 .../GraphSONMessageSerializerGremlinV2d0.java   | 26 ++++++++-
 .../ser/GraphSONMessageSerializerV2d0.java      | 26 ++++++++-
 .../ser/GraphSONMessageSerializerV3d0.java      | 30 +++++++++--
 .../ser/GraphSONMessageSerializerV2d0Test.java  | 55 +++++++++++++++++++-
 .../ser/GraphSONMessageSerializerV3d0Test.java  | 49 ++++++++++++++++-
 8 files changed, 200 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d6677350/CHANGELOG.asciidoc
----------------------------------------------------------------------