TINKERPOP-1414 Made GraphSON 3.0 the default serialization format.

This was previously GraphSON 2.0 but recent consensus has this now at 3.0 since 
2.0 will not be altered to support breaking change.


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

Branch: refs/heads/TINKERPOP-1612
Commit: aec7fd1ac1cc56375d52d358c14f57816b466b67
Parents: 9dc30cd
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Jan 19 10:28:38 2017 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Jan 19 15:15:33 2017 -0500

----------------------------------------------------------------------
 gremlin-server/conf/gremlin-server-classic.yaml |   4 +-
 .../conf/gremlin-server-modern-py.yaml          |   4 +-
 .../conf/gremlin-server-modern-readonly.yaml    |   6 +-
 gremlin-server/conf/gremlin-server-modern.yaml  |   4 +-
 gremlin-server/conf/gremlin-server-neo4j.yaml   |   6 +-
 .../conf/gremlin-server-rest-modern.yaml        |   6 +-
 .../conf/gremlin-server-rest-secure.yaml        |   6 +-
 gremlin-server/conf/gremlin-server-secure.yaml  |   6 +-
 gremlin-server/conf/gremlin-server-spark.yaml   |   6 +-
 gremlin-server/conf/gremlin-server.yaml         |   4 +-
 .../server/GremlinServerHttpIntegrateTest.java  |  51 ++++-
 .../remote/gremlin-server-integration.yaml      |   7 +-
 .../server/gremlin-server-integration.yaml      |   7 +-
 .../tinkergraph/structure/TinkerGraph.java      |   2 +-
 .../structure/TinkerIoRegistryV3d0.java         | 217 +++++++++++++++++++
 15 files changed, 297 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-classic.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-classic.yaml 
b/gremlin-server/conf/gremlin-server-classic.yaml
index da9068f..ed256b5 100644
--- a/gremlin-server/conf/gremlin-server-classic.yaml
+++ b/gremlin-server/conf/gremlin-server-classic.yaml
@@ -31,8 +31,8 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-modern-py.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-modern-py.yaml 
b/gremlin-server/conf/gremlin-server-modern-py.yaml
index d8583ee..d030832 100644
--- a/gremlin-server/conf/gremlin-server-modern-py.yaml
+++ b/gremlin-server/conf/gremlin-server-modern-py.yaml
@@ -46,8 +46,8 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-modern-readonly.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-modern-readonly.yaml 
b/gremlin-server/conf/gremlin-server-modern-readonly.yaml
index 18f7ca4..d4ff8d4 100644
--- a/gremlin-server/conf/gremlin-server-modern-readonly.yaml
+++ b/gremlin-server/conf/gremlin-server-modern-readonly.yaml
@@ -31,9 +31,9 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}         # application/json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}
 strictTransactionManagement: false

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-modern.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-modern.yaml 
b/gremlin-server/conf/gremlin-server-modern.yaml
index c67f20f..08096f6 100644
--- a/gremlin-server/conf/gremlin-server-modern.yaml
+++ b/gremlin-server/conf/gremlin-server-modern.yaml
@@ -31,8 +31,8 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-neo4j.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-neo4j.yaml 
b/gremlin-server/conf/gremlin-server-neo4j.yaml
index 6aac0f2..1d4003e 100644
--- a/gremlin-server/conf/gremlin-server-neo4j.yaml
+++ b/gremlin-server/conf/gremlin-server-neo4j.yaml
@@ -42,9 +42,9 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}         # application/json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 processors:
   - { className: 
org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { 
sessionTimeout: 28800000 }}
   - { className: 
org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: 
{ cacheExpirationTime: 600000, cacheMaxSize: 1000 }}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-rest-modern.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-rest-modern.yaml 
b/gremlin-server/conf/gremlin-server-rest-modern.yaml
index 1fa23f9..e39e497 100644
--- a/gremlin-server/conf/gremlin-server-rest-modern.yaml
+++ b/gremlin-server/conf/gremlin-server-rest-modern.yaml
@@ -29,9 +29,9 @@ scriptEngines: {
     staticImports: [java.lang.Math.PI],
     scripts: [scripts/generate-modern.groovy]}}
 serializers:
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}         # application/json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 metrics: {
   slf4jReporter: {enabled: true, interval: 180000}}
 strictTransactionManagement: false

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-rest-secure.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-rest-secure.yaml 
b/gremlin-server/conf/gremlin-server-rest-secure.yaml
index 8ed8f41..e3d9330 100644
--- a/gremlin-server/conf/gremlin-server-rest-secure.yaml
+++ b/gremlin-server/conf/gremlin-server-rest-secure.yaml
@@ -42,9 +42,9 @@ scriptEngines: {
               
"org.apache.tinkerpop.gremlin.groovy.jsr223.customizer.TimedInterruptCustomizerProvider":[10000],
               
"org.apache.tinkerpop.gremlin.groovy.jsr223.customizer.CompileStaticCustomizerProvider":["org.apache.tinkerpop.gremlin.groovy.jsr223.customizer.SimpleSandboxExtension"]}}}}
 serializers:
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}         # application/json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 processors:
   - { className: 
org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { 
sessionTimeout: 28800000 }}
   - { className: 
org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: 
{ cacheExpirationTime: 600000, cacheMaxSize: 1000 }}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-secure.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-secure.yaml 
b/gremlin-server/conf/gremlin-server-secure.yaml
index 14f7034..e4b6049 100644
--- a/gremlin-server/conf/gremlin-server-secure.yaml
+++ b/gremlin-server/conf/gremlin-server-secure.yaml
@@ -45,9 +45,9 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}         # application/json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 processors:
   - { className: 
org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { 
sessionTimeout: 28800000 }}
   - { className: 
org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: 
{ cacheExpirationTime: 600000, cacheMaxSize: 1000 }}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server-spark.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server-spark.yaml 
b/gremlin-server/conf/gremlin-server-spark.yaml
index 3c198f5..2335c31 100644
--- a/gremlin-server/conf/gremlin-server-spark.yaml
+++ b/gremlin-server/conf/gremlin-server-spark.yaml
@@ -55,9 +55,9 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}         # application/json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 processors:
   - { className: 
org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { 
sessionTimeout: 28800000 }}
   - { className: 
org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: 
{ cacheExpirationTime: 600000, cacheMaxSize: 1000 }}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/conf/gremlin-server.yaml
----------------------------------------------------------------------
diff --git a/gremlin-server/conf/gremlin-server.yaml 
b/gremlin-server/conf/gremlin-server.yaml
index 3f3fc00..a468096 100644
--- a/gremlin-server/conf/gremlin-server.yaml
+++ b/gremlin-server/conf/gremlin-server.yaml
@@ -32,8 +32,8 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph }}             # application/vnd.gremlin-v1.0+gryo
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph }}         # application/vnd.gremlin-v1.0+gryo-lite
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true }}         # 
application/vnd.gremlin-v1.0+gryo-stringd
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }} # 
application/vnd.gremlin-v1.0+json
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }} # application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 processors:
   - { className: 
org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { 
sessionTimeout: 28800000 }}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
index e46871b..ba9aba8 100644
--- 
a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
+++ 
b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerHttpIntegrateTest.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.server;
 
 import org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0;
 import org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0;
+import org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0;
 import org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator;
 import org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer;
 import org.apache.http.Consts;
@@ -80,9 +81,21 @@ public class GremlinServerHttpIntegrateTest extends 
AbstractGremlinServerIntegra
                 break;
             case 
"should200OnPOSTWithGraphSON1d0AcceptHeaderDefaultResultToJson":
                 settings.serializers.clear();
-                final Settings.SerializerSettings serializerSettings = new 
Settings.SerializerSettings();
-                serializerSettings.className = 
GraphSONMessageSerializerV1d0.class.getName();
-                settings.serializers.add(serializerSettings);
+                final Settings.SerializerSettings serializerSettingsV1 = new 
Settings.SerializerSettings();
+                serializerSettingsV1.className = 
GraphSONMessageSerializerV1d0.class.getName();
+                settings.serializers.add(serializerSettingsV1);
+                break;
+            case 
"should200OnPOSTWithGraphSON2d0AcceptHeaderDefaultResultToJson":
+                settings.serializers.clear();
+                final Settings.SerializerSettings serializerSettingsV2 = new 
Settings.SerializerSettings();
+                serializerSettingsV2.className = 
GraphSONMessageSerializerV2d0.class.getName();
+                settings.serializers.add(serializerSettingsV2);
+                break;
+            case 
"should200OnPOSTWithGraphSON3d0AcceptHeaderDefaultResultToJson":
+                settings.serializers.clear();
+                final Settings.SerializerSettings serializerSettingsV3 = new 
Settings.SerializerSettings();
+                serializerSettingsV3.className = 
GraphSONMessageSerializerV3d0.class.getName();
+                settings.serializers.add(serializerSettingsV3);
                 break;
             case "should401OnGETWithNoAuthorizationHeader":
             case "should401OnPOSTWithNoAuthorizationHeader":
@@ -366,7 +379,7 @@ public class GremlinServerHttpIntegrateTest extends 
AbstractGremlinServerIntegra
             assertEquals("application/json", 
response.getEntity().getContentType().getValue());
             final String json = EntityUtils.toString(response.getEntity());
             final JsonNode node = mapper.readTree(json);
-            assertEquals("stephen", 
node.get("result").get("data").get(0).get(GraphSONTokens.VALUEPROP).get("properties").get("name").get(0).get(GraphSONTokens.VALUEPROP).get(GraphSONTokens.VALUE).asText());
+            assertEquals("stephen", 
node.get("result").get("data").get(0).get(GraphSONTokens.VALUEPROP).get("properties").get("name").get(0).get(GraphSONTokens.VALUE).asText());
         }
     }
 
@@ -804,6 +817,21 @@ public class GremlinServerHttpIntegrateTest extends 
AbstractGremlinServerIntegra
     }
 
     @Test
+    public void 
should200OnPOSTWithGraphSON1d0AcceptHeaderDefaultResultToJson() throws 
Exception {
+        final CloseableHttpClient httpclient = HttpClients.createDefault();
+        final HttpPost httppost = new 
HttpPost(TestClientFactory.createURLString());
+        httppost.setEntity(new StringEntity("{\"gremlin\":\"1-1\"}", 
Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = 
httpclient.execute(httppost)) {
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertEquals("application/json", 
response.getEntity().getContentType().getValue());
+            final String json = EntityUtils.toString(response.getEntity());
+            final JsonNode node = mapper.readTree(json);
+            assertEquals(0, node.get("result").get("data").get(0).asInt());
+        }
+    }
+
+    @Test
     public void 
should200OnPOSTWithGraphSON2d0AcceptHeaderDefaultResultToJson() throws 
Exception {
         final CloseableHttpClient httpclient = HttpClients.createDefault();
         final HttpPost httppost = new 
HttpPost(TestClientFactory.createURLString());
@@ -817,4 +845,19 @@ public class GremlinServerHttpIntegrateTest extends 
AbstractGremlinServerIntegra
             assertEquals(0, node.get("result").get("data").get(0).asInt());
         }
     }
+
+    @Test
+    public void 
should200OnPOSTWithGraphSON3d0AcceptHeaderDefaultResultToJson() throws 
Exception {
+        final CloseableHttpClient httpclient = HttpClients.createDefault();
+        final HttpPost httppost = new 
HttpPost(TestClientFactory.createURLString());
+        httppost.setEntity(new StringEntity("{\"gremlin\":\"1-1\"}", 
Consts.UTF_8));
+
+        try (final CloseableHttpResponse response = 
httpclient.execute(httppost)) {
+            assertEquals(200, response.getStatusLine().getStatusCode());
+            assertEquals("application/json", 
response.getEntity().getContentType().getValue());
+            final String json = EntityUtils.toString(response.getEntity());
+            final JsonNode node = mapper.readTree(json);
+            assertEquals(0, node.get("result").get("data").get(0).asInt());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/driver/remote/gremlin-server-integration.yaml
----------------------------------------------------------------------
diff --git 
a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/driver/remote/gremlin-server-integration.yaml
 
b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/driver/remote/gremlin-server-integration.yaml
index 98cdef0..ca8a0df 100644
--- 
a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/driver/remote/gremlin-server-integration.yaml
+++ 
b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/driver/remote/gremlin-server-integration.yaml
@@ -35,10 +35,9 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph, custom: 
[groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph, custom: 
[groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true}}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 processors:
   - { className: 
org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { 
sessionTimeout: 28800000 }}
 metrics: {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
----------------------------------------------------------------------
diff --git 
a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
 
b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
index 1c1ef8d..623c35e 100644
--- 
a/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
+++ 
b/gremlin-server/src/test/resources/org/apache/tinkerpop/gremlin/server/gremlin-server-integration.yaml
@@ -31,10 +31,9 @@ serializers:
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
useMapperFromGraph: graph, custom: 
[groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: 
{ useMapperFromGraph: graph, custom: 
[groovy.json.JsonBuilder;org.apache.tinkerpop.gremlin.driver.ser.JsonBuilderGryoSerializer]}}
   - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { 
serializeResultToString: true}}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistry] }}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { useMapperFromGraph: graph  }}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0, config: 
{ useMapperFromGraph: graph }}
-  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1d0] }} # 
application/vnd.gremlin-v1.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, 
config: { ioRegistries: 
[org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2d0]  }} # 
application/vnd.gremlin-v2.0+json
+  - { className: 
org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: 
{ useMapperFromGraph: graph }}         # 
application/json,application/vnd.gremlin-v3.0+json
 processors:
   - { className: 
org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { 
sessionTimeout: 28800000 }}
 metrics: {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
----------------------------------------------------------------------
diff --git 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
index e47229b..9d2df0a 100644
--- 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
+++ 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
@@ -230,7 +230,7 @@ public final class TinkerGraph implements Graph {
 
     @Override
     public <I extends Io> I io(final Io.Builder<I> builder) {
-        return (I) builder.graph(this).onMapper(mapper -> 
mapper.addRegistry(TinkerIoRegistryV2d0.instance())).create();
+        return (I) builder.graph(this).onMapper(mapper -> 
mapper.addRegistry(TinkerIoRegistryV3d0.instance())).create();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/aec7fd1a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV3d0.java
----------------------------------------------------------------------
diff --git 
a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV3d0.java
 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV3d0.java
new file mode 100644
index 0000000..685a8cc
--- /dev/null
+++ 
b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerIoRegistryV3d0.java
@@ -0,0 +1,217 @@
+/*
+ * 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.tinkergraph.structure;
+
+import org.apache.commons.configuration.BaseConfiguration;
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.io.AbstractIoRegistry;
+import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONIo;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
+import 
org.apache.tinkerpop.gremlin.structure.io.graphson.TinkerPopJacksonModule;
+import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoIo;
+import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoReader;
+import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoWriter;
+import org.apache.tinkerpop.gremlin.structure.util.Attachable;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
+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.ser.std.StdScalarSerializer;
+import org.apache.tinkerpop.shaded.kryo.Kryo;
+import org.apache.tinkerpop.shaded.kryo.Serializer;
+import org.apache.tinkerpop.shaded.kryo.io.Input;
+import org.apache.tinkerpop.shaded.kryo.io.Output;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * An implementation of the {@link IoRegistry} interface that provides 
serializers with custom configurations for
+ * implementation specific classes that might need to be serialized.  This 
registry allows a {@link TinkerGraph} to
+ * be serialized directly which is useful for moving small graphs around on 
the network.
+ * <p/>
+ * Most providers need not implement this kind of custom serializer as they 
will deal with much larger graphs that
+ * wouldn't be practical to serialize in this fashion.  This is a bit of a 
special case for TinkerGraph given its
+ * in-memory status.  Typical implementations would create serializers for a 
complex vertex identifier or a
+ * custom data class like a "geographic point".
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public final class TinkerIoRegistryV3d0 extends AbstractIoRegistry {
+
+    private static final TinkerIoRegistryV3d0 INSTANCE = new 
TinkerIoRegistryV3d0();
+
+    private TinkerIoRegistryV3d0() {
+        register(GryoIo.class, TinkerGraph.class, new 
TinkerGraphGryoSerializer());
+        register(GraphSONIo.class, null, new TinkerModuleV2d0());
+    }
+
+    public static TinkerIoRegistryV3d0 instance() {
+        return INSTANCE;
+    }
+
+    /**
+     * Provides a method to serialize an entire {@link TinkerGraph} into 
itself for Gryo.  This is useful when
+     * shipping small graphs around through Gremlin Server. Reuses the 
existing Kryo instance for serialization.
+     */
+    final static class TinkerGraphGryoSerializer extends 
Serializer<TinkerGraph> {
+        @Override
+        public void write(final Kryo kryo, final Output output, final 
TinkerGraph graph) {
+            try (final ByteArrayOutputStream stream = new 
ByteArrayOutputStream()) {
+                GryoWriter.build().mapper(() -> 
kryo).create().writeGraph(stream, graph);
+                final byte[] bytes = stream.toByteArray();
+                output.writeInt(bytes.length);
+                output.write(bytes);
+            } catch (Exception io) {
+                throw new RuntimeException(io);
+            }
+        }
+
+        @Override
+        public TinkerGraph read(final Kryo kryo, final Input input, final 
Class<TinkerGraph> tinkerGraphClass) {
+            final Configuration conf = new BaseConfiguration();
+            
conf.setProperty("gremlin.tinkergraph.defaultVertexPropertyCardinality", 
"list");
+            final TinkerGraph graph = TinkerGraph.open(conf);
+            final int len = input.readInt();
+            final byte[] bytes = input.readBytes(len);
+            try (final ByteArrayInputStream stream = new 
ByteArrayInputStream(bytes)) {
+                GryoReader.build().mapper(() -> 
kryo).create().readGraph(stream, graph);
+            } catch (Exception io) {
+                throw new RuntimeException(io);
+            }
+
+            return graph;
+        }
+    }
+
+    /**
+     * Provides a method to serialize an entire {@link TinkerGraph} into 
itself for GraphSON. This is useful when
+     * shipping small graphs around through Gremlin Server.
+     */
+    final static class TinkerModuleV2d0 extends TinkerPopJacksonModule {
+        public TinkerModuleV2d0() {
+            super("tinkergraph-2.0");
+            addSerializer(TinkerGraph.class, new 
TinkerGraphJacksonSerializer());
+            addDeserializer(TinkerGraph.class, new 
TinkerGraphJacksonDeserializer());
+        }
+
+        @Override
+        public Map<Class, String> getTypeDefinitions() {
+            return new HashMap<Class, String>(){{
+                put(TinkerGraph.class, "graph");
+            }};
+        }
+
+        @Override
+        public String getTypeNamespace() {
+            return "tinker";
+        }
+    }
+
+    /**
+     * Serializes the graph into an edge list format.  Edge list is a better 
choices than adjacency list (which is
+     * typically standard from the {@link 
org.apache.tinkerpop.gremlin.structure.io.GraphReader} and {@link 
org.apache.tinkerpop.gremlin.structure.io.GraphWriter} perspective) in this 
case because
+     * the use case for this isn't around massive graphs.  The use case is for 
"small" subgraphs that are being
+     * shipped over the wire from Gremlin Server. Edge list format is a bit 
easier for non-JVM languages to work
+     * with as a format and doesn't require a cache for loading (as vertex 
labels are not serialized in adjacency
+     * list).
+     */
+    final static class TinkerGraphJacksonSerializer extends 
StdScalarSerializer<TinkerGraph> {
+
+        public TinkerGraphJacksonSerializer() {
+            super(TinkerGraph.class);
+        }
+
+        @Override
+        public void serialize(final TinkerGraph graph, final JsonGenerator 
jsonGenerator, final SerializerProvider serializerProvider)
+                throws IOException {
+            jsonGenerator.writeStartObject();
+            jsonGenerator.writeFieldName(GraphSONTokens.VERTICES);
+            jsonGenerator.writeStartArray();
+
+            final Iterator<Vertex> vertices = graph.vertices();
+            while (vertices.hasNext()) {
+                serializerProvider.defaultSerializeValue(vertices.next(), 
jsonGenerator);
+            }
+
+            jsonGenerator.writeEndArray();
+            jsonGenerator.writeFieldName(GraphSONTokens.EDGES);
+            jsonGenerator.writeStartArray();
+
+            final Iterator<Edge> edges = graph.edges();
+            while (edges.hasNext()) {
+                serializerProvider.defaultSerializeValue(edges.next(), 
jsonGenerator);
+            }
+
+            jsonGenerator.writeEndArray();
+            jsonGenerator.writeEndObject();
+        }
+    }
+
+    /**
+     * Deserializes the edge list format.
+     */
+    static class TinkerGraphJacksonDeserializer extends 
StdDeserializer<TinkerGraph> {
+        public TinkerGraphJacksonDeserializer() {
+            super(TinkerGraph.class);
+        }
+
+        @Override
+        public TinkerGraph deserialize(final JsonParser jsonParser, final 
DeserializationContext deserializationContext) throws IOException, 
JsonProcessingException {
+            final Configuration conf = new BaseConfiguration();
+            
conf.setProperty("gremlin.tinkergraph.defaultVertexPropertyCardinality", 
"list");
+            final TinkerGraph graph = TinkerGraph.open(conf);
+
+            final List<? extends Edge> edges;
+            final List<? extends Vertex> vertices;
+
+            jsonParser.nextToken();
+            final Map<String, Object> graphData = 
deserializationContext.readValue(jsonParser, Map.class);
+            vertices = (List<DetachedVertex>) 
graphData.get(GraphSONTokens.VERTICES);
+            edges = (List<DetachedEdge>) graphData.get(GraphSONTokens.EDGES);
+
+
+            vertices.forEach(e -> {
+                if (e instanceof DetachedVertex) {
+                    
((DetachedVertex)e).attach(Attachable.Method.getOrCreate(graph));
+                }
+            });
+
+            edges.forEach(e -> {
+                if (e instanceof DetachedEdge) {
+                    ((DetachedEdge) 
e).attach(Attachable.Method.getOrCreate(graph));
+                }
+            });
+
+            return graph;
+        }
+    }
+}

Reply via email to