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 2017/01/10 21:49:18 UTC

tinkerpop git commit: Added specific serializer for RequestMessage

Repository: tinkerpop
Updated Branches:
  refs/heads/tp32 3c80611ac -> 0f5efa401


Added specific serializer for RequestMessage

This makes it so that RequestMessage no longer needs to rely on the field serializers for RequestMessage which makes full roundtrip serialization work properly for GraphSON 2.0. CTR


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

Branch: refs/heads/tp32
Commit: 0f5efa4016825116b4bc6f0f2c7e7acc87773a1e
Parents: 3c80611
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Tue Jan 10 16:04:07 2017 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Tue Jan 10 16:05:48 2017 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../AbstractGraphSONMessageSerializerV2d0.java  | 62 +++++++++++++++++++-
 .../ser/GraphSONMessageSerializerV2d0Test.java  | 23 ++++----
 3 files changed, 73 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f5efa40/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 4411f99..4e02b6f 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -31,6 +31,7 @@ TinkerPop 3.2.4 (Release Date: NOT OFFICIALLY RELEASED YET)
 * Fixed a bug in `LazyBarrierStrategy` where `profile()` was deactivating it accidentally.
 * Fixed a bug in `RepeatUnrollStrategy` where stateful `DedupGlobalStep` was cloned and thus, maintained two deduplication sets.
 * Added documentation around "terminal steps" in Gremlin: `hasNext()`, `next()`, `toList()`, etc.
+* Added specific GraphSON serializers for `RequestMessage` and `ResponseMessage` in GraphSON 2.0.
 * Added `CloseableIterator` to allow `Graph` providers who open expensive resources a way to let users release them.
 * Fixed minor bug in `gremlin-driver` where closing a session-based `Client` without initializing it could generate an error.
 * Relieved synchronization pressure in various areas of `TinkerGraphComputer`.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f5efa40/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 5cd5198..92dedbb 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
@@ -176,9 +176,11 @@ public abstract class AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
             // SERIALIZERS
             addSerializer(JsonBuilder.class, new JsonBuilderJacksonSerializer());
             addSerializer(ResponseMessage.class, new ResponseMessageSerializer());
+            addSerializer(RequestMessage.class, new RequestMessageSerializer());
 
             //DESERIALIZERS
             addDeserializer(ResponseMessage.class, new ResponseMessageDeserializer());
+            addDeserializer(RequestMessage.class, new RequestMessageDeserializer());
         }
     }
 
@@ -198,6 +200,62 @@ public abstract class AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
         }
     }
 
+    public final static class RequestMessageSerializer extends StdSerializer<RequestMessage> {
+        public RequestMessageSerializer() {
+            super(RequestMessage.class);
+        }
+
+        @Override
+        public void serialize(final RequestMessage requestMessage, final JsonGenerator jsonGenerator,
+                              final SerializerProvider serializerProvider) throws IOException {
+            ser(requestMessage, jsonGenerator, serializerProvider, null);
+        }
+
+        @Override
+        public void serializeWithType(final RequestMessage requestMessage, final JsonGenerator jsonGenerator,
+                                      final SerializerProvider serializerProvider,
+                                      final TypeSerializer typeSerializer) throws IOException {
+            ser(requestMessage, jsonGenerator, serializerProvider, typeSerializer);
+        }
+
+        public void ser(final RequestMessage requestMessage, final JsonGenerator jsonGenerator,
+                        final SerializerProvider serializerProvider,
+                        final TypeSerializer typeSerializer) throws IOException {
+            GraphSONUtil.writeStartObject(requestMessage, jsonGenerator, typeSerializer);
+
+            jsonGenerator.writeStringField(SerTokens.TOKEN_REQUEST, requestMessage.getRequestId().toString());
+            jsonGenerator.writeStringField(SerTokens.TOKEN_OP, requestMessage.getOp());
+            jsonGenerator.writeStringField(SerTokens.TOKEN_PROCESSOR, requestMessage.getProcessor());
+            jsonGenerator.writeObjectField(SerTokens.TOKEN_ARGS, requestMessage.getArgs());
+
+            GraphSONUtil.writeEndObject(requestMessage, jsonGenerator, typeSerializer);
+        }
+    }
+
+    public final static class RequestMessageDeserializer extends AbstractObjectDeserializer<RequestMessage> {
+        protected RequestMessageDeserializer() {
+            super(RequestMessage.class);
+        }
+
+        @Override
+        public RequestMessage createObject(final Map<String, Object> data) {
+            final Map<String, Object> args = (Map<String, Object>) data.get(SerTokens.TOKEN_ARGS);
+            RequestMessage.Builder builder = RequestMessage.build(data.get(SerTokens.TOKEN_OP).toString())
+                    .overrideRequestId(UUID.fromString(data.get(SerTokens.TOKEN_REQUEST).toString()));
+
+            if (data.containsKey(SerTokens.TOKEN_PROCESSOR))
+                builder = builder.processor(data.get(SerTokens.TOKEN_PROCESSOR).toString());
+
+            if (args != null) {
+                for (Map.Entry<String, Object> kv : args.entrySet()) {
+                    builder = builder.addArg(kv.getKey(), kv.getValue());
+                }
+            }
+
+            return builder.create();
+        }
+    }
+
     public final static class ResponseMessageSerializer extends StdSerializer<ResponseMessage> {
         public ResponseMessageSerializer() {
             super(ResponseMessage.class);
@@ -238,7 +296,7 @@ public abstract class AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
                 jsonGenerator.writeNullField(SerTokens.TOKEN_DATA);
             } else {
                 jsonGenerator.writeFieldName(SerTokens.TOKEN_DATA);
-                Object result = responseMessage.getResult().getData();
+                final Object result = responseMessage.getResult().getData();
                 serializerProvider.findTypedValueSerializer(result.getClass(), true, null).serialize(result, jsonGenerator, serializerProvider);
             }
 
@@ -255,7 +313,7 @@ public abstract class AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
         }
         
         @Override
-        public ResponseMessage createObject(Map<String, Object> data) {
+        public ResponseMessage createObject(final Map<String, Object> data) {
             final Map<String, Object> status = (Map<String, Object>) data.get(SerTokens.TOKEN_STATUS);
             final Map<String, Object> result = (Map<String, Object>) data.get(SerTokens.TOKEN_RESULT);
             return ResponseMessage.build(UUID.fromString(data.get(SerTokens.TOKEN_REQUEST).toString()))

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f5efa40/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 460e935..108b230 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
@@ -363,6 +363,7 @@ 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());
@@ -493,8 +494,8 @@ public class GraphSONMessageSerializerV2d0Test {
     }
 
     @Test
-    public void shouldSerializeAndDeserializeResponseAndRequestFromObjectMapper() throws IOException {
-        ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
+    public void shouldSerializeAndDeserializeRequestMessageFromObjectMapper() throws IOException {
+        final ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
                 .addCustomModule(new GraphSONMessageSerializerGremlinV2d0.GremlinServerModule())
                 .create().createMapper();
 
@@ -504,12 +505,12 @@ public class GraphSONMessageSerializerV2d0Test {
         final Map<String, Object> requestAliases = new HashMap<>();
         requestAliases.put("g", "social");
 
-        RequestMessage requestMessage = RequestMessage.build("eval").processor("session").
+        final RequestMessage requestMessage = RequestMessage.build("eval").processor("session").
                 overrideRequestId(UUID.fromString("cb682578-9d92-4499-9ebc-5c6aa73c5397")).
                 add("gremlin", "social.V(x)", "bindings", requestBindings, "language", "gremlin-groovy", "aliases", requestAliases, "session", UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).create();
 
-        String json = om.writeValueAsString(requestMessage);
-        RequestMessage readRequestMessage = om.readValue(json, RequestMessage.class);
+        final String json = om.writeValueAsString(requestMessage);
+        final RequestMessage readRequestMessage = om.readValue(json, RequestMessage.class);
 
         assertEquals(requestMessage.getOp(), readRequestMessage.getOp());
         assertEquals(requestMessage.getProcessor(), readRequestMessage.getProcessor());
@@ -518,18 +519,18 @@ public class GraphSONMessageSerializerV2d0Test {
     }
 
     @Test
-    public void shouldSerializeAndDeserializeResponseFromObjectMapper() throws IOException {
-        ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
+    public void shouldSerializeAndDeserializeResponseMessageFromObjectMapper() throws IOException {
+        final ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
                 .addCustomModule(new GraphSONMessageSerializerGremlinV2d0.GremlinServerModule())
                 .create().createMapper();
-        Graph graph = TinkerFactory.createModern();
+        final Graph graph = TinkerFactory.createModern();
 
-        ResponseMessage responseMessage = ResponseMessage.build(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).
+        final ResponseMessage responseMessage = ResponseMessage.build(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786")).
                 code(org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode.SUCCESS).
                 result(Collections.singletonList(graph.vertices().next())).create();
 
-        String respJson = om.writeValueAsString(responseMessage);
-        ResponseMessage responseMessageRead = om.readValue(respJson, ResponseMessage.class);
+        final String respJson = om.writeValueAsString(responseMessage);
+        final ResponseMessage responseMessageRead = om.readValue(respJson, ResponseMessage.class);
 
         assertEquals(responseMessage.getRequestId(), responseMessageRead.getRequestId());
         assertEquals(responseMessage.getResult().getMeta(), responseMessageRead.getResult().getMeta());