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 2015/11/24 01:13:44 UTC

[03/11] incubator-tinkerpop git commit: updates

updates


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

Branch: refs/heads/master
Commit: c6626dac29c4d26503c13da2b7d12b662fd13908
Parents: 16faa85
Author: Kushal <ku...@foodinhood.com>
Authored: Tue Nov 10 17:23:31 2015 -0800
Committer: Kushal <ku...@foodinhood.com>
Committed: Tue Nov 10 17:23:31 2015 -0800

----------------------------------------------------------------------
 docs/src/implementations.asciidoc               |  5 +-
 .../tinkerpop/gremlin/structure/io/IoCore.java  |  6 ++
 .../tinkergraph/structure/TinkerGraph.java      | 16 +++--
 .../tinkergraph/structure/TinkerGraphTest.java  | 69 +++++++++++++++++++-
 4 files changed, 84 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c6626dac/docs/src/implementations.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/implementations.asciidoc b/docs/src/implementations.asciidoc
index 66e2738..1a58ef9 100755
--- a/docs/src/implementations.asciidoc
+++ b/docs/src/implementations.asciidoc
@@ -630,8 +630,9 @@ TinkerGraph has several settings that can be provided on creation via `Configura
 value is specified here, the the `gremlin.tinkergraph.graphFormat` should also be specified.  If this value is not
 included (default), then the graph will stay in-memory and not be loaded/persisted to disk.
 |gremlin.tinkergraph.graphFormat |The format to use to serialize the graph which may be one of the following:
-`graphml`, `graphson`, gryo`, or a fully qualified class name that implements Io.Builder interface.
-If a value is specified here, the the `gremlin.tinkergraph.graphLocation` should
+`graphml`, `graphson`, `gryo`, or a fully qualified class name that implements Io.Builder interface (which allows for
+external third party graph reader/writer formats to be used for persistence).
+If a value is specified here, then the `gremlin.tinkergraph.graphLocation` should
 also be specified.  If this value is not included (default), then the graph will stay in-memory and not be
 loaded/persisted to disk.
 |=========================================================

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c6626dac/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoCore.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoCore.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoCore.java
old mode 100644
new mode 100755
index a22dd28..9295269
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoCore.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoCore.java
@@ -52,4 +52,10 @@ public final class IoCore {
     public static Io.Builder<GryoIo> gryo() {
         return GryoIo.build();
     }
+
+    public static Io.Builder createIoBuilder(String graphFormat) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+        Class<Io.Builder> ioBuilderClass = (Class<Io.Builder>) Class.forName(graphFormat);
+        Io.Builder ioBuilder = ioBuilderClass.newInstance();
+        return ioBuilder;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c6626dac/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 5c17ac6..35e268e 100755
--- 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
@@ -283,12 +283,10 @@ public final class TinkerGraph implements Graph {
                 } else if (graphFormat.equals("gryo")) {
                     io(IoCore.gryo()).readGraph(graphLocation);
                 } else {
-                    Class<Io.Builder> ioBuilderClass = (Class<Io.Builder>) Class.forName(graphFormat); //If graphFormat is not a fully qualified class, get ClassNotFoundException.  Will this be clear enough to user? currently they will just RuntimeException at end of method
-                    Io.Builder ioBuilder = ioBuilderClass.newInstance();  //If graphFormat is class not derived from Io.Builder, get ClassCastdException.  Will this be clear enough to user?
-                    io(ioBuilder).readGraph(graphLocation);
+                    io(IoCore.createIoBuilder(graphFormat)).readGraph(graphLocation);
                 }
-            } catch (Exception exc) {
-                throw new RuntimeException(String.format("Could not load graph at %s with %s", graphLocation, graphFormat));
+            } catch (Exception ex) {
+                throw new RuntimeException(String.format("Could not load graph at %s with %s", graphLocation, graphFormat), ex);
             }
         }
     }
@@ -311,12 +309,16 @@ public final class TinkerGraph implements Graph {
                 io(IoCore.graphson()).writeGraph(graphLocation);
             } else if (graphFormat.equals("gryo")) {
                 io(IoCore.gryo()).writeGraph(graphLocation);
+            } else {
+                io(IoCore.createIoBuilder(graphFormat)).writeGraph(graphLocation);
             }
-        } catch (IOException ioe) {
-            throw new RuntimeException(String.format("Could not save graph at %s with %s", graphLocation, graphFormat));
+        } catch (Exception ex) {
+            throw new RuntimeException(String.format("Could not save graph at %s with %s", graphLocation, graphFormat), ex);
         }
     }
 
+
+
     private <T extends Element> Iterator<T> createElementIterator(final Class<T> clazz, final Map<Object, T> elements,
                                                                   final IdManager idManager,
                                                                   final Object... ids) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c6626dac/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
old mode 100644
new mode 100755
index b3dc64e..1f627fc
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -23,19 +23,21 @@ import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.TestHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.io.Io;
 import org.apache.tinkerpop.gremlin.structure.io.IoCore;
+import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
 import org.apache.tinkerpop.gremlin.structure.io.IoTest;
 import org.junit.Ignore;
 import org.junit.Test;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
+import java.io.*;
 import java.util.Set;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -382,4 +384,65 @@ public class TinkerGraphTest {
         IoTest.assertModernGraph(reloadedGraph, true, false);
         reloadedGraph.close();
     }
+
+    @Test
+    public void shouldPersistToAnyGraphFormat() {
+        final String graphLocation = TestHelper.makeTestDataPath(TinkerGraphTest.class, "temp").getAbsolutePath() + "shouldPersistToAnyGraphFormat.dat";
+        final File f = new File(graphLocation);
+        if (f.exists() && f.isFile()) f.delete();
+
+        final Configuration conf = new BaseConfiguration();
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_GRAPH_FORMAT, TestIoBuilder.class.getName());
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_GRAPH_LOCATION, graphLocation);
+        final TinkerGraph graph = TinkerGraph.open(conf);
+        TinkerFactory.generateModern(graph);
+
+        //Test write graph
+        graph.close();
+        assertEquals(TestIoBuilder.calledRegistry, 1);
+        assertEquals(TestIoBuilder.calledGraph, 1);
+        assertEquals(TestIoBuilder.calledCreate, 1);
+
+        try (BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f))){
+            os.write("dummy string".getBytes());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        //Test read graph
+        final TinkerGraph readGraph = TinkerGraph.open(conf);
+        assertEquals(TestIoBuilder.calledRegistry, 1);
+        assertEquals(TestIoBuilder.calledGraph, 1);
+        assertEquals(TestIoBuilder.calledCreate, 1);
+    }
+
+    public static class TestIoBuilder implements Io.Builder{
+
+        static int calledRegistry, calledGraph, calledCreate;
+
+        public TestIoBuilder(){
+            //Looks awkward to reset static vars inside a constructor, but makes sense from testing perspective
+            calledRegistry=0;
+            calledGraph=0;
+            calledCreate=0;
+        }
+
+        @Override
+        public Io.Builder<? extends Io> registry(IoRegistry registry) {
+            calledRegistry++;
+            return this;
+        }
+
+        @Override
+        public Io.Builder<? extends Io> graph(Graph graph) {
+            calledGraph++;
+            return this;
+        }
+
+        @Override
+        public Io create() {
+            calledCreate++;
+            return mock(Io.class);
+        }
+    }
 }