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/18 18:23:27 UTC
tinkerpop git commit: Renamed GraphSONTraversalSerializersV2d0 for
consistency
Repository: tinkerpop
Updated Branches:
refs/heads/tp32 28e1d93fe -> 97cc07de9
Renamed GraphSONTraversalSerializersV2d0 for consistency
This is a non-breaking change as the class is not public. CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/97cc07de
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/97cc07de
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/97cc07de
Branch: refs/heads/tp32
Commit: 97cc07de91918bf0886f5f217a762ce2fffcc201
Parents: 28e1d93
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Jan 18 13:22:00 2017 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Jan 18 13:22:00 2017 -0500
----------------------------------------------------------------------
.../structure/io/graphson/GraphSONModule.java | 30 +-
.../GraphSONTraversalSerializersV2d0.java | 390 -------------------
.../io/graphson/TraversalSerializersV2d0.java | 390 +++++++++++++++++++
3 files changed, 405 insertions(+), 405 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97cc07de/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
index 7d65f9c..a061d1c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
@@ -207,8 +207,8 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
addSerializer(Double.class, new GraphSONSerializersV2d0.DoubleGraphSONSerializer());
// traversal
- addSerializer(Traversal.class, new GraphSONTraversalSerializersV2d0.TraversalJacksonSerializer());
- addSerializer(Bytecode.class, new GraphSONTraversalSerializersV2d0.BytecodeJacksonSerializer());
+ addSerializer(Traversal.class, new TraversalSerializersV2d0.TraversalJacksonSerializer());
+ addSerializer(Bytecode.class, new TraversalSerializersV2d0.BytecodeJacksonSerializer());
Stream.of(VertexProperty.Cardinality.class,
Column.class,
Direction.class,
@@ -218,12 +218,12 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
SackFunctions.Barrier.class,
Scope.class,
TraversalOptionParent.Pick.class,
- T.class).forEach(e -> addSerializer(e, new GraphSONTraversalSerializersV2d0.EnumJacksonSerializer()));
- addSerializer(P.class, new GraphSONTraversalSerializersV2d0.PJacksonSerializer());
- addSerializer(Lambda.class, new GraphSONTraversalSerializersV2d0.LambdaJacksonSerializer());
- addSerializer(Bytecode.Binding.class, new GraphSONTraversalSerializersV2d0.BindingJacksonSerializer());
- addSerializer(Traverser.class, new GraphSONTraversalSerializersV2d0.TraverserJacksonSerializer());
- addSerializer(TraversalStrategy.class, new GraphSONTraversalSerializersV2d0.TraversalStrategyJacksonSerializer());
+ T.class).forEach(e -> addSerializer(e, new TraversalSerializersV2d0.EnumJacksonSerializer()));
+ addSerializer(P.class, new TraversalSerializersV2d0.PJacksonSerializer());
+ addSerializer(Lambda.class, new TraversalSerializersV2d0.LambdaJacksonSerializer());
+ addSerializer(Bytecode.Binding.class, new TraversalSerializersV2d0.BindingJacksonSerializer());
+ addSerializer(Traverser.class, new TraversalSerializersV2d0.TraverserJacksonSerializer());
+ addSerializer(TraversalStrategy.class, new TraversalSerializersV2d0.TraversalStrategyJacksonSerializer());
/////////////////////// DESERIALIZERS ////////////////////////////
@@ -242,8 +242,8 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
addDeserializer(Double.class, new GraphSONSerializersV2d0.DoubleJackonsDeserializer());
// traversal
- addDeserializer(Bytecode.class, new GraphSONTraversalSerializersV2d0.BytecodeJacksonDeserializer());
- addDeserializer(Bytecode.Binding.class, new GraphSONTraversalSerializersV2d0.BindingJacksonDeserializer());
+ addDeserializer(Bytecode.class, new TraversalSerializersV2d0.BytecodeJacksonDeserializer());
+ addDeserializer(Bytecode.Binding.class, new TraversalSerializersV2d0.BindingJacksonDeserializer());
Stream.of(VertexProperty.Cardinality.values(),
Column.values(),
Direction.values(),
@@ -253,10 +253,10 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
SackFunctions.Barrier.values(),
Scope.values(),
TraversalOptionParent.Pick.values(),
- T.values()).flatMap(Stream::of).forEach(e -> addDeserializer(e.getClass(), new GraphSONTraversalSerializersV2d0.EnumJacksonDeserializer(e.getDeclaringClass())));
- addDeserializer(P.class, new GraphSONTraversalSerializersV2d0.PJacksonDeserializer());
- addDeserializer(Lambda.class, new GraphSONTraversalSerializersV2d0.LambdaJacksonDeserializer());
- addDeserializer(Traverser.class, new GraphSONTraversalSerializersV2d0.TraverserJacksonDeserializer());
+ T.values()).flatMap(Stream::of).forEach(e -> addDeserializer(e.getClass(), new TraversalSerializersV2d0.EnumJacksonDeserializer(e.getDeclaringClass())));
+ addDeserializer(P.class, new TraversalSerializersV2d0.PJacksonDeserializer());
+ addDeserializer(Lambda.class, new TraversalSerializersV2d0.LambdaJacksonDeserializer());
+ addDeserializer(Traverser.class, new TraversalSerializersV2d0.TraverserJacksonDeserializer());
Arrays.asList(
ConnectiveStrategy.class,
ElementIdStrategy.class,
@@ -284,7 +284,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule {
//
GraphFilterStrategy.class,
VertexProgramStrategy.class
- ).forEach(strategy -> addDeserializer(strategy, new GraphSONTraversalSerializersV2d0.TraversalStrategyProxyJacksonDeserializer(strategy)));
+ ).forEach(strategy -> addDeserializer(strategy, new TraversalSerializersV2d0.TraversalStrategyProxyJacksonDeserializer(strategy)));
}
public static Builder build() {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97cc07de/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializersV2d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializersV2d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializersV2d0.java
deleted file mode 100644
index 267f8cb..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTraversalSerializersV2d0.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tinkerpop.gremlin.structure.io.graphson;
-
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.MapConfiguration;
-import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
-import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
-import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
-import org.apache.tinkerpop.gremlin.util.function.Lambda;
-import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
-import org.apache.tinkerpop.shaded.jackson.core.JsonParser;
-import org.apache.tinkerpop.shaded.jackson.core.JsonProcessingException;
-import org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext;
-import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
-import org.apache.tinkerpop.shaded.jackson.databind.deser.std.StdDeserializer;
-import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer;
-import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdScalarSerializer;
-import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-final class GraphSONTraversalSerializersV2d0 {
-
- private GraphSONTraversalSerializersV2d0() {
- }
-
- /////////////////
- // SERIALIZERS //
- ////////////////
-
- final static class TraversalJacksonSerializer extends StdSerializer<Traversal> {
-
- public TraversalJacksonSerializer() {
- super(Traversal.class);
- }
-
- @Override
- public void serialize(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeObject(traversal.asAdmin().getBytecode());
- }
-
- @Override
- public void serializeWithType(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer)
- throws IOException {
- serialize(traversal, jsonGenerator, serializerProvider);
- }
-
- }
-
- final static class BytecodeJacksonSerializer extends StdScalarSerializer<Bytecode> {
-
- public BytecodeJacksonSerializer() {
- super(Bytecode.class);
- }
-
- @Override
- public void serialize(final Bytecode bytecode, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeStartObject();
- if (bytecode.getSourceInstructions().iterator().hasNext()) {
- jsonGenerator.writeArrayFieldStart(GraphSONTokens.SOURCE);
- for (final Bytecode.Instruction instruction : bytecode.getSourceInstructions()) {
- jsonGenerator.writeStartArray();
- jsonGenerator.writeString(instruction.getOperator());
- for (final Object argument : instruction.getArguments()) {
- jsonGenerator.writeObject(argument);
- }
- jsonGenerator.writeEndArray();
- }
- jsonGenerator.writeEndArray();
- }
- if (bytecode.getStepInstructions().iterator().hasNext()) {
- jsonGenerator.writeArrayFieldStart(GraphSONTokens.STEP);
- for (final Bytecode.Instruction instruction : bytecode.getStepInstructions()) {
- jsonGenerator.writeStartArray();
- jsonGenerator.writeString(instruction.getOperator());
- for (final Object argument : instruction.getArguments()) {
- jsonGenerator.writeObject(argument);
- }
- jsonGenerator.writeEndArray();
- }
- jsonGenerator.writeEndArray();
- }
-
- jsonGenerator.writeEndObject();
- }
- }
-
- static class EnumJacksonSerializer extends StdScalarSerializer<Enum> {
-
- public EnumJacksonSerializer() {
- super(Enum.class);
- }
-
- @Override
- public void serialize(final Enum enumInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeString(enumInstance.name());
- }
-
- }
-
- final static class PJacksonSerializer extends StdScalarSerializer<P> {
-
- public PJacksonSerializer() {
- super(P.class);
- }
-
- @Override
- public void serialize(final P p, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeStartObject();
- jsonGenerator.writeStringField(GraphSONTokens.PREDICATE,
- p instanceof ConnectiveP ?
- p instanceof AndP ?
- GraphSONTokens.AND :
- GraphSONTokens.OR :
- p.getBiPredicate().toString());
- if (p instanceof ConnectiveP) {
- jsonGenerator.writeArrayFieldStart(GraphSONTokens.VALUE);
- for (final P<?> predicate : ((ConnectiveP<?>) p).getPredicates()) {
- jsonGenerator.writeObject(predicate);
- }
- jsonGenerator.writeEndArray();
- } else {
- if (p.getValue() instanceof Collection) {
- jsonGenerator.writeArrayFieldStart(GraphSONTokens.VALUE);
- for (final Object object : (Collection) p.getValue()) {
- jsonGenerator.writeObject(object);
- }
- jsonGenerator.writeEndArray();
- } else
- jsonGenerator.writeObjectField(GraphSONTokens.VALUE, p.getValue());
- }
- jsonGenerator.writeEndObject();
- }
-
- }
-
- final static class LambdaJacksonSerializer extends StdScalarSerializer<Lambda> {
-
- public LambdaJacksonSerializer() {
- super(Lambda.class);
- }
-
- @Override
- public void serialize(final Lambda lambda, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeStartObject();
- jsonGenerator.writeStringField(GraphSONTokens.SCRIPT, lambda.getLambdaScript());
- jsonGenerator.writeStringField(GraphSONTokens.LANGUAGE, lambda.getLambdaLanguage());
- jsonGenerator.writeNumberField(GraphSONTokens.ARGUMENTS, lambda.getLambdaArguments());
- jsonGenerator.writeEndObject();
- }
-
- }
-
- final static class BindingJacksonSerializer extends StdScalarSerializer<Bytecode.Binding> {
-
- public BindingJacksonSerializer() {
- super(Bytecode.Binding.class);
- }
-
- @Override
- public void serialize(final Bytecode.Binding binding, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeStartObject();
- jsonGenerator.writeStringField(GraphSONTokens.KEY, binding.variable());
- jsonGenerator.writeObjectField(GraphSONTokens.VALUE, binding.value());
- jsonGenerator.writeEndObject();
- }
-
- }
-
- final static class TraverserJacksonSerializer extends StdScalarSerializer<Traverser> {
-
- public TraverserJacksonSerializer() {
- super(Traverser.class);
- }
-
- @Override
- public void serialize(final Traverser traverserInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeStartObject();
- jsonGenerator.writeObjectField(GraphSONTokens.BULK, traverserInstance.bulk());
- jsonGenerator.writeObjectField(GraphSONTokens.VALUE, traverserInstance.get());
- jsonGenerator.writeEndObject();
- }
- }
-
- final static class TraversalStrategyJacksonSerializer extends StdScalarSerializer<TraversalStrategy> {
-
- public TraversalStrategyJacksonSerializer() {
- super(TraversalStrategy.class);
- }
-
- @Override
- public void serialize(final TraversalStrategy traversalStrategy, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
- throws IOException {
- jsonGenerator.writeStartObject();
- for (final Map.Entry<Object, Object> entry : ConfigurationConverter.getMap(traversalStrategy.getConfiguration()).entrySet()) {
- jsonGenerator.writeObjectField((String) entry.getKey(), entry.getValue());
- }
- jsonGenerator.writeEndObject();
- }
- }
-
- ///////////////////
- // DESERIALIZERS //
- //////////////////
-
- final static class BytecodeJacksonDeserializer extends AbstractObjectDeserializer<Bytecode> {
-
- public BytecodeJacksonDeserializer() {
- super(Bytecode.class);
- }
-
- @Override
- public Bytecode createObject(final Map<String, Object> data) {
- final Bytecode bytecode = new Bytecode();
- if (data.containsKey(GraphSONTokens.SOURCE)) {
- final List<List<Object>> instructions = (List) data.get(GraphSONTokens.SOURCE);
- for (final List<Object> instruction : instructions) {
- bytecode.addSource((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
- }
- }
- if (data.containsKey(GraphSONTokens.STEP)) {
- final List<List<Object>> instructions = (List) data.get(GraphSONTokens.STEP);
- for (final List<Object> instruction : instructions) {
- bytecode.addStep((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
- }
- }
- return bytecode;
- }
- }
-
- final static class EnumJacksonDeserializer<A extends Enum> extends StdDeserializer<A> {
-
- public EnumJacksonDeserializer(final Class<A> enumClass) {
- super(enumClass);
- }
-
- @Override
- public A deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
- final Class<A> enumClass = (Class<A>) this._valueClass;
- final String enumName = jsonParser.getText();
- for (final Enum a : enumClass.getEnumConstants()) {
- if (a.name().equals(enumName))
- return (A) a;
- }
- throw new IOException("Unknown enum type: " + enumClass);
- }
- }
-
- final static class PJacksonDeserializer extends AbstractObjectDeserializer<P> {
-
- public PJacksonDeserializer() {
- super(P.class);
- }
-
- @Override
- public P createObject(final Map<String, Object> data) {
- final String predicate = (String) data.get(GraphSONTokens.PREDICATE);
- final Object value = data.get(GraphSONTokens.VALUE);
- if (predicate.equals(GraphSONTokens.AND) || predicate.equals(GraphSONTokens.OR)) {
- return predicate.equals(GraphSONTokens.AND) ? new AndP((List<P>) value) : new OrP((List<P>) value);
- } else {
- try {
- if (value instanceof Collection) {
- if (predicate.equals("between"))
- return P.between(((List) value).get(0), ((List) value).get(1));
- else if (predicate.equals("inside"))
- return P.between(((List) value).get(0), ((List) value).get(1));
- else if (predicate.equals("outside"))
- return P.outside(((List) value).get(0), ((List) value).get(1));
- else if (predicate.equals("within"))
- return P.within((Collection) value);
- else if (predicate.equals("without"))
- return P.without((Collection) value);
- else
- return (P) P.class.getMethod(predicate, Collection.class).invoke(null, (Collection) value);
- } else {
- try {
- return (P) P.class.getMethod(predicate, Object.class).invoke(null, value);
- } catch (final NoSuchMethodException e) {
- return (P) P.class.getMethod(predicate, Object[].class).invoke(null, (Object) new Object[]{value});
- }
- }
- } catch (final Exception e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
- }
- }
-
- final static class LambdaJacksonDeserializer extends AbstractObjectDeserializer<Lambda> {
-
- public LambdaJacksonDeserializer() {
- super(Lambda.class);
- }
-
- @Override
- public Lambda createObject(final Map<String, Object> data) {
- final String script = (String) data.get(GraphSONTokens.SCRIPT);
- final String language = (String) data.get(GraphSONTokens.LANGUAGE);
- final int arguments = ((Number) data.getOrDefault(GraphSONTokens.ARGUMENTS, -1)).intValue();
- //
- if (-1 == arguments || arguments > 2)
- return new Lambda.UnknownArgLambda(script, language, arguments);
- else if (0 == arguments)
- return new Lambda.ZeroArgLambda<>(script, language);
- else if (1 == arguments)
- return new Lambda.OneArgLambda<>(script, language);
- else
- return new Lambda.TwoArgLambda<>(script, language);
- }
- }
-
- final static class BindingJacksonDeserializer extends AbstractObjectDeserializer<Bytecode.Binding> {
-
- public BindingJacksonDeserializer() {
- super(Bytecode.Binding.class);
- }
-
- @Override
- public Bytecode.Binding createObject(final Map<String, Object> data) {
- return new Bytecode.Binding<>((String) data.get(GraphSONTokens.KEY), data.get(GraphSONTokens.VALUE));
- }
- }
-
- static class TraverserJacksonDeserializer extends AbstractObjectDeserializer<Traverser> {
-
- public TraverserJacksonDeserializer() {
- super(Traverser.class);
- }
-
- @Override
- public Traverser createObject(final Map<String, Object> data) {
- return new DefaultRemoteTraverser<>(data.get(GraphSONTokens.VALUE), (Long) data.get(GraphSONTokens.BULK));
- }
- }
-
- final static class TraversalStrategyProxyJacksonDeserializer<T extends TraversalStrategy> extends AbstractObjectDeserializer<TraversalStrategyProxy> {
-
- private final Class<T> clazz;
-
- public TraversalStrategyProxyJacksonDeserializer(final Class<T> clazz) {
- super(TraversalStrategyProxy.class);
- this.clazz = clazz;
- }
-
- @Override
- public TraversalStrategyProxy<T> createObject(final Map<String, Object> data) {
- return new TraversalStrategyProxy<>(this.clazz, new MapConfiguration(data));
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97cc07de/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java
new file mode 100644
index 0000000..54e5d9a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java
@@ -0,0 +1,390 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.structure.io.graphson;
+
+import org.apache.commons.configuration.ConfigurationConverter;
+import org.apache.commons.configuration.MapConfiguration;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
+import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
+import org.apache.tinkerpop.gremlin.util.function.Lambda;
+import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
+import org.apache.tinkerpop.shaded.jackson.core.JsonParser;
+import org.apache.tinkerpop.shaded.jackson.core.JsonProcessingException;
+import org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext;
+import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
+import org.apache.tinkerpop.shaded.jackson.databind.deser.std.StdDeserializer;
+import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer;
+import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdScalarSerializer;
+import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+final class TraversalSerializersV2d0 {
+
+ private TraversalSerializersV2d0() {
+ }
+
+ /////////////////
+ // SERIALIZERS //
+ ////////////////
+
+ final static class TraversalJacksonSerializer extends StdSerializer<Traversal> {
+
+ public TraversalJacksonSerializer() {
+ super(Traversal.class);
+ }
+
+ @Override
+ public void serialize(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeObject(traversal.asAdmin().getBytecode());
+ }
+
+ @Override
+ public void serializeWithType(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer)
+ throws IOException {
+ serialize(traversal, jsonGenerator, serializerProvider);
+ }
+
+ }
+
+ final static class BytecodeJacksonSerializer extends StdScalarSerializer<Bytecode> {
+
+ public BytecodeJacksonSerializer() {
+ super(Bytecode.class);
+ }
+
+ @Override
+ public void serialize(final Bytecode bytecode, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeStartObject();
+ if (bytecode.getSourceInstructions().iterator().hasNext()) {
+ jsonGenerator.writeArrayFieldStart(GraphSONTokens.SOURCE);
+ for (final Bytecode.Instruction instruction : bytecode.getSourceInstructions()) {
+ jsonGenerator.writeStartArray();
+ jsonGenerator.writeString(instruction.getOperator());
+ for (final Object argument : instruction.getArguments()) {
+ jsonGenerator.writeObject(argument);
+ }
+ jsonGenerator.writeEndArray();
+ }
+ jsonGenerator.writeEndArray();
+ }
+ if (bytecode.getStepInstructions().iterator().hasNext()) {
+ jsonGenerator.writeArrayFieldStart(GraphSONTokens.STEP);
+ for (final Bytecode.Instruction instruction : bytecode.getStepInstructions()) {
+ jsonGenerator.writeStartArray();
+ jsonGenerator.writeString(instruction.getOperator());
+ for (final Object argument : instruction.getArguments()) {
+ jsonGenerator.writeObject(argument);
+ }
+ jsonGenerator.writeEndArray();
+ }
+ jsonGenerator.writeEndArray();
+ }
+
+ jsonGenerator.writeEndObject();
+ }
+ }
+
+ static class EnumJacksonSerializer extends StdScalarSerializer<Enum> {
+
+ public EnumJacksonSerializer() {
+ super(Enum.class);
+ }
+
+ @Override
+ public void serialize(final Enum enumInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeString(enumInstance.name());
+ }
+
+ }
+
+ final static class PJacksonSerializer extends StdScalarSerializer<P> {
+
+ public PJacksonSerializer() {
+ super(P.class);
+ }
+
+ @Override
+ public void serialize(final P p, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeStringField(GraphSONTokens.PREDICATE,
+ p instanceof ConnectiveP ?
+ p instanceof AndP ?
+ GraphSONTokens.AND :
+ GraphSONTokens.OR :
+ p.getBiPredicate().toString());
+ if (p instanceof ConnectiveP) {
+ jsonGenerator.writeArrayFieldStart(GraphSONTokens.VALUE);
+ for (final P<?> predicate : ((ConnectiveP<?>) p).getPredicates()) {
+ jsonGenerator.writeObject(predicate);
+ }
+ jsonGenerator.writeEndArray();
+ } else {
+ if (p.getValue() instanceof Collection) {
+ jsonGenerator.writeArrayFieldStart(GraphSONTokens.VALUE);
+ for (final Object object : (Collection) p.getValue()) {
+ jsonGenerator.writeObject(object);
+ }
+ jsonGenerator.writeEndArray();
+ } else
+ jsonGenerator.writeObjectField(GraphSONTokens.VALUE, p.getValue());
+ }
+ jsonGenerator.writeEndObject();
+ }
+
+ }
+
+ final static class LambdaJacksonSerializer extends StdScalarSerializer<Lambda> {
+
+ public LambdaJacksonSerializer() {
+ super(Lambda.class);
+ }
+
+ @Override
+ public void serialize(final Lambda lambda, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeStringField(GraphSONTokens.SCRIPT, lambda.getLambdaScript());
+ jsonGenerator.writeStringField(GraphSONTokens.LANGUAGE, lambda.getLambdaLanguage());
+ jsonGenerator.writeNumberField(GraphSONTokens.ARGUMENTS, lambda.getLambdaArguments());
+ jsonGenerator.writeEndObject();
+ }
+
+ }
+
+ final static class BindingJacksonSerializer extends StdScalarSerializer<Bytecode.Binding> {
+
+ public BindingJacksonSerializer() {
+ super(Bytecode.Binding.class);
+ }
+
+ @Override
+ public void serialize(final Bytecode.Binding binding, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeStringField(GraphSONTokens.KEY, binding.variable());
+ jsonGenerator.writeObjectField(GraphSONTokens.VALUE, binding.value());
+ jsonGenerator.writeEndObject();
+ }
+
+ }
+
+ final static class TraverserJacksonSerializer extends StdScalarSerializer<Traverser> {
+
+ public TraverserJacksonSerializer() {
+ super(Traverser.class);
+ }
+
+ @Override
+ public void serialize(final Traverser traverserInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeObjectField(GraphSONTokens.BULK, traverserInstance.bulk());
+ jsonGenerator.writeObjectField(GraphSONTokens.VALUE, traverserInstance.get());
+ jsonGenerator.writeEndObject();
+ }
+ }
+
+ final static class TraversalStrategyJacksonSerializer extends StdScalarSerializer<TraversalStrategy> {
+
+ public TraversalStrategyJacksonSerializer() {
+ super(TraversalStrategy.class);
+ }
+
+ @Override
+ public void serialize(final TraversalStrategy traversalStrategy, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
+ throws IOException {
+ jsonGenerator.writeStartObject();
+ for (final Map.Entry<Object, Object> entry : ConfigurationConverter.getMap(traversalStrategy.getConfiguration()).entrySet()) {
+ jsonGenerator.writeObjectField((String) entry.getKey(), entry.getValue());
+ }
+ jsonGenerator.writeEndObject();
+ }
+ }
+
+ ///////////////////
+ // DESERIALIZERS //
+ //////////////////
+
+ final static class BytecodeJacksonDeserializer extends AbstractObjectDeserializer<Bytecode> {
+
+ public BytecodeJacksonDeserializer() {
+ super(Bytecode.class);
+ }
+
+ @Override
+ public Bytecode createObject(final Map<String, Object> data) {
+ final Bytecode bytecode = new Bytecode();
+ if (data.containsKey(GraphSONTokens.SOURCE)) {
+ final List<List<Object>> instructions = (List) data.get(GraphSONTokens.SOURCE);
+ for (final List<Object> instruction : instructions) {
+ bytecode.addSource((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
+ }
+ }
+ if (data.containsKey(GraphSONTokens.STEP)) {
+ final List<List<Object>> instructions = (List) data.get(GraphSONTokens.STEP);
+ for (final List<Object> instruction : instructions) {
+ bytecode.addStep((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
+ }
+ }
+ return bytecode;
+ }
+ }
+
+ final static class EnumJacksonDeserializer<A extends Enum> extends StdDeserializer<A> {
+
+ public EnumJacksonDeserializer(final Class<A> enumClass) {
+ super(enumClass);
+ }
+
+ @Override
+ public A deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+ final Class<A> enumClass = (Class<A>) this._valueClass;
+ final String enumName = jsonParser.getText();
+ for (final Enum a : enumClass.getEnumConstants()) {
+ if (a.name().equals(enumName))
+ return (A) a;
+ }
+ throw new IOException("Unknown enum type: " + enumClass);
+ }
+ }
+
+ final static class PJacksonDeserializer extends AbstractObjectDeserializer<P> {
+
+ public PJacksonDeserializer() {
+ super(P.class);
+ }
+
+ @Override
+ public P createObject(final Map<String, Object> data) {
+ final String predicate = (String) data.get(GraphSONTokens.PREDICATE);
+ final Object value = data.get(GraphSONTokens.VALUE);
+ if (predicate.equals(GraphSONTokens.AND) || predicate.equals(GraphSONTokens.OR)) {
+ return predicate.equals(GraphSONTokens.AND) ? new AndP((List<P>) value) : new OrP((List<P>) value);
+ } else {
+ try {
+ if (value instanceof Collection) {
+ if (predicate.equals("between"))
+ return P.between(((List) value).get(0), ((List) value).get(1));
+ else if (predicate.equals("inside"))
+ return P.between(((List) value).get(0), ((List) value).get(1));
+ else if (predicate.equals("outside"))
+ return P.outside(((List) value).get(0), ((List) value).get(1));
+ else if (predicate.equals("within"))
+ return P.within((Collection) value);
+ else if (predicate.equals("without"))
+ return P.without((Collection) value);
+ else
+ return (P) P.class.getMethod(predicate, Collection.class).invoke(null, (Collection) value);
+ } else {
+ try {
+ return (P) P.class.getMethod(predicate, Object.class).invoke(null, value);
+ } catch (final NoSuchMethodException e) {
+ return (P) P.class.getMethod(predicate, Object[].class).invoke(null, (Object) new Object[]{value});
+ }
+ }
+ } catch (final Exception e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+ }
+ }
+
+ final static class LambdaJacksonDeserializer extends AbstractObjectDeserializer<Lambda> {
+
+ public LambdaJacksonDeserializer() {
+ super(Lambda.class);
+ }
+
+ @Override
+ public Lambda createObject(final Map<String, Object> data) {
+ final String script = (String) data.get(GraphSONTokens.SCRIPT);
+ final String language = (String) data.get(GraphSONTokens.LANGUAGE);
+ final int arguments = ((Number) data.getOrDefault(GraphSONTokens.ARGUMENTS, -1)).intValue();
+ //
+ if (-1 == arguments || arguments > 2)
+ return new Lambda.UnknownArgLambda(script, language, arguments);
+ else if (0 == arguments)
+ return new Lambda.ZeroArgLambda<>(script, language);
+ else if (1 == arguments)
+ return new Lambda.OneArgLambda<>(script, language);
+ else
+ return new Lambda.TwoArgLambda<>(script, language);
+ }
+ }
+
+ final static class BindingJacksonDeserializer extends AbstractObjectDeserializer<Bytecode.Binding> {
+
+ public BindingJacksonDeserializer() {
+ super(Bytecode.Binding.class);
+ }
+
+ @Override
+ public Bytecode.Binding createObject(final Map<String, Object> data) {
+ return new Bytecode.Binding<>((String) data.get(GraphSONTokens.KEY), data.get(GraphSONTokens.VALUE));
+ }
+ }
+
+ static class TraverserJacksonDeserializer extends AbstractObjectDeserializer<Traverser> {
+
+ public TraverserJacksonDeserializer() {
+ super(Traverser.class);
+ }
+
+ @Override
+ public Traverser createObject(final Map<String, Object> data) {
+ return new DefaultRemoteTraverser<>(data.get(GraphSONTokens.VALUE), (Long) data.get(GraphSONTokens.BULK));
+ }
+ }
+
+ final static class TraversalStrategyProxyJacksonDeserializer<T extends TraversalStrategy> extends AbstractObjectDeserializer<TraversalStrategyProxy> {
+
+ private final Class<T> clazz;
+
+ public TraversalStrategyProxyJacksonDeserializer(final Class<T> clazz) {
+ super(TraversalStrategyProxy.class);
+ this.clazz = clazz;
+ }
+
+ @Override
+ public TraversalStrategyProxy<T> createObject(final Map<String, Object> data) {
+ return new TraversalStrategyProxy<>(this.clazz, new MapConfiguration(data));
+ }
+ }
+}