Repository: tinkerpop Updated Branches: refs/heads/TINKERPOP-1278 c5eca63fe -> b93feb477
Added a method to handle imports. Attempted some more drastic efforts that would allow more complete integration of gremlin-python into the full TinkerPop plugin system, but that brings big fat breaking changes. To keep this branch suitable for 3.2.x we would have to say that GremlinPlugin is only suitable for gremlin-groovy until largely refactoring efforts can be made. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/6840262f Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/6840262f Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/6840262f Branch: refs/heads/TINKERPOP-1278 Commit: 6840262fd4170c6caabe8d1c8390197baafa8eb4 Parents: c5eca63 Author: Stephen Mallette <[email protected]> Authored: Thu Jul 7 15:47:19 2016 -0400 Committer: Stephen Mallette <[email protected]> Committed: Fri Jul 8 13:30:15 2016 -0400 ---------------------------------------------------------------------- .../DefaultGremlinScriptEngineManager.java | 57 ++++++++++---------- .../gremlin/jsr223/GremlinScriptEngine.java | 7 +++ 2 files changed, 36 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6840262f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java index 0ab02dc..e53f505 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java @@ -18,6 +18,8 @@ */ package org.apache.tinkerpop.gremlin.jsr223; +import org.apache.tinkerpop.gremlin.util.CoreImports; + import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.SimpleBindings; @@ -51,6 +53,10 @@ import java.util.ServiceLoader; * that this class is designed to provide support for "Gremlin-enabled" {@code ScriptEngine} instances (i.e. those * that extend from {@link GremlinScriptEngine}) and is not meant to manage just any {@code ScriptEngine} instance * that may be on the path. + * <p/> + * As this is a "Gremlin" {@code ScriptEngine}, certain common imports are automatically applied when a + * {@link GremlinScriptEngine} is instantiated via the {@link GremlinScriptEngineFactory}.. Initial imports from + * gremlin-core come from the {@link CoreImports}. * * @author Stephen Mallette (http://stephen.genoprime.com) */ @@ -164,9 +170,7 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan if (null != (obj = nameAssociations.get(shortName))) { final GremlinScriptEngineFactory spi = (GremlinScriptEngineFactory) obj; try { - final GremlinScriptEngine engine = spi.getScriptEngine(); - engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE); - return engine; + return createGremlinScriptEngine(spi); } catch (Exception exp) { if (DEBUG) exp.printStackTrace(); } @@ -184,9 +188,7 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan for (String name : names) { if (shortName.equals(name)) { try { - final GremlinScriptEngine engine = spi.getScriptEngine(); - engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE); - return engine; + return createGremlinScriptEngine(spi); } catch (Exception exp) { if (DEBUG) exp.printStackTrace(); } @@ -213,11 +215,9 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan //look for registered extension first Object obj; if (null != (obj = extensionAssociations.get(extension))) { - final GremlinScriptEngineFactory spi = (GremlinScriptEngineFactory)obj; + final GremlinScriptEngineFactory spi = (GremlinScriptEngineFactory) obj; try { - final GremlinScriptEngine engine = spi.getScriptEngine(); - engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE); - return engine; + return createGremlinScriptEngine(spi); } catch (Exception exp) { if (DEBUG) exp.printStackTrace(); } @@ -234,9 +234,7 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan for (String ext : exts) { if (extension.equals(ext)) { try { - final GremlinScriptEngine engine = spi.getScriptEngine(); - engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE); - return engine; + return createGremlinScriptEngine(spi); } catch (Exception exp) { if (DEBUG) exp.printStackTrace(); } @@ -264,9 +262,7 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan if (null != (obj = mimeTypeAssociations.get(mimeType))) { final GremlinScriptEngineFactory spi = (GremlinScriptEngineFactory) obj; try { - final GremlinScriptEngine engine = spi.getScriptEngine(); - engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE); - return engine; + return createGremlinScriptEngine(spi); } catch (Exception exp) { if (DEBUG) exp.printStackTrace(); } @@ -283,9 +279,7 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan for (String type : types) { if (mimeType.equals(type)) { try { - final GremlinScriptEngine engine = spi.getScriptEngine(); - engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE); - return engine; + return createGremlinScriptEngine(spi); } catch (Exception exp) { if (DEBUG) exp.printStackTrace(); } @@ -369,9 +363,8 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan } catch (ServiceConfigurationError err) { System.err.println("Can't find GremlinScriptEngineFactory providers: " + err.getMessage()); - if (DEBUG) { - err.printStackTrace(); - } + if (DEBUG) err.printStackTrace(); + // do not throw any exception here. user may want to manager their own factories using this manager // by explicit registration (by registerXXX) methods. return; @@ -384,19 +377,27 @@ public class DefaultGremlinScriptEngineManager implements GremlinScriptEngineMan } catch (ServiceConfigurationError err) { System.err.println("GremlinScriptEngineManager providers.next(): " + err.getMessage()); - if (DEBUG) { - err.printStackTrace(); - } + if (DEBUG) err.printStackTrace(); } } } catch (ServiceConfigurationError err) { System.err.println("GremlinScriptEngineManager providers.hasNext(): " + err.getMessage()); - if (DEBUG) { - err.printStackTrace(); - } + if (DEBUG) err.printStackTrace(); // do not throw any exception here. user may want to manage their own factories using this manager // by explicit registration (by registerXXX) methods. } } + + private GremlinScriptEngine createGremlinScriptEngine(final GremlinScriptEngineFactory spi) { + final GremlinScriptEngine engine = spi.getScriptEngine(); + engine.setBindings(getBindings(), ScriptContext.GLOBAL_SCOPE); + + // these are standard imports from gremlin-core that are applied to all GremlinScriptEngine instances + CoreImports.getClassImports().forEach(engine::addClassImport); + CoreImports.getMethodImports().forEach(engine::addMethodImport); + CoreImports.getEnumImports().forEach(engine::addEnumImport); + + return engine; + } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6840262f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java index f3ef212..916c2a6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java @@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import javax.script.Bindings; import javax.script.ScriptEngine; +import java.lang.reflect.Method; /** * A {@code GremlinScriptEngine} is an extension of the standard {@code ScriptEngine} and provides some specific @@ -35,4 +36,10 @@ public interface GremlinScriptEngine extends ScriptEngine { GremlinScriptEngineFactory getFactory(); Traversal.Admin eval(final Bytecode bytes, final Bindings bindings); + + void addClassImport(final Class clazz); + + void addEnumImport(final Enum e); + + void addMethodImport(final Method method); }
