TINKERPOP-1562 Add new HadoopGremlinPlugin and deprecated the old. Had to add some capabilities to plugin system to allow for passing of console environment bits (like groovysh for example).
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/50dc68ef Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/50dc68ef Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/50dc68ef Branch: refs/heads/TINKERPOP-1562 Commit: 50dc68efc94445f38d5fc4a1612d95462e3343bd Parents: 1948fdc Author: Stephen Mallette <sp...@genoprime.com> Authored: Tue Nov 22 13:41:58 2016 -0500 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Tue Nov 22 13:41:58 2016 -0500 ---------------------------------------------------------------------- .../gremlin/console/plugin/PluggedIn.groovy | 2 +- .../gremlin/jsr223/LazyBindingsCustomizer.java | 41 +++++ .../jsr223/console/ConsoleCustomizer.java | 7 +- .../jsr223/console/LazyBindingsCustomizer.java | 41 ----- .../gremlin/jsr223/console/RemoteAcceptor.java | 3 +- .../gremlin/groovy/plugin/PluginAcceptor.java | 2 +- .../groovy/plugin/HadoopGremlinPlugin.java | 2 + .../groovy/plugin/HadoopRemoteAcceptor.java | 2 + .../hadoop/jsr223/HadoopGremlinPlugin.java | 154 +++++++++++++++++++ .../hadoop/jsr223/HadoopRemoteAcceptor.java | 127 +++++++++++++++ ...pache.tinkerpop.gremlin.jsr223.GremlinPlugin | 1 + .../neo4j/groovy/plugin/Neo4jGremlinPlugin.java | 1 + .../spark/jsr223/SparkGremlinPlugin.java | 2 +- 13 files changed, 339 insertions(+), 46 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/PluggedIn.groovy ---------------------------------------------------------------------- diff --git a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/PluggedIn.groovy b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/PluggedIn.groovy index b707226..dc63a2f 100644 --- a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/PluggedIn.groovy +++ b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/PluggedIn.groovy @@ -90,7 +90,7 @@ class PluggedIn { } else if (it instanceof ScriptCustomizer) { it.getScripts().collect { it.join(LINE_SEPARATOR) }.each { pluginAcceptor.eval(it) } } else if (it instanceof BindingsCustomizer) { - it.bindings.entrySet().each { k, v -> pluginAcceptor.addBinding(k,v) } + it.bindings.entrySet().each { kv -> pluginAcceptor.addBinding(kv.key, kv.value) } } } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/LazyBindingsCustomizer.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/LazyBindingsCustomizer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/LazyBindingsCustomizer.java new file mode 100644 index 0000000..4117ae5 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/LazyBindingsCustomizer.java @@ -0,0 +1,41 @@ +/* + * 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.jsr223; + +import org.apache.tinkerpop.gremlin.jsr223.BindingsCustomizer; + +import javax.script.Bindings; +import java.util.function.Supplier; + +/** + * @author Stephen Mallette (http://stephen.genoprime.com) + */ +public class LazyBindingsCustomizer implements BindingsCustomizer { + + private final Supplier<Bindings> bindingsSupplier; + + public LazyBindingsCustomizer(final Supplier<Bindings> bindingsSupplier) { + this.bindingsSupplier = bindingsSupplier; + } + + @Override + public Bindings getBindings() { + return bindingsSupplier.get(); + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/ConsoleCustomizer.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/ConsoleCustomizer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/ConsoleCustomizer.java index 47771bc..7b3d788 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/ConsoleCustomizer.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/ConsoleCustomizer.java @@ -20,14 +20,19 @@ package org.apache.tinkerpop.gremlin.jsr223.console; import org.apache.tinkerpop.gremlin.jsr223.Customizer; +import java.util.Map; + /** * @author Stephen Mallette (http://stephen.genoprime.com) */ public interface ConsoleCustomizer extends Customizer { + public static final String ENV_CONSOLE_IO = "ConsolePluginAcceptor.io"; + public static final String ENV_CONSOLE_SHELL = "ConsolePluginAcceptor.shell"; + /** * Allows a plugin to utilize features of the {@code :remote} and {@code :submit} commands of the Gremlin Console. * This method does not need to be implemented if the plugin is not meant for the Console for some reason or * if it does not intend to take advantage of those commands. */ - public RemoteAcceptor getRemoteAcceptor(); + public RemoteAcceptor getRemoteAcceptor(final Map<String, Object> environment); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/LazyBindingsCustomizer.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/LazyBindingsCustomizer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/LazyBindingsCustomizer.java deleted file mode 100644 index f21a2ab..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/LazyBindingsCustomizer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.jsr223.console; - -import org.apache.tinkerpop.gremlin.jsr223.BindingsCustomizer; - -import javax.script.Bindings; -import java.util.function.Supplier; - -/** - * @author Stephen Mallette (http://stephen.genoprime.com) - */ -public class LazyBindingsCustomizer implements BindingsCustomizer { - - private final Supplier<Bindings> bindingsSupplier; - - public LazyBindingsCustomizer(final Supplier<Bindings> bindingsSupplier) { - this.bindingsSupplier = bindingsSupplier; - } - - @Override - public Bindings getBindings() { - return bindingsSupplier.get(); - } -} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/RemoteAcceptor.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/RemoteAcceptor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/RemoteAcceptor.java index aee77ae..ab4c81d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/RemoteAcceptor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/console/RemoteAcceptor.java @@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.jsr223.console; import java.io.Closeable; import java.util.List; +import java.util.Map; /** * The Gremlin Console supports the {@code :remote} and {@code :submit} commands which provide standardized ways @@ -27,7 +28,7 @@ import java.util.List; * A "remote connection" does not necessarily have to be a remote server. It simply refers to a resource that is * external to the console. * <p/> - * By implementing this interface and returning an instance of it through {@link ConsoleCustomizer#getRemoteAcceptor()} + * By implementing this interface and returning an instance of it through {@link ConsoleCustomizer#getRemoteAcceptor(Map)} * a plugin can hook into those commands and provide remoting features. * * @author Stephen Mallette (http://stephen.genoprime.com) http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/plugin/PluginAcceptor.java ---------------------------------------------------------------------- diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/plugin/PluginAcceptor.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/plugin/PluginAcceptor.java index 9571381..9165237 100644 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/plugin/PluginAcceptor.java +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/plugin/PluginAcceptor.java @@ -31,7 +31,7 @@ import java.util.Set; * and provides the abstractions required for a plugin to work regardless of the environmental implementations. * * @author Stephen Mallette (http://stephen.genoprime.com) - * @deprecated As of release 3.2.4, replaced by {@link org.apache.tinkerpop.gremlin.console.PluginAcceptor}. + * @deprecated As of release 3.2.4, replaced by {@link org.apache.tinkerpop.gremlin.jsr223.console.PluginAcceptor}. */ @Deprecated public interface PluginAcceptor { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopGremlinPlugin.java ---------------------------------------------------------------------- diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopGremlinPlugin.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopGremlinPlugin.java index 021f9d3..ca446ef 100644 --- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopGremlinPlugin.java +++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopGremlinPlugin.java @@ -43,7 +43,9 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) + * @deprecated As of release 3.2.4, replaced by {@link org.apache.tinkerpop.gremlin.hadoop.jsr223.HadoopGremlinPlugin}. */ +@Deprecated public final class HadoopGremlinPlugin extends AbstractGremlinPlugin { protected static String NAME = "tinkerpop.hadoop"; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java ---------------------------------------------------------------------- diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java index 558376e..acae442 100644 --- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java +++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java @@ -39,7 +39,9 @@ import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) + * @deprecated As of release 3.2.4, replaced by {@link org.apache.tinkerpop.gremlin.hadoop.jsr223.HadoopRemoteAcceptor}. */ +@Deprecated public final class HadoopRemoteAcceptor implements RemoteAcceptor { private static final String USE_SUGAR = "useSugar"; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopGremlinPlugin.java ---------------------------------------------------------------------- diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopGremlinPlugin.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopGremlinPlugin.java new file mode 100644 index 0000000..5e21027 --- /dev/null +++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopGremlinPlugin.java @@ -0,0 +1,154 @@ +/* + * 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.hadoop.jsr223; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.io.IOUtils; +import org.apache.hadoop.io.compress.CodecPool; +import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat; +import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat; +import org.apache.hadoop.util.ToolRunner; +import org.apache.tinkerpop.gremlin.hadoop.Constants; +import org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.MapReduceGraphComputer; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopConfiguration; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopEdge; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopElement; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopProperty; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopVertex; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopVertexProperty; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.FileSystemStorage; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONInputFormat; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONOutputFormat; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONRecordReader; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.GraphSONRecordWriter; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoInputFormat; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoRecordReader; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoRecordWriter; +import org.apache.tinkerpop.gremlin.hadoop.structure.io.script.ScriptInputFormat; +import org.apache.tinkerpop.gremlin.hadoop.structure.util.ConfUtil; +import org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin; +import org.apache.tinkerpop.gremlin.jsr223.BindingsCustomizer; +import org.apache.tinkerpop.gremlin.jsr223.Customizer; +import org.apache.tinkerpop.gremlin.jsr223.DefaultImportCustomizer; +import org.apache.tinkerpop.gremlin.jsr223.ImportCustomizer; +import org.apache.tinkerpop.gremlin.jsr223.LazyBindingsCustomizer; +import org.apache.tinkerpop.gremlin.jsr223.console.ConsoleCustomizer; +import org.apache.tinkerpop.gremlin.jsr223.console.RemoteAcceptor; +import org.codehaus.groovy.tools.shell.Groovysh; + +import javax.script.Bindings; +import javax.script.SimpleBindings; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class HadoopGremlinPlugin extends AbstractGremlinPlugin { + + protected static String NAME = "tinkerpop.hadoop"; + + private static final BindingsCustomizer bindings; + + private static final ImportCustomizer imports; + + private static final Set<String> appliesTo = new HashSet<>(Collections.singletonList("gremlin-groovy")); + + static { + try { + // TODO: most of the imports here were wildcarded, but we dont' allow that anymore - needs review + imports = DefaultImportCustomizer.build() + .addClassImports( + Configuration.class, + org.apache.hadoop.hdfs.DFSClient.class, + FileSystem.class, + ToolRunner.class, + IOUtils.class, + CodecPool.class, + SequenceFileInputFormat.class, + SequenceFileOutputFormat.class, + Constants.class, + HadoopConfiguration.class, + HadoopEdge.class, + HadoopElement.class, + HadoopGraph.class, + HadoopProperty.class, + HadoopVertex.class, + HadoopVertexProperty.class, + ConfUtil.class, + VertexWritable.class, + GraphSONInputFormat.class, + GraphSONOutputFormat.class, + GraphSONRecordReader.class, + GraphSONRecordWriter.class, + GryoInputFormat.class, + GryoOutputFormat.class, + GryoRecordReader.class, + GryoRecordWriter.class, + ScriptInputFormat.class, + MapReduceGraphComputer.class).create(); + + bindings = new LazyBindingsCustomizer(() -> { + try { + final Bindings bindings = new SimpleBindings(); + bindings.put("hdfs", FileSystemStorage.open(FileSystem.get(new Configuration()))); + bindings.put("fs", FileSystemStorage.open(FileSystem.getLocal(new Configuration()))); + return bindings; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + public HadoopGremlinPlugin() { + super(NAME, appliesTo, imports, bindings, new HadoopConsoleCustomizer()); + } + + @Override + public Optional<Customizer[]> getCustomizers(final String scriptEngineName) { + if (null == System.getenv(Constants.HADOOP_GREMLIN_LIBS)) + HadoopGraph.LOGGER.warn("Be sure to set the environmental variable: " + Constants.HADOOP_GREMLIN_LIBS); + else + HadoopGraph.LOGGER.info(Constants.HADOOP_GREMLIN_LIBS + " is set to: " + System.getenv(Constants.HADOOP_GREMLIN_LIBS)); + + return super.getCustomizers(scriptEngineName); + } + + @Override + public boolean requireRestart() { + return true; + } + + private static class HadoopConsoleCustomizer implements ConsoleCustomizer { + @Override + public RemoteAcceptor getRemoteAcceptor(final Map<String, Object> environment) { + return new HadoopRemoteAcceptor((Groovysh) environment.get(ConsoleCustomizer.ENV_CONSOLE_SHELL)); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopRemoteAcceptor.java ---------------------------------------------------------------------- diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopRemoteAcceptor.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopRemoteAcceptor.java new file mode 100644 index 0000000..f2367bd --- /dev/null +++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/jsr223/HadoopRemoteAcceptor.java @@ -0,0 +1,127 @@ +/* + * 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.hadoop.jsr223; + +import org.apache.tinkerpop.gremlin.groovy.loaders.SugarLoader; +import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph; +import org.apache.tinkerpop.gremlin.jsr223.console.RemoteAcceptor; +import org.apache.tinkerpop.gremlin.jsr223.console.RemoteException; +import org.apache.tinkerpop.gremlin.process.computer.ComputerResult; +import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram; +import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep; +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; +import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal; +import org.codehaus.groovy.tools.shell.Groovysh; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class HadoopRemoteAcceptor implements RemoteAcceptor { + + private static final String USE_SUGAR = "useSugar"; + private static final String USE_TRAVERSAL_SOURCE = "useTraversalSource"; + private static final String SPACE = " "; + + private HadoopGraph hadoopGraph; + private Groovysh shell; + private boolean useSugar = false; + private TraversalSource traversalSource; + + public HadoopRemoteAcceptor(final Groovysh shell) { + this.shell = shell; + } + + @Override + public Object connect(final List<String> args) throws RemoteException { + if (args.size() != 1 && args.size() != 2) { + throw new IllegalArgumentException("Usage: :remote connect " + HadoopGremlinPlugin.NAME + " <variable name of graph> <optional variable name of traversal source>"); + } + this.hadoopGraph = (HadoopGraph) this.shell.getInterp().getContext().getVariable(args.get(0)); + if (args.size() == 2) + this.traversalSource = ((TraversalSource) this.shell.getInterp().getContext().getVariable(args.get(1))); + else + this.traversalSource = this.hadoopGraph.traversal(); + /// + final HashMap<String, Object> configuration = new HashMap<>(); + configuration.put(USE_SUGAR, this.useSugar); + configuration.put(USE_TRAVERSAL_SOURCE, this.traversalSource); + return Collections.unmodifiableMap(configuration); + } + + @Override + public Object configure(final List<String> args) throws RemoteException { + for (int i = 0; i < args.size(); i = i + 2) { + if (args.get(i).equals(USE_SUGAR)) + this.useSugar = Boolean.valueOf(args.get(i + 1)); + else if (args.get(i).equals(USE_TRAVERSAL_SOURCE)) { + this.traversalSource = ((TraversalSource) this.shell.getInterp().getContext().getVariable(args.get(i + 1))); + } else + throw new IllegalArgumentException("The provided configuration is unknown: " + args.get(i) + ":" + args.get(i + 1)); + } + /// + final HashMap<String, Object> configuration = new HashMap<>(); + configuration.put(USE_SUGAR, this.useSugar); + configuration.put(USE_TRAVERSAL_SOURCE, this.traversalSource); + return Collections.unmodifiableMap(configuration); + } + + @Override + public Object submit(final List<String> args) throws RemoteException { + try { + String script = getScript(String.join(SPACE, args), this.shell); + if (this.useSugar) + script = SugarLoader.class.getCanonicalName() + ".load()\n" + script; + final TraversalVertexProgram program = TraversalVertexProgram.build().traversal(this.traversalSource, "gremlin-groovy", script).create(this.hadoopGraph); + final ComputerResult computerResult = VertexProgramStrategy.getComputer(this.traversalSource.getStrategies()).get().apply(this.hadoopGraph).program(program).submit().get(); + this.shell.getInterp().getContext().setVariable(RESULT, computerResult); + /// + final Traversal.Admin<ComputerResult, ?> traversal = new DefaultTraversal<>(computerResult.graph()); + traversal.addStep(new ComputerResultStep<>(traversal)); + traversal.addStart(traversal.getTraverserGenerator().generate(computerResult, EmptyStep.instance(), 1l)); + return traversal; + } catch (final Exception e) { + throw new RemoteException(e); + } + } + + @Override + public boolean allowRemoteConsole() { + return true; + } + + @Override + public void close() throws IOException { + this.hadoopGraph.close(); + } + + /** + * Retrieve a script as defined in the shell context. This allows for multi-line scripts to be submitted. + */ + public static String getScript(final String submittedScript, final Groovysh shell) { + return submittedScript.startsWith("@") ? shell.getInterp().getContext().getProperty(submittedScript.substring(1)).toString() : submittedScript; + } +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/hadoop-gremlin/src/main/resources/META-INF/services/org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin ---------------------------------------------------------------------- diff --git a/hadoop-gremlin/src/main/resources/META-INF/services/org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin b/hadoop-gremlin/src/main/resources/META-INF/services/org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin new file mode 100644 index 0000000..07223dd --- /dev/null +++ b/hadoop-gremlin/src/main/resources/META-INF/services/org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin @@ -0,0 +1 @@ +org.apache.tinkerpop.gremlin.hadoop.jsr223.HadoopGremlinPlugin \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java ---------------------------------------------------------------------- diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java index 9053cf3..68c0016 100644 --- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java +++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/groovy/plugin/Neo4jGremlinPlugin.java @@ -32,6 +32,7 @@ import java.util.Set; * @author Stephen Mallette (http://stephen.genoprime.com) * @deprecated As of release 3.2.4, replaced by {@link org.apache.tinkerpop.gremlin.neo4j.jsr223.Neo4jGremlinPlugin}. */ +@Deprecated public final class Neo4jGremlinPlugin extends AbstractGremlinPlugin { private static final Set<String> IMPORTS = new HashSet<String>() {{ http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/50dc68ef/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/jsr223/SparkGremlinPlugin.java ---------------------------------------------------------------------- diff --git a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/jsr223/SparkGremlinPlugin.java b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/jsr223/SparkGremlinPlugin.java index 840f593..9403fa4 100644 --- a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/jsr223/SparkGremlinPlugin.java +++ b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/jsr223/SparkGremlinPlugin.java @@ -23,7 +23,7 @@ import org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin; import org.apache.tinkerpop.gremlin.jsr223.BindingsCustomizer; import org.apache.tinkerpop.gremlin.jsr223.DefaultImportCustomizer; import org.apache.tinkerpop.gremlin.jsr223.ImportCustomizer; -import org.apache.tinkerpop.gremlin.jsr223.console.LazyBindingsCustomizer; +import org.apache.tinkerpop.gremlin.jsr223.LazyBindingsCustomizer; import org.apache.tinkerpop.gremlin.spark.process.computer.CombineIterator; import org.apache.tinkerpop.gremlin.spark.process.computer.MapIterator; import org.apache.tinkerpop.gremlin.spark.process.computer.MemoryAccumulator;