Add ResponseMessageDeserializer for GraphSON2.

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

Branch: refs/heads/TINKERPOP-1545-tp32
Commit: 5ba605bf67fe6c46cdb874b63703cf65aa25fa6a
Parents: 3064b93
Author: Kevin Gallardo <[email protected]>
Authored: Thu Jan 5 11:57:32 2017 -0500
Committer: Kevin Gallardo <[email protected]>
Committed: Thu Jan 5 11:57:32 2017 -0500

----------------------------------------------------------------------
 .../AbstractGraphSONMessageSerializerV2d0.java  | 36 ++++++++++----
 .../ser/GraphSONMessageSerializerV2d0.java      | 11 +----
 .../ser/GraphSONMessageSerializerV2d0Test.java  | 49 ++++++++++++++++++++
 3 files changed, 76 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ba605bf/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 52cbda2..5cd5198 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
@@ -26,6 +26,7 @@ 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.Graph;
+import 
org.apache.tinkerpop.gremlin.structure.io.graphson.AbstractObjectDeserializer;
 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.GraphSONUtil;
@@ -154,16 +155,7 @@ public abstract class 
AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
         try {
             final byte[] payload = new byte[msg.readableBytes()];
             msg.readBytes(payload);
-            final Map<String, Object> responseData = mapper.readValue(payload, 
mapTypeReference);
-            final Map<String, Object> status = (Map<String, Object>) 
responseData.get(SerTokens.TOKEN_STATUS);
-            final Map<String, Object> result = (Map<String, Object>) 
responseData.get(SerTokens.TOKEN_RESULT);
-            return 
ResponseMessage.build(UUID.fromString(responseData.get(SerTokens.TOKEN_REQUEST).toString()))
-                    .code(ResponseStatusCode.getFromValue((Integer) 
status.get(SerTokens.TOKEN_CODE)))
-                    
.statusMessage(status.get(SerTokens.TOKEN_MESSAGE).toString())
-                    .statusAttributes((Map<String, Object>) 
status.get(SerTokens.TOKEN_ATTRIBUTES))
-                    .result(result.get(SerTokens.TOKEN_DATA))
-                    .responseMetaData((Map<String, Object>) 
result.get(SerTokens.TOKEN_META))
-                    .create();
+            return mapper.readValue(payload, ResponseMessage.class);
         } catch (Exception ex) {
             logger.warn("Response [{}] could not be deserialized by {}.", msg, 
AbstractGraphSONMessageSerializerV2d0.class.getName());
             throw new SerializationException(ex);
@@ -180,8 +172,13 @@ public abstract class 
AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
     public final static class GremlinServerModule extends SimpleModule {
         public GremlinServerModule() {
             super("graphson-gremlin-server");
+
+            // SERIALIZERS
             addSerializer(JsonBuilder.class, new 
JsonBuilderJacksonSerializer());
             addSerializer(ResponseMessage.class, new 
ResponseMessageSerializer());
+
+            //DESERIALIZERS
+            addDeserializer(ResponseMessage.class, new 
ResponseMessageDeserializer());
         }
     }
 
@@ -251,4 +248,23 @@ public abstract class 
AbstractGraphSONMessageSerializerV2d0 extends AbstractMess
             GraphSONUtil.writeEndObject(responseMessage, jsonGenerator, 
typeSerializer);
         }
     }
+    
+    public final static class ResponseMessageDeserializer extends 
AbstractObjectDeserializer<ResponseMessage> {
+        protected ResponseMessageDeserializer() {
+            super(ResponseMessage.class);
+        }
+        
+        @Override
+        public ResponseMessage createObject(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()))
+                    .code(ResponseStatusCode.getFromValue((Integer) 
status.get(SerTokens.TOKEN_CODE)))
+                    
.statusMessage(status.get(SerTokens.TOKEN_MESSAGE).toString())
+                    .statusAttributes((Map<String, Object>) 
status.get(SerTokens.TOKEN_ATTRIBUTES))
+                    .result(result.get(SerTokens.TOKEN_DATA))
+                    .responseMetaData((Map<String, Object>) 
result.get(SerTokens.TOKEN_META))
+                    .create();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ba605bf/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 89432d9..251b5c1 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
@@ -77,16 +77,7 @@ public final class GraphSONMessageSerializerV2d0 extends 
AbstractGraphSONMessage
     @Override
     public ResponseMessage deserializeResponse(final String msg) throws 
SerializationException {
         try {
-            final Map<String, Object> responseData = mapper.readValue(msg, 
mapTypeReference);
-            final Map<String, Object> status = (Map<String, Object>) 
responseData.get(SerTokens.TOKEN_STATUS);
-            final Map<String, Object> result = (Map<String, Object>) 
responseData.get(SerTokens.TOKEN_RESULT);
-            return 
ResponseMessage.build(UUID.fromString(responseData.get(SerTokens.TOKEN_REQUEST).toString()))
-                    .code(ResponseStatusCode.getFromValue((Integer) 
status.get(SerTokens.TOKEN_CODE)))
-                    
.statusMessage(status.get(SerTokens.TOKEN_MESSAGE).toString())
-                    .statusAttributes((Map<String, Object>) 
status.get(SerTokens.TOKEN_ATTRIBUTES))
-                    .result(result.get(SerTokens.TOKEN_DATA))
-                    .responseMetaData((Map<String, Object>) 
result.get(SerTokens.TOKEN_META))
-                    .create();
+            return mapper.readValue(msg, ResponseMessage.class);
         } catch (Exception ex) {
             logger.warn("Response [{}] could not be deserialized by {}.", msg, 
AbstractGraphSONMessageSerializerV2d0.class.getName());
             throw new SerializationException(ex);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ba605bf/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 d3dbecc..460e935 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
@@ -54,6 +54,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -491,6 +492,54 @@ public class GraphSONMessageSerializerV2d0Test {
         }
     }
 
+    @Test
+    public void 
shouldSerializeAndDeserializeResponseAndRequestFromObjectMapper() throws 
IOException {
+        ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
+                .addCustomModule(new 
GraphSONMessageSerializerGremlinV2d0.GremlinServerModule())
+                .create().createMapper();
+
+        final Map<String, Object> requestBindings = new HashMap<>();
+        requestBindings.put("x", 1);
+
+        final Map<String, Object> requestAliases = new HashMap<>();
+        requestAliases.put("g", "social");
+
+        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);
+
+        assertEquals(requestMessage.getOp(), readRequestMessage.getOp());
+        assertEquals(requestMessage.getProcessor(), 
readRequestMessage.getProcessor());
+        assertEquals(requestMessage.getRequestId(), 
readRequestMessage.getRequestId());
+        assertEquals(requestMessage.getArgs(), readRequestMessage.getArgs());
+    }
+
+    @Test
+    public void shouldSerializeAndDeserializeResponseFromObjectMapper() throws 
IOException {
+        ObjectMapper om = GraphSONMapper.build().version(GraphSONVersion.V2_0)
+                .addCustomModule(new 
GraphSONMessageSerializerGremlinV2d0.GremlinServerModule())
+                .create().createMapper();
+        Graph graph = TinkerFactory.createModern();
+
+        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);
+
+        assertEquals(responseMessage.getRequestId(), 
responseMessageRead.getRequestId());
+        assertEquals(responseMessage.getResult().getMeta(), 
responseMessageRead.getResult().getMeta());
+        assertEquals(responseMessage.getResult().getData(), 
responseMessageRead.getResult().getData());
+        assertEquals(responseMessage.getStatus().getAttributes(), 
responseMessageRead.getStatus().getAttributes());
+        assertEquals(responseMessage.getStatus().getCode().getValue(), 
responseMessageRead.getStatus().getCode().getValue());
+        assertEquals(responseMessage.getStatus().getCode().isSuccess(), 
responseMessageRead.getStatus().getCode().isSuccess());
+        assertEquals(responseMessage.getStatus().getMessage(), 
responseMessageRead.getStatus().getMessage());
+    }
+
     private class FunObject {
         private String val;
 

Reply via email to