Repository: tinkerpop Updated Branches: refs/heads/TINKERPOP-1278 95e08c24d -> f0d0302ee
Enabled bytecode to be represented as graphson string or Bytecode object in RequestMessage. Ultimately, perhaps this should just be a GraphSON string as that will universally work across all languages. The problem with doing that right now is that without embedTypes(true) graphson won't work so well given that it is type lossy. I think we should just save that change for GraphSON 2.0. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f0d0302e Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f0d0302e Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f0d0302e Branch: refs/heads/TINKERPOP-1278 Commit: f0d0302ee0066f6ea2b9774b3c08887c905a4556 Parents: 95e08c2 Author: Stephen Mallette <[email protected]> Authored: Mon Aug 15 15:39:24 2016 -0400 Committer: Stephen Mallette <[email protected]> Committed: Mon Aug 15 15:39:24 2016 -0400 ---------------------------------------------------------------------- .../DefaultRemoteTraverserSerializers.java | 16 +++++++++++++++- .../structure/io/graphson/GraphSONSerializers.java | 1 + .../structure/io/graphson/GraphSONMapperTest.java | 6 +++++- .../server/op/traversal/TraversalOpProcessor.java | 9 ++++++++- 4 files changed, 29 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0d0302e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/DefaultRemoteTraverserSerializers.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/DefaultRemoteTraverserSerializers.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/DefaultRemoteTraverserSerializers.java index c5fd33e..2ff6cc6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/DefaultRemoteTraverserSerializers.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/DefaultRemoteTraverserSerializers.java @@ -19,12 +19,15 @@ package org.apache.tinkerpop.gremlin.process.remote.traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; +import org.apache.tinkerpop.gremlin.structure.Property; +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim; import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim; import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator; import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider; +import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer; import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer; import java.io.IOException; @@ -62,11 +65,22 @@ public final class DefaultRemoteTraverserSerializers { @Override public void serialize(final Traverser traverserInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { + ser(traverserInstance, jsonGenerator, serializerProvider, null); + } + + @Override + public void serializeWithType(final Traverser traverserInstance, final JsonGenerator jsonGenerator, + final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException { + ser(traverserInstance, jsonGenerator, serializerProvider, typeSerializer); + } + + private static void ser(final Traverser traverserInstance, final JsonGenerator jsonGenerator, + final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException { jsonGenerator.writeStartObject(); + if (typeSerializer != null) jsonGenerator.writeStringField(GraphSONTokens.CLASS, Traverser.class.getName()); jsonGenerator.writeObjectField("bulk", traverserInstance.bulk()); jsonGenerator.writeObjectField("value", traverserInstance.get()); jsonGenerator.writeEndObject(); } - } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0d0302e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializers.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializers.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializers.java index aaca316..974952c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializers.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializers.java @@ -95,6 +95,7 @@ final class GraphSONSerializers { throws IOException { ser(property, jsonGenerator, serializerProvider, null); } + @Override public void serializeWithType(final Property property, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer) throws IOException { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0d0302e/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java index 02c4b56..c872aab 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONMapperTest.java @@ -36,6 +36,8 @@ import java.time.Year; import java.time.YearMonth; import java.time.ZoneOffset; import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.Map; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.__; import static org.junit.Assert.assertEquals; @@ -145,6 +147,8 @@ public class GraphSONMapperTest { public void shouldHandleDefaultRemoteTraverser() throws Exception { final DefaultRemoteTraverser<String> traverser = new DefaultRemoteTraverser<>("test", 100); final String json = mapper.writeValueAsString(traverser); - // TODO: ASSERTION~~ + final Map<String,Object> m = mapper.readValue(json, HashMap.class); + assertEquals("test", m.get("value")); + assertEquals(100, m.get("bulk")); } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f0d0302e/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java ---------------------------------------------------------------------- diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java index a8facbf..b041a32 100644 --- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java +++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java @@ -46,6 +46,7 @@ import org.apache.tinkerpop.gremlin.server.util.TraversalIterator; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper; import org.apache.tinkerpop.gremlin.util.function.ThrowingConsumer; +import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,6 +69,7 @@ import static com.codahale.metrics.MetricRegistry.name; */ public class TraversalOpProcessor extends AbstractOpProcessor { private static final Logger logger = LoggerFactory.getLogger(TraversalOpProcessor.class); + private static final ObjectMapper mapper = GraphSONMapper.build().create().createMapper(); public static final String OP_PROCESSOR_NAME = "traversal"; public static final Timer traversalOpTimer = MetricManager.INSTANCE.getTimer(name(GremlinServer.class, "op", "traversal")); @@ -312,7 +314,12 @@ public class TraversalOpProcessor extends AbstractOpProcessor { final RequestMessage msg = context.getRequestMessage(); logger.debug("Traversal request {} for in thread {}", msg.getRequestId(), Thread.currentThread().getName()); - final Bytecode bytecode = GraphSONMapper.build().create().createMapper().readValue(msg.getArgs().get(Tokens.ARGS_GREMLIN).toString(), Bytecode.class); + // TODO: Look to polish this up in GraphSON 2.0 when we don't have type lossiness anymore + // right now the TraversalOpPorcessor can take a direct GraphSON representation of Bytecode or directly take + // deserialized Bytecode object. + final Object bytecodeObj = msg.getArgs().get(Tokens.ARGS_GREMLIN); + final Bytecode bytecode = bytecodeObj instanceof Bytecode ? (Bytecode) bytecodeObj : + mapper.readValue(bytecodeObj.toString(), Bytecode.class); // earlier validation in selection of this op method should free us to cast this without worry final Map<String, String> aliases = (Map<String, String>) msg.optionalArgs(Tokens.ARGS_ALIASES).get();
