You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/06/20 15:25:14 UTC

tinkerpop git commit: Added GroovyTranslatorTest to GroovyEnvironmentSuite to test particulars of GroovyTranslator not tested by StructureProcessSiute and ComputeProcesSuite. Added JythonScriptEngineSetup.load() for a static location for loading globals

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 f9e4a820a -> f5a28e804


Added GroovyTranslatorTest to GroovyEnvironmentSuite to test particulars of GroovyTranslator not tested by StructureProcessSiute and ComputeProcesSuite. Added JythonScriptEngineSetup.load() for a static location for loading globals into Jython. Translator interface now has getHostLanguage() and getExecutionLanguage() ... these are the two concepts of a Translator and now they are exposed and explicit. Also, added StringFactory.translatorString(Translator) so all translators have the same toString() look and feel.


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

Branch: refs/heads/TINKERPOP-1278
Commit: f5a28e804eb3436080ac6ceb9a6fd65616dbccbc
Parents: f9e4a82
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Jun 20 09:25:00 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Jun 20 09:25:00 2016 -0600

----------------------------------------------------------------------
 .../strategy/creation/TranslationStrategy.java  |  2 +-
 .../process/traversal/util/Translator.java      |  7 +--
 .../gremlin/structure/util/StringFactory.java   |  7 ++-
 .../gremlin/groovy/GroovyEnvironmentSuite.java  |  1 +
 .../gremlin/groovy/GroovyTranslatorTest.java    | 61 ++++++++++++++++++++
 .../gremlin/groovy/GroovyTranslator.java        | 26 +++++++--
 .../gremlin/python/PythonTranslator.java        | 26 +++++++--
 .../gremlin/python/JythonScriptEngineSetup.java | 60 +++++++++++++++++++
 .../gremlin/python/PythonBypassTranslator.java  |  8 ++-
 .../gremlin/python/PythonProvider.java          | 23 +-------
 .../gremlin/python/PythonTranslatorTest.java    | 47 +++++++++++++++
 11 files changed, 231 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
index a752963..465bf5d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/creation/TranslationStrategy.java
@@ -64,7 +64,7 @@ public class TranslationStrategy extends AbstractTraversalStrategy<TraversalStra
             return;
         try {
             final String traversalScriptString = this.translator.getTraversalScript();
-            ScriptEngine engine = ScriptEngineCache.get(this.translator.getScriptEngine());
+            ScriptEngine engine = ScriptEngineCache.get(this.translator.getExecutionLanguage());
             this.destroyAnonymousTraversalFunction();
             final Bindings bindings = new SimpleBindings();
             bindings.put(this.translator.getAlias(), this.traversalSource);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java
index e9c62af..62bf718 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Translator.java
@@ -21,16 +21,12 @@ package org.apache.tinkerpop.gremlin.process.traversal.util;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.structure.Graph;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public interface Translator extends Cloneable {
 
-    public String getScriptEngine();
-
     public String getAlias();
 
     public void addStep(final Traversal.Admin<?, ?> traversal, final String stepName, final Object... arguments);
@@ -49,4 +45,7 @@ public interface Translator extends Cloneable {
 
     public Translator clone();
 
+    public String getHostLanguage();
+
+    public String getExecutionLanguage();
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
index 9c4b583..902d8e6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
@@ -31,6 +31,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -177,6 +178,10 @@ public final class StringFactory {
         return traversalStrategy.getClass().getSimpleName();
     }
 
+    public static String translatorString(final Translator translator) {
+        return "translator[" + translator.getAlias() + ":" + translator.getHostLanguage() + "->" + translator.getExecutionLanguage() + "]";
+    }
+
     public static String vertexProgramString(final VertexProgram vertexProgram, final String internalString) {
         return vertexProgram.getClass().getSimpleName() + L_BRACKET + internalString + R_BRACKET;
     }
@@ -242,7 +247,7 @@ public final class StringFactory {
 
     public static String removeEndBrackets(final Collection collection) {
         final String string = collection.toString();
-        return string.substring(1,string.length()-1);
+        return string.substring(1, string.length() - 1);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyEnvironmentSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyEnvironmentSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyEnvironmentSuite.java
index 44b5bcd..05699c1 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyEnvironmentSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyEnvironmentSuite.java
@@ -61,6 +61,7 @@ public class GroovyEnvironmentSuite extends AbstractGremlinSuite {
             GremlinGroovyScriptEngineTinkerPopSandboxTest.class,
             GremlinGroovyScriptEngineFileSandboxTest.class,
             GremlinExecutorOverGraphTest.class,
+            GroovyTranslatorTest.class,
             SugarLoaderTest.class,
     };
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
new file mode 100644
index 0000000..d7ff1a0
--- /dev/null
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslatorTest.java
@@ -0,0 +1,61 @@
+/*
+ *  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.groovy;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GroovyTranslatorTest extends AbstractGremlinTest {
+
+    @Test
+    @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
+    public void shouldSupportStringSupplierLambdas() throws Exception {
+        final GraphTraversalSource g = graph.traversal().withTranslator(GroovyTranslator.of("g"));
+        GraphTraversal.Admin<Vertex, Integer> t = (GraphTraversal.Admin) g.V().hasLabel("person").out().map(x -> "it.get().value('name').length()").asAdmin();
+        List<Integer> lengths = t.toList();
+        assertEquals(6, lengths.size());
+        assertTrue(lengths.contains(3));
+        assertTrue(lengths.contains(4));
+        assertTrue(lengths.contains(5));
+        assertTrue(lengths.contains(6));
+        assertEquals(24, g.V().hasLabel("person").out().map(x -> "it.get().value('name').length()").sum().next().intValue());
+
+        /*t = g.V().hasLabel("person").out().filter(x -> "{ x.sideEffects('lengthSum', x.get().value('name').length()").asAdmin();
+        lengths = t.toList();
+        assertEquals(6, lengths.size());
+        assertTrue(lengths.contains(3));
+        assertTrue(lengths.contains(4));
+        assertTrue(lengths.contains(5));
+        assertTrue(lengths.contains(6));
+        assertEquals(24, g.V().hasLabel("person").out().map(x -> "it.get().value('name').length()").sum().next().intValue());*/
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
index 75d22a3..b17692e 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/GroovyTranslator.java
@@ -32,9 +32,11 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TranslatorHelper;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -54,11 +56,21 @@ public final class GroovyTranslator implements Translator {
     }
 
     @Override
-    public String getScriptEngine() {
+    public String getHostLanguage() {
+        return "gremlin-java";
+    }
+
+    @Override
+    public String getExecutionLanguage() {
         return "gremlin-groovy";
     }
 
     @Override
+    public String toString() {
+        return StringFactory.translatorString(this);
+    }
+
+    @Override
     public String getAlias() {
         return this.alias;
     }
@@ -133,14 +145,20 @@ public final class GroovyTranslator implements Translator {
             return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString();
         else if (object instanceof Element)
             return convertToString(((Element) object).id()); // hack
-        else if (object instanceof Traversal) {
+        else if (object instanceof Computer) { // TODO: blow out
+            return "";
+        } else if (object instanceof Function) {
+            try {
+                return "{" + ((Function) object).apply(null).toString() + "}";
+            } catch (final Exception e) {
+                return object.toString(); // TODO: hack for testing
+            }
+        } else if (object instanceof Traversal) {
             final TranslationStrategy strategy = (TranslationStrategy) ((Traversal.Admin) object).getStrategies().toList()
                     .stream()
                     .filter(s -> s instanceof TranslationStrategy)
                     .findFirst().get();
             return strategy.getTranslator().getTraversalScript();
-        } else if (object instanceof Computer) { // todo: blow out
-            return "";
         } else
             return null == object ? "null" : object.toString();
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
index b220d80..734396a 100644
--- a/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
+++ b/gremlin-variant/src/main/java/org/apache/tinkerpop/gremlin/python/PythonTranslator.java
@@ -35,6 +35,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TranslatorHelper;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
@@ -44,6 +45,7 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -83,7 +85,12 @@ public class PythonTranslator implements Translator {
     }
 
     @Override
-    public String getScriptEngine() {
+    public String getHostLanguage() {
+        return "gremlin-java";
+    }
+
+    @Override
+    public String getExecutionLanguage() {
         return "jython";
     }
 
@@ -140,6 +147,11 @@ public class PythonTranslator implements Translator {
         }
     }
 
+    @Override
+    public String toString() {
+        return StringFactory.translatorString(this);
+    }
+
     ///////
 
     private String convertToString(final Object object) {
@@ -153,6 +165,8 @@ public class PythonTranslator implements Translator {
             return list.toString();
         } else if (object instanceof Long)
             return object + "L";
+        else if (object instanceof Boolean)
+            return object.equals(Boolean.TRUE) ? "True" : "False";
         else if (object instanceof Class)
             return ((Class) object).getCanonicalName();
         else if (object instanceof VertexProperty.Cardinality)
@@ -173,9 +187,13 @@ public class PythonTranslator implements Translator {
             return strategy.getTranslator().getTraversalScript();
         } else if (object instanceof Computer) {
             return "";
-        } else if (object instanceof Boolean)
-            return object.equals(Boolean.TRUE) ? "True" : "False";
-        else
+        } else if (object instanceof Function) {
+            try {
+                return "lambda: \"" + ((Function) object).apply(null).toString() + "\"";
+            } catch (final Exception e) {
+                return object.toString(); // TODO: hack for testing
+            }
+        } else
             return null == object ? "" : object.toString();
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/JythonScriptEngineSetup.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/JythonScriptEngineSetup.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/JythonScriptEngineSetup.java
new file mode 100644
index 0000000..c0cf6fd
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/JythonScriptEngineSetup.java
@@ -0,0 +1,60 @@
+/*
+ *  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.python;
+
+import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptException;
+import java.io.File;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class JythonScriptEngineSetup {
+
+    private JythonScriptEngineSetup() {
+    }
+
+    public static void setup() {
+        try {
+            final String rootPackageName = (new File("gremlin-variant").exists() ? "gremlin-variant/" : "") + "src/main/jython/";
+            final String gremlinPythonPackageName = rootPackageName + "/gremlin_python";
+            final String gremlinDriverPackageName = rootPackageName + "/gremlin_driver";
+            final String gremlinPythonModuleName = gremlinPythonPackageName + "/gremlin_python.py";
+            GremlinPythonGenerator.create(gremlinPythonModuleName);
+            final ScriptEngine jythonEngine = ScriptEngineCache.get("jython");
+            jythonEngine.eval("import sys");
+            jythonEngine.eval("sys.path.append('" + gremlinPythonPackageName + "')");
+            jythonEngine.eval("sys.path.append('" + gremlinDriverPackageName + "')");
+            final String pythonPath = null == System.getenv("JYTHONPATH") ? System.getenv("PYTHONPATH") : System.getenv("JYTHONPATH");
+            if (null != pythonPath) {
+                for (final String path : pythonPath.split(":")) {
+                    jythonEngine.eval("sys.path.append('" + path + "')");
+                }
+            }
+            jythonEngine.eval("from gremlin_python import *");
+            jythonEngine.eval("from gremlin_python import __");
+            jythonEngine.eval("from groovy_translator import GroovyTranslator");
+        } catch (final ScriptException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java
index d8c0d7f..8eb2d23 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonBypassTranslator.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.python;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.util.Translator;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.ScriptEngineCache;
 
 import javax.script.Bindings;
@@ -55,7 +56,7 @@ class PythonBypassTranslator extends PythonTranslator {
     }
 
     @Override
-    public String getScriptEngine() {
+    public String getExecutionLanguage() {
         return "gremlin-groovy";
     }
 
@@ -75,4 +76,9 @@ class PythonBypassTranslator extends PythonTranslator {
         } else
             return traversal;
     }
+
+    @Override
+    public String toString() {
+        return StringFactory.translatorString(this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
index 91a4d54..10b9bdc 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonProvider.java
@@ -37,28 +37,7 @@ public class PythonProvider extends VariantGraphProvider {
     private static final boolean IMPORT_STATICS = new Random().nextBoolean();
 
     static {
-        try {
-            final String rootPackageName = (new File("gremlin-variant").exists() ? "gremlin-variant/" : "") + "src/main/jython/";
-            final String gremlinPythonPackageName = rootPackageName + "/gremlin_python";
-            final String gremlinDriverPackageName = rootPackageName + "/gremlin_driver";
-            final String gremlinPythonModuleName = gremlinPythonPackageName + "/gremlin_python.py";
-            GremlinPythonGenerator.create(gremlinPythonModuleName);
-            final ScriptEngine jythonEngine = ScriptEngineCache.get("jython");
-            jythonEngine.eval("import sys");
-            jythonEngine.eval("sys.path.append('" + gremlinPythonPackageName + "')");
-            jythonEngine.eval("sys.path.append('" + gremlinDriverPackageName + "')");
-            final String pythonPath = null == System.getenv("JYTHONPATH") ? System.getenv("PYTHONPATH") : System.getenv("JYTHONPATH");
-            if (null != pythonPath) {
-                for (final String path : pythonPath.split(":")) {
-                    jythonEngine.eval("sys.path.append('" + path + "')");
-                }
-            }
-            jythonEngine.eval("from gremlin_python import *");
-            jythonEngine.eval("from gremlin_python import __");
-            jythonEngine.eval("from groovy_translator import GroovyTranslator");
-        } catch (final ScriptException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
+       JythonScriptEngineSetup.setup();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5a28e80/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonTranslatorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonTranslatorTest.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonTranslatorTest.java
new file mode 100644
index 0000000..6102dd8
--- /dev/null
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/python/PythonTranslatorTest.java
@@ -0,0 +1,47 @@
+/*
+ *  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.python;
+
+import org.apache.tinkerpop.gremlin.groovy.GroovyTranslator;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.creation.TranslationStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
+import org.junit.Test;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PythonTranslatorTest {
+
+    static {
+        JythonScriptEngineSetup.setup();
+    }
+
+    @Test
+    public void shouldSupportStringSupplierLambdas() throws Exception {
+        final GraphTraversalSource g = TinkerFactory.createModern().traversal().withTranslator(GroovyTranslator.of("g"));
+        GraphTraversal.Admin<Vertex, Number> t = (GraphTraversal.Admin) g.V().hasLabel("person").out().map(x -> "it.get().value('name').length()").asAdmin();
+        System.out.println(t.getStrategies().getStrategy(TranslationStrategy.class).get().getTranslator().getTraversalScript());
+        System.out.print(t.toList());
+    }
+
+}