TINKERPOP-1130 Added "incompatibility notes"

Provides a way to explain why something is untested (which essentially means 
incompatible) in the Model.


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

Branch: refs/heads/TINKERPOP-1130
Commit: a945bc6bbec3440112854f57fc4a0c114d8e7367
Parents: 580fb16
Author: Stephen Mallette <[email protected]>
Authored: Tue Dec 27 13:49:53 2016 -0500
Committer: Stephen Mallette <[email protected]>
Committed: Thu Dec 29 06:55:51 2016 -0500

----------------------------------------------------------------------
 .../tinkerpop/gremlin/structure/io/Model.java   | 84 ++++++++++++++++----
 .../structure/io/AbstractCompatibilityTest.java |  3 +-
 2 files changed, 71 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a945bc6b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
----------------------------------------------------------------------
diff --git 
a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
 
b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
index 0f042c6..75521ae 100644
--- 
a/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
+++ 
b/gremlin-tools/gremlin-io-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
@@ -113,13 +113,17 @@ public class Model {
         final GraphTraversalSource g = graph.traversal();
 
         // IMPORTANT - the "title" or name of the Entry needs to be unique
-        addCoreEntry(File.class, "Class", GryoCompatibility.V1D0_3_2_3);
+        addCoreEntry(File.class, "Class", new HashMap<Compatibility, String>() 
{{
+            put(GryoCompatibility.V1D0_3_2_3, "Serialization of Class in Gryo 
1.0 had a bug that prevented proper operation in versions prior to 3.2.4.");
+        }}, GryoCompatibility.V1D0_3_2_3);
         addCoreEntry(new Date(1481750076295L), "Date");
         addCoreEntry(100.00d, "Double");
         addCoreEntry(100.00f, "Float");
         addCoreEntry(100, "Integer");
         addCoreEntry(100L, "Long");
-        addCoreEntry(new java.sql.Timestamp(1481750076295L), "Timestamp", 
GryoCompatibility.V1D0_3_2_3);
+        addCoreEntry(new java.sql.Timestamp(1481750076295L), "Timestamp", new 
HashMap<Compatibility, String>() {{
+            put(GryoCompatibility.V1D0_3_2_3, "Timestamp was added to Gryo 1.0 
as of 3.2.4. It was not supported in 3.2.3.");
+        }}, GryoCompatibility.V1D0_3_2_3);
         addCoreEntry(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786"), 
"UUID");
 
         addGraphStructureEntry(graph.edges().next(), "Edge");
@@ -147,8 +151,12 @@ public class Model {
         metrics.addNested(new MutableMetrics(tm.getMetrics("3.0.0()")));
         addGraphProcessEntry(metrics, "Metrics");
         addGraphProcessEntry(P.gt(0), "P");
-        addGraphProcessEntry(P.gt(0).and(P.lt(10)), "P and", "", 
GryoCompatibility.V1D0_3_2_3, GryoCompatibility.V1D0_3_3_0);
-        addGraphProcessEntry(P.gt(0).or(P.within(-1, -10, -100)), "P or", "", 
GryoCompatibility.V1D0_3_2_3, GryoCompatibility.V1D0_3_3_0);
+        addGraphProcessEntry(P.gt(0).and(P.lt(10)), "P and", "", new 
HashMap<Compatibility, String>() {{
+            put(GryoCompatibility.V1D0_3_2_3, "A bug in the the Gryo 
serialization of ConjunctiveP prevented its proper serialization in versions 
prior to 3.3.0 and 3.2.4.");
+        }}, GryoCompatibility.V1D0_3_2_3);
+        addGraphProcessEntry(P.gt(0).or(P.within(-1, -10, -100)), "P or", "", 
new HashMap<Compatibility, String>() {{
+            put(GryoCompatibility.V1D0_3_2_3, "A bug in the the Gryo 
serialization of ConjunctiveP prevented its proper serialization in versions 
prior to 3.3.0 and 3.2.4.");
+        }}, GryoCompatibility.V1D0_3_2_3);
         addGraphProcessEntry(Scope.local, "Scope");
         addGraphProcessEntry(T.label, "T", "");
         addGraphProcessEntry(createStaticTraversalMetrics(), 
"TraversalMetrics");
@@ -206,12 +214,18 @@ public class Model {
         addExtendedEntry(new 
BigInteger("123456789987654321123456789987654321"), "BigInteger", "", 
UNTYPED_GRAPHSON_ONLY.toArray(new Compatibility[UNTYPED_GRAPHSON_ONLY.size()]));
         addExtendedEntry(new Byte("1"), "Byte", "", 
UNTYPED_GRAPHSON_ONLY.toArray(new Compatibility[UNTYPED_GRAPHSON_ONLY.size()]));
         addEntry("Extended", () -> java.nio.ByteBuffer.wrap("some bytes for 
you".getBytes()), "ByteBuffer", "",
-                 GraphSONCompatibility.V1D0_3_2_3, 
GraphSONCompatibility.V1D0_3_3_0, GraphSONCompatibility.V2D0_NO_TYPE_3_2_3,
-                 GraphSONCompatibility.V2D0_NO_TYPE_3_3_0, 
GryoCompatibility.V1D0_3_2_3);
+                new HashMap<Compatibility, String>() {{
+                    put(GryoCompatibility.V1D0_3_2_3, "ByteBuffer was added to 
Gryo 1.0 as of 3.2.4. It was not supported in 3.2.3.");
+                }},
+                GraphSONCompatibility.V1D0_3_2_3, 
GraphSONCompatibility.V1D0_3_3_0, GraphSONCompatibility.V2D0_NO_TYPE_3_2_3,
+                GraphSONCompatibility.V2D0_NO_TYPE_3_3_0, 
GryoCompatibility.V1D0_3_2_3);
         addExtendedEntry("x".charAt(0), "Char", "", 
UNTYPED_GRAPHSON_ONLY.toArray(new Compatibility[UNTYPED_GRAPHSON_ONLY.size()]));
         addExtendedEntry(Duration.ofDays(5), "Duration","The following example 
is a `Duration` of five days.");
         try {
-            addExtendedEntry(InetAddress.getByName("localhost"), 
"InetAddress", "",
+            addEntry("Extended", InetAddress.getByName("localhost"), 
"InetAddress", "",
+                    new HashMap<Compatibility, String>() {{
+                        put(GryoCompatibility.V1D0_3_2_3, "InetAddress was 
added to Gryo 1.0 as of 3.2.4. It was not supported in 3.2.3.");
+                    }},
                     GraphSONCompatibility.V1D0_3_2_3, 
GraphSONCompatibility.V1D0_3_3_0, GraphSONCompatibility.V2D0_NO_TYPE_3_2_3, 
GraphSONCompatibility.V2D0_NO_TYPE_3_3_0,
                     GryoCompatibility.V1D0_3_2_3);
         } catch (Exception ex) {
@@ -290,10 +304,14 @@ public class Model {
         addEntry("Core", obj, title, "");
     }
 
-    private void addCoreEntry(final Object obj, final String title,  final 
Compatibility... incompatibleWith) {
+    private void addCoreEntry(final Object obj, final String title, final 
Compatibility... incompatibleWith) {
         addEntry("Core", obj, title, "", incompatibleWith);
     }
 
+    private void addCoreEntry(final Object obj, final String title, final 
Map<Compatibility, String> incompatibilityNotes, final Compatibility... 
incompatibleWith) {
+        addEntry("Core", obj, title, "", incompatibilityNotes, 
incompatibleWith);
+    }
+
     private void addGraphStructureEntry(final Object obj, final String title) {
         addGraphStructureEntry(obj, title, "");
     }
@@ -311,7 +329,11 @@ public class Model {
     }
 
     private void addGraphProcessEntry(final Object obj, final String title, 
final String description, final Compatibility... incompatibleWith) {
-        addEntry("Graph Process", obj, title, description, incompatibleWith);
+        addGraphProcessEntry(obj, title, description, null, incompatibleWith);
+    }
+
+    private void addGraphProcessEntry(final Object obj, final String title, 
final String description, final Map<Compatibility, String> 
incompatibilityNotes, final Compatibility... incompatibleWith) {
+        addEntry("Graph Process", obj, title, description, 
incompatibilityNotes, incompatibleWith);
     }
 
     private void addGraphProcessEntry(final Object obj, final String title, 
final String description, final List<Compatibility> compatibleWith) {
@@ -353,26 +375,42 @@ public class Model {
     private void addEntry(final String group, final Supplier<?> maker, final 
String title, final String description, final Compatibility... 
incompatibleWith) {
         addEntry(group, null, title, description, 
Collections.unmodifiableList(ALL.stream()
                 .filter(c -> !Arrays.asList(incompatibleWith).contains(c))
-                .collect(Collectors.toList())), maker);
+                .collect(Collectors.toList())), maker, null);
+    }
+
+    private void addEntry(final String group, final Supplier<?> maker, final 
String title, final String description,
+                          final Map<Compatibility, String> 
incompatibilityNotes, final Compatibility... incompatibleWith) {
+        addEntry(group, null, title, description, 
Collections.unmodifiableList(ALL.stream()
+                .filter(c -> !Arrays.asList(incompatibleWith).contains(c))
+                .collect(Collectors.toList())), maker, incompatibilityNotes);
+    }
+
+    private void addEntry(final String group, final Object obj, final String 
title, final String description,
+                          final Map<Compatibility, String> 
incompatibilityNotes,
+                          final Compatibility... incompatibleWith) {
+        addEntry(group, obj, title, description, 
Collections.unmodifiableList(ALL.stream()
+                .filter(c -> !Arrays.asList(incompatibleWith).contains(c))
+                .collect(Collectors.toList())), null, incompatibilityNotes);
     }
 
     private void addEntry(final String group, final Object obj, final String 
title, final String description, final Compatibility... incompatibleWith) {
         addEntry(group, obj, title, description, 
Collections.unmodifiableList(ALL.stream()
                 .filter(c -> !Arrays.asList(incompatibleWith).contains(c))
-                .collect(Collectors.toList())), null);
+                .collect(Collectors.toList())), null, null);
     }
 
     private void addEntry(final String group, final Object obj, final String 
title, final String description,
                             final List<Compatibility> compatibleWith) {
-        addEntry(group, obj, title, description, compatibleWith, null);
+        addEntry(group, obj, title, description, compatibleWith, null, null);
     }
 
     private void addEntry(final String group, final Object obj, final String 
title, final String description,
-                          final List<Compatibility> compatibleWith, final 
Supplier<?> maker) {
+                          final List<Compatibility> compatibleWith, final 
Supplier<?> maker,
+                          final Map<Compatibility, String> 
incompatibilityNotes) {
         if (!entries.containsKey(group))
             entries.put(group, new ArrayList<>());
 
-        entries.get(group).add(new Entry(title, obj, description, 
compatibleWith, maker));
+        entries.get(group).add(new Entry(title, obj, description, 
compatibleWith, maker, incompatibilityNotes));
     }
 
     public void saveAsCsv(final String file) throws Exception {
@@ -417,13 +455,29 @@ public class Model {
         private final String description;
         private final List<Compatibility> compatibleWith;
         private final Supplier<?> maker;
+        private final Map<Compatibility, String> incompatibilityNotes;
 
-        public Entry(final String title, final Object object, final String 
description, final List<Compatibility> compatibleWith, final Supplier<?> maker) 
{
+        public Entry(final String title, final Object object, final String 
description,
+                     final List<Compatibility> compatibleWith, final 
Supplier<?> maker) {
+            this(title, object, description, compatibleWith, maker, 
Collections.emptyMap());
+        }
+
+        public Entry(final String title, final Object object, final String 
description,
+                     final List<Compatibility> compatibleWith, final 
Supplier<?> maker,
+                     final Map<Compatibility, String> incompatibilityNotes) {
             this.title = title;
             this.object = object;
             this.description = description;
             this.compatibleWith = compatibleWith;
             this.maker = maker;
+            this.incompatibilityNotes = 
Optional.ofNullable(incompatibilityNotes).orElseGet(Collections::emptyMap);
+
+            if 
(this.compatibleWith.stream().anyMatch(this.incompatibilityNotes::containsKey))
+                throw new IllegalStateException("The " + title + " entry is 
marked as 'compatible' but it has incompatibility notes");
+        }
+
+        public Map<Compatibility, String> getIncompatibilityNotes() {
+            return Collections.unmodifiableMap(incompatibilityNotes);
         }
 
         public String getTitle() {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a945bc6b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractCompatibilityTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractCompatibilityTest.java
 
b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractCompatibilityTest.java
index edd833e..9a53583 100644
--- 
a/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractCompatibilityTest.java
+++ 
b/gremlin-tools/gremlin-io-test/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractCompatibilityTest.java
@@ -41,7 +41,8 @@ public abstract class AbstractCompatibilityTest {
 
     protected void assumeCompatibility(final String resource) {
         final Model.Entry e = model.find(resource).orElseThrow(() -> new 
IllegalStateException("Could not find model"));
-        assumeThat("Test model is not compatible with IO", 
e.isCompatibleWith(getCompatibility()), is(true));
+        final String msg = 
e.getIncompatibilityNotes().getOrDefault(getCompatibility(), "no additional 
notes");
+        assumeThat("Test model is not compatible with IO - " + msg, 
e.isCompatibleWith(getCompatibility()), is(true));
     }
 
     protected <T> T findModelEntryObject(final String resourceName) {

Reply via email to