Merge branch 'tp32' Conflicts: gremlin-dotnet/pom.xml gremlin-dotnet/test/pom.xml gremlin-groovy-test/pom.xml gremlin-python/pom.xml gremlin-python/src/test/resources/org/apache/tinkerpop/gremlin/python/driver/gremlin-server-modern-secure-py.yaml
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/0f6a32ca Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/0f6a32ca Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/0f6a32ca Branch: refs/heads/TINKERPOP-1730 Commit: 0f6a32ca2274f9a60e110f19c8500dbca6114ae4 Parents: aad6d39 cb99ddb Author: Stephen Mallette <sp...@genoprime.com> Authored: Tue Sep 19 08:26:31 2017 -0400 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Tue Sep 19 08:26:31 2017 -0400 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 1 + giraph-gremlin/pom.xml | 14 + gremlin-console/pom.xml | 14 + gremlin-dotnet/glv/generate.groovy | 228 +++++++++++++++ gremlin-dotnet/pom.xml | 224 +-------------- .../appsettings.json | 4 +- gremlin-dotnet/test/pom.xml | 96 ++----- gremlin-groovy-test/pom.xml | 0 gremlin-groovy/pom.xml | 14 + .../glv/GraphTraversalSource.template | 107 +++++++ gremlin-python/glv/TraversalSource.template | 282 +++++++++++++++++++ gremlin-python/glv/generate.groovy | 90 ++++++ gremlin-python/pom.xml | 172 +++-------- .../resources/GraphTraversalSource.template | 107 ------- .../src/main/resources/TraversalSource.template | 282 ------------------- .../gremlin/python/driver/credentials.kryo | Bin 138 -> 0 bytes .../python/driver/generate-modern.groovy | 33 --- .../driver/gremlin-server-modern-secure-py.yaml | 60 ---- .../driver/tinkergraph-credentials.properties | 22 -- .../python/driver/tinkergraph-empty.properties | 18 -- .../gremlin/server/util/MetricManager.java | 5 +- .../src/test/scripts/test-server-start.groovy | 60 ++++ .../src/test/scripts/test-server-stop.groovy | 32 +++ hadoop-gremlin/pom.xml | 14 + pom.xml | 16 +- spark-gremlin/pom.xml | 14 + 26 files changed, 958 insertions(+), 951 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/CHANGELOG.asciidoc ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/giraph-gremlin/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-console/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-dotnet/glv/generate.groovy ---------------------------------------------------------------------- diff --cc gremlin-dotnet/glv/generate.groovy index 0000000,8f66c26..95ee969 mode 000000,100644..100644 --- a/gremlin-dotnet/glv/generate.groovy +++ b/gremlin-dotnet/glv/generate.groovy @@@ -1,0 -1,220 +1,228 @@@ + /* + * 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. + */ + + import org.apache.tinkerpop.gremlin.jsr223.CoreImports + import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource + 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.P + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__ + import org.apache.tinkerpop.gremlin.structure.Direction + import java.lang.reflect.Modifier + + def toCSharpTypeMap = ["Long": "long", + "Integer": "int", + "String": "string", + "Object": "object", + "java.util.Map<java.lang.String, E2>": "IDictionary<string, E2>", + "java.util.Map<java.lang.String, B>": "IDictionary<string, E2>", ++ "java.util.Map<java.lang.Object, E2>": "IDictionary<object, E2>", ++ "java.util.Map<java.lang.Object, B>": "IDictionary<object, E2>", + "java.util.List<E>": "IList<E>", + "java.util.Map<K, V>": "IDictionary<K, V>", + "java.util.Collection<E2>": "ICollection<E2>", + "java.util.Collection<B>": "ICollection<E2>", + "java.util.Map<K, java.lang.Long>": "IDictionary<K, long>", + "TraversalMetrics": "E2"] + + def useE2 = ["E2", "E2"]; + def methodsWithSpecificTypes = ["constant": useE2, + "limit": useE2, + "mean": useE2, + "optional": useE2, + "range": useE2, + "select": ["IDictionary<string, E2>", "E2"], ++ "skip": useE2, + "sum": useE2, + "tail": useE2, + "tree": ["object"], - "unfold": useE2] ++ "unfold": useE2, ++ "valueMap": ["IDictionary<TKey, TValue>", "TKey, TValue"],] + + def getCSharpGenericTypeParam = { typeName -> + def tParam = "" + if (typeName.contains("E2")) { + tParam = "<E2>" + } + else if (typeName.contains("<K, V>")) { + tParam = "<K, V>" + } + else if (typeName.contains("<K, ")) { + tParam = "<K>" + } + return tParam + } + + def toCSharpType = { name -> + String typeName = toCSharpTypeMap.getOrDefault(name, name); + if (typeName.equals(name) && (typeName.contains("? extends") || typeName.equals("Tree"))) { + typeName = "E2" + } + return typeName; + } + + def toCSharpMethodName = { symbol -> (String) Character.toUpperCase(symbol.charAt(0)) + symbol.substring(1) } + + def getJavaParameterTypeNames = { method -> + def typeArguments = method.genericReturnType.actualTypeArguments; + return typeArguments. + collect { (it instanceof Class) ? ((Class)it).simpleName : it.typeName }. + collect { name -> + if (name.equals("A")) { + name = "object" + } + else if (name.equals("B")) { + name = "E2"; + } + name + } + } + + def binding = ["pmethods": P.class.getMethods(). + findAll { Modifier.isStatic(it.getModifiers()) }. + findAll { P.class.isAssignableFrom(it.returnType) }. + collect { it.name }. + unique(). + sort { a, b -> a <=> b }, + "sourceStepMethods": GraphTraversalSource.getMethods(). // SOURCE STEPS + findAll { GraphTraversalSource.class.equals(it.returnType) }. + findAll { + !it.name.equals("clone") && - !it.name.equals(TraversalSource.Symbols.withBindings) && + !it.name.equals(TraversalSource.Symbols.withRemote) && + !it.name.equals(TraversalSource.Symbols.withComputer) + }. + collect { it.name }. + unique(). + sort { a, b -> a <=> b }, + "sourceSpawnMethods": GraphTraversalSource.getMethods(). // SPAWN STEPS + findAll { GraphTraversal.class.equals(it.returnType) && !it.name.equals('inject')}. + collect { [methodName: it.name, typeArguments: it.genericReturnType.actualTypeArguments.collect{t -> ((java.lang.Class)t).simpleName}] }. + unique(). + sort { a, b -> a.methodName <=> b.methodName }, + "graphStepMethods": GraphTraversal.getMethods(). + findAll { GraphTraversal.class.equals(it.returnType) }. + findAll { !it.name.equals("clone") && !it.name.equals("iterate") }. + groupBy { it.name }. + // Select unique by name, with the most amount of parameters + collect { it.value.sort { a, b -> b.parameterCount <=> a.parameterCount }.first() }. + sort { a, b -> a.name <=> b.name }. + collect { javaMethod -> + def typeNames = getJavaParameterTypeNames(javaMethod) + def t1 = toCSharpType(typeNames[0]) + def t2 = toCSharpType(typeNames[1]) + def tParam = getCSharpGenericTypeParam(t2) ++ def specificTypes = methodsWithSpecificTypes.get(javaMethod.name) ++ if (specificTypes) { ++ t2 = specificTypes[0] ++ tParam = specificTypes.size() > 1 ? "<" + specificTypes[1] + ">" : "" ++ } + return ["methodName": javaMethod.name, "t1":t1, "t2":t2, "tParam":tParam] + }, + "anonStepMethods": __.class.getMethods(). + findAll { GraphTraversal.class.equals(it.returnType) }. + findAll { Modifier.isStatic(it.getModifiers()) }. + findAll { !it.name.equals("__") && !it.name.equals("start") }. + groupBy { it.name }. + // Select unique by name, with the most amount of parameters + collect { it.value.sort { a, b -> b.parameterCount <=> a.parameterCount }.first() }. + sort { it.name }. + collect { javaMethod -> + def typeNames = getJavaParameterTypeNames(javaMethod) + def t2 = toCSharpType(typeNames[1]) + def tParam = getCSharpGenericTypeParam(t2) + def specificTypes = methodsWithSpecificTypes.get(javaMethod.name) + if (specificTypes) { + t2 = specificTypes[0] + tParam = specificTypes.size() > 1 ? "<" + specificTypes[1] + ">" : "" + } + return ["methodName": javaMethod.name, "t2":t2, "tParam":tParam] + }, + "toCSharpMethodName": toCSharpMethodName] + + def engine = new groovy.text.GStringTemplateEngine() + def traversalTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/GraphTraversal.template")).make(binding) + def traversalFile = new File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs") + traversalFile.newWriter().withWriter{ it << traversalTemplate } + + def graphTraversalTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/GraphTraversalSource.template")).make(binding) + def graphTraversalFile = new File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/GraphTraversalSource.cs") + graphTraversalFile.newWriter().withWriter{ it << graphTraversalTemplate } + + def anonymousTraversalTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/AnonymousTraversal.template")).make(binding) + def anonymousTraversalFile = new File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/__.cs") + anonymousTraversalFile.newWriter().withWriter{ it << anonymousTraversalTemplate } + + def pTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/P.template")).make(binding) + def pFile = new File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/P.cs") + pFile.newWriter().withWriter{ it << pTemplate } + + // Process enums + def toCSharpName = { enumClass, itemName -> + if (enumClass.equals(Direction.class)) { + itemName = itemName.toLowerCase() + } + + return itemName.substring(0, 1).toUpperCase() + itemName.substring(1) + } + + def createEnum = { enumClass, csharpToJava -> + def b = ["enumClass": enumClass, + "constants": enumClass.getEnumConstants(). + sort { a, b -> a.name() <=> b.name() }. + collect { value -> + def csharpName = toCSharpName(enumClass, value.name()) + csharpToJava.put(enumClass.simpleName + "." + csharpName, value.name()) + return csharpName + }.join(",\n\t\t")] + + def enumTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/Enum.template")).make(b) + def enumFile = new File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/" + enumClass.getSimpleName() + ".cs") + enumFile.newWriter().withWriter{ it << enumTemplate } + } + + def enumCSharpToJavaNames = [:] + CoreImports.getClassImports().findAll { Enum.class.isAssignableFrom(it) }. + sort { a, b -> a.getSimpleName() <=> b.getSimpleName() }. + each { createEnum(it, enumCSharpToJavaNames) } + + def lastIndex = (enumCSharpToJavaNames.size() - 1); + def body = new StringBuilder() + enumCSharpToJavaNames.eachWithIndex{ node, i -> + body.append("""{"$node.key", "$node.value"}""") + body.append(i == lastIndex ? "\n" : ",\n ") + } + + def namingConversionsTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/NamingConversions.template")).make(["body":body]) + def namingConversionsFile = new File("${projectBaseDir}/src/Gremlin.Net/Process/Traversal/NamingConversions.cs") + namingConversionsFile.newWriter().withWriter{ it << namingConversionsTemplate } + + def determineVersion = { + def env = System.getenv() + def mavenVersion = env.containsKey("TP_RELEASE_VERSION") ? env.get("DOTNET_RELEASE_VERSION") : "${projectVersion}" + + // only want to generate a timestamp for the version if this is a nuget deploy + if (!mavenVersion.endsWith("-SNAPSHOT") || null == System.getProperty("nuget")) return mavenVersion + + return mavenVersion.replace("-SNAPSHOT", "-dev-" + System.currentTimeMillis()) + } + + def versionToUse = determineVersion() + def csprojTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/Gremlin.Net.csproj.template")).make(["projectVersion":versionToUse]) + def csprojFile = new File("${projectBaseDir}/src/Gremlin.Net/Gremlin.Net.csproj") + csprojFile.newWriter().withWriter{ it << csprojTemplate } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-dotnet/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-dotnet/test/pom.xml ---------------------------------------------------------------------- diff --cc gremlin-dotnet/test/pom.xml index 0a747c0,7b82a2e..7ac61b1 --- a/gremlin-dotnet/test/pom.xml +++ b/gremlin-dotnet/test/pom.xml @@@ -128,54 -128,22 +128,26 @@@ limitations under the License <goal>execute</goal> </goals> <configuration> + <properties> + <property> + <name>skipTests</name> + <value>${skipTests}</value> + </property> + <property> + <name>gremlinServerDir</name> + <value>${gremlin.server.dir}</value> + </property> + <property> + <name>executionName</name> + <value>${project.name}</value> + </property> ++ <property> ++ <name>projectBaseDir</name> ++ <value>${project.basedir}</value> ++ </property> + </properties> <scripts> - <script> - <![CDATA[ - import org.apache.tinkerpop.gremlin.server.GremlinServer - import org.apache.tinkerpop.gremlin.server.Settings - import org.apache.tinkerpop.gremlin.server.Settings.ScriptEngineSettings - import org.apache.tinkerpop.gremlin.server.Settings.SerializerSettings - import java.util.Properties - - if (${skipTests}) return - - log.info("Starting Gremlin Server instances for native testing of gremlin-dotnet") - def settings = Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern.yaml") - settings.graphs.graph = "${gremlin.server.dir}/conf/tinkergraph-empty.properties" - settings.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files = ["${gremlin.server.dir}/scripts/generate-modern.groovy"] - settings.serializers << new SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0", [:]) - settings.port = 45950 - - def server = new GremlinServer(settings) - server.start().join() - - project.setContextValue("gremlin.dotnet.server", server) - log.info("Gremlin Server with no authentication started on port 45950") - - def securePropsFile = new File('${project.basedir}/target/tinkergraph-credentials.properties') - if (!securePropsFile.exists()) { - securePropsFile.createNewFile() - securePropsFile << "gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph\n" - securePropsFile << "gremlin.tinkergraph.vertexIdManager=LONG\n" - securePropsFile << "gremlin.tinkergraph.graphLocation=${gremlin.server.dir}/data/credentials.kryo\n" - securePropsFile << "gremlin.tinkergraph.graphFormat=gryo" - } - - def settingsSecure = Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern.yaml") - settingsSecure.graphs.graph = "${gremlin.server.dir}/conf/tinkergraph-empty.properties" - settingsSecure.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files = ["${gremlin.server.dir}/scripts/generate-modern.groovy"] - settingsSecure.serializers << new SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0", [:]) - settingsSecure.port = 45951 - settingsSecure.authentication.authenticator = "org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator" - settingsSecure.authentication.config = [credentialsDb: "${project.basedir}/target/tinkergraph-credentials.properties"] - - def serverSecure = new GremlinServer(settingsSecure) - serverSecure.start().join() - - project.setContextValue("gremlin.dotnet.server.secure", serverSecure) - log.info("Gremlin Server with authentication started on port 45951") - ]]> - </script> + <script>${gremlin.server.dir}/src/test/scripts/test-server-start.groovy</script> </scripts> </configuration> </execution> http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-groovy-test/pom.xml ---------------------------------------------------------------------- diff --cc gremlin-groovy-test/pom.xml index e69de29,4fa6ea5..0000000 deleted file mode 100644,100644 --- a/gremlin-groovy-test/pom.xml +++ /dev/null http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-groovy/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-python/glv/GraphTraversalSource.template ---------------------------------------------------------------------- diff --cc gremlin-python/glv/GraphTraversalSource.template index 0000000,54b339e..91f6a17 mode 000000,100644..100644 --- a/gremlin-python/glv/GraphTraversalSource.template +++ b/gremlin-python/glv/GraphTraversalSource.template @@@ -1,0 -1,102 +1,107 @@@ + ''' + 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. + ''' + + import sys + from .traversal import Traversal + from .traversal import TraversalStrategies + from .strategies import VertexProgramStrategy + from .traversal import Bytecode + from ..driver.remote_connection import RemoteStrategy + from .. import statics + from ..statics import long + + class GraphTraversalSource(object): + def __init__(self, graph, traversal_strategies, bytecode=None): + self.graph = graph + self.traversal_strategies = traversal_strategies + if bytecode is None: + bytecode = Bytecode() + self.bytecode = bytecode + self.graph_traversal = GraphTraversal + def __repr__(self): + return "graphtraversalsource[" + str(self.graph) + "]" + def get_graph_traversal_source(self): + return self.__class__(self.graph, TraversalStrategies(self.traversal_strategies), Bytecode(self.bytecode)) + def get_graph_traversal(self): + return self.graph_traversal(self.graph, self.traversal_strategies, Bytecode(self.bytecode)) + + <% sourceStepMethods.each{ method -> %> + def <%= method %>(self, *args): + source = self.get_graph_traversal_source() + source.bytecode.add_source("<%= toJava.call(method) %>", *args) + return source + <% } %> + + def withRemote(self, remote_connection): + source = self.get_graph_traversal_source() + source.traversal_strategies.add_strategies([RemoteStrategy(remote_connection)]) + return source + def withComputer(self,graph_computer=None, workers=None, result=None, persist=None, vertices=None, edges=None, configuration=None): + return self.withStrategies(VertexProgramStrategy(graph_computer,workers,result,persist,vertices,edges,configuration)) + + <% sourceSpawnMethods.each { method -> %> + def <%= method %>(self, *args): + traversal = self.get_graph_traversal() + traversal.bytecode.add_step("<%= toJava.call(method) %>", *args) + return traversal + <% } %> + + class GraphTraversal(Traversal): + def __init__(self, graph, traversal_strategies, bytecode): + super(GraphTraversal, self).__init__(graph, traversal_strategies, bytecode) + def __getitem__(self, index): + if isinstance(index, int): + return self.range(long(index), long(index + 1)) + elif isinstance(index, slice): - return self.range(long(0) if index.start is None else long(index.start), long(sys.maxsize) if index.stop is None else long(index.stop)) ++ low = long(0) if index.start is None else long(index.start) ++ high = long(sys.maxsize) if index.stop is None else long(index.stop) ++ if low == long(0): ++ return self.limit(high) ++ else: ++ return self.range(low,high) + else: + raise TypeError("Index must be int or slice") + def __getattr__(self, key): + return self.values(key) + <% graphStepMethods.each { method -> %> + def <%= method %>(self, *args): + self.bytecode.add_step("<%= toJava.call(method) %>", *args) + return self + <% } %> + + class __(object): + graph_traversal = GraphTraversal + @classmethod + def start(cls): + return GraphTraversal(None, None, Bytecode()) + @classmethod + def __(cls, *args): + return __.inject(*args) + + <% anonStepMethods.each{ method -> %> + @classmethod + def <%= method %>(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).<%= method %>(*args) + <% } %> + + <% anonStepMethods.each{ method -> %> + def <%= method %>(*args): + return __.<%= method %>(*args) + statics.add_static('<%= method %>', <%= method %>) + <% } %> http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-python/glv/generate.groovy ---------------------------------------------------------------------- diff --cc gremlin-python/glv/generate.groovy index 0000000,4873d12..58d0cd3 mode 000000,100644..100644 --- a/gremlin-python/glv/generate.groovy +++ b/gremlin-python/glv/generate.groovy @@@ -1,0 -1,94 +1,90 @@@ + /* + * 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. + */ + + import org.apache.tinkerpop.gremlin.jsr223.CoreImports + import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource + 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.P + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__ + import java.lang.reflect.Modifier - + // this is a bit of a copy of what's in SymbolHelper - no way around it because this code generation task occurs + // before the SymbolHelper is available to the plugin. + def toPythonMap = ["global": "global_", + "as": "as_", + "in": "in_", + "and": "and_", + "or": "or_", + "is": "is_", + "not": "not_", + "from": "from_", + "list": "list_", + "set": "set_", + "all": "all_"] + def toJavaMap = toPythonMap.collectEntries{k,v -> [(v):k]} - + def toPython = { symbol -> toPythonMap.getOrDefault(symbol, symbol) } + def toJava = { symbol -> toJavaMap.getOrDefault(symbol, symbol) } - + def binding = ["enums": CoreImports.getClassImports() + .findAll { Enum.class.isAssignableFrom(it) } + .sort { a, b -> a.getSimpleName() <=> b.getSimpleName() }, + "pmethods": P.class.getMethods(). + findAll { Modifier.isStatic(it.getModifiers()) }. + findAll { P.class.isAssignableFrom(it.returnType) }. + collect { toPython(it.name) }. + unique(). + sort { a, b -> a <=> b }, + "sourceStepMethods": GraphTraversalSource.getMethods(). // SOURCE STEPS + findAll { GraphTraversalSource.class.equals(it.returnType) }. + findAll { + !it.name.equals("clone") && - !it.name.equals(TraversalSource.Symbols.withBindings) && + !it.name.equals(TraversalSource.Symbols.withRemote) && + !it.name.equals(TraversalSource.Symbols.withComputer) + }. + collect { toPython(it.name) }. + unique(). + sort { a, b -> a <=> b }, + "sourceSpawnMethods": GraphTraversalSource.getMethods(). // SPAWN STEPS + findAll { GraphTraversal.class.equals(it.returnType) }. + collect { toPython(it.name) }. + unique(). + sort { a, b -> a <=> b }, + "graphStepMethods": GraphTraversal.getMethods(). + findAll { GraphTraversal.class.equals(it.returnType) }. + findAll { !it.name.equals("clone") && !it.name.equals("iterate") }. + collect { toPython(it.name) }. + unique(). + sort { a, b -> a <=> b }, + "anonStepMethods": __.class.getMethods(). + findAll { GraphTraversal.class.equals(it.returnType) }. + findAll { Modifier.isStatic(it.getModifiers()) }. + findAll { !it.name.equals("__") && !it.name.equals("start") }. + collect { toPython(it.name) }. + unique(). + sort { a, b -> a <=> b }, + "toPython": toPython, + "toJava": toJava] + + def engine = new groovy.text.GStringTemplateEngine() + def traversalTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/TraversalSource.template")).make(binding) + def traversalFile = new File("${projectBaseDir}/src/main/jython/gremlin_python/process/traversal.py") + traversalFile.newWriter().withWriter{ it << traversalTemplate } + + def graphTraversalTemplate = engine.createTemplate(new File("${projectBaseDir}/glv/GraphTraversalSource.template")).make(binding) + def graphTraversalFile = new File("${projectBaseDir}/src/main/jython/gremlin_python/process/graph_traversal.py") + graphTraversalFile.newWriter().withWriter{ it << graphTraversalTemplate } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-python/pom.xml ---------------------------------------------------------------------- diff --cc gremlin-python/pom.xml index e298fcd,b60b867..9fcf87d --- a/gremlin-python/pom.xml +++ b/gremlin-python/pom.xml @@@ -572,44 -504,22 +504,26 @@@ limitations under the License <goal>execute</goal> </goals> <configuration> + <properties> + <property> + <name>skipTests</name> + <value>${skipTests}</value> + </property> + <property> + <name>gremlinServerDir</name> + <value>${gremlin.server.dir}</value> + </property> + <property> + <name>executionName</name> + <value>${project.name}</value> + </property> ++ <property> ++ <name>projectBaseDir</name> ++ <value>${project.basedir}</value> ++ </property> + </properties> <scripts> - <script> - <![CDATA[ - import org.apache.tinkerpop.gremlin.server.GremlinServer - import org.apache.tinkerpop.gremlin.server.Settings - import org.apache.tinkerpop.gremlin.server.Settings.ScriptEngineSettings - import org.apache.tinkerpop.gremlin.server.Settings.SerializerSettings - - if (${skipTests}) return - - log.info("Starting Gremlin Server instances for native testing of gremlin-python") - def settings = Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern-py.yaml") - settings.graphs.graph = "${gremlin.server.dir}/conf/tinkergraph-empty.properties" - settings.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files = ["${gremlin.server.dir}/scripts/generate-modern.groovy"] - settings.serializers << new SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0", [:]) - settings.port = 45940 - - def server = new GremlinServer(settings) - server.start().join() - - project.setContextValue("gremlin.py.server", server) - log.info("Gremlin Server with no authentication started on port 45940") - - def settingsSecure = Settings.read("${gremlin.server.dir}/conf/gremlin-server-modern-py.yaml") - settingsSecure.graphs.graph = "${gremlin.server.dir}/conf/tinkergraph-empty.properties" - settingsSecure.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files = ["${gremlin.server.dir}/scripts/generate-modern.groovy"] - settings.serializers << new SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0", [:]) - settingsSecure.port = 45941 - settingsSecure.authentication.authenticator = "org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator" - settingsSecure.authentication.config = [credentialsDb: "${gremlin.server.dir}/conf/tinkergraph-credentials.properties"] - - def serverSecure = new GremlinServer(settingsSecure) - serverSecure.start().join() - - project.setContextValue("gremlin.py.server.secure", serverSecure) - log.info("Gremlin Server with authentication started on port 45941") - ]]> - </script> + <script>${gremlin.server.dir}/src/test/scripts/test-server-start.groovy</script> </scripts> </configuration> </execution> http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/MetricManager.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/gremlin-server/src/test/scripts/test-server-start.groovy ---------------------------------------------------------------------- diff --cc gremlin-server/src/test/scripts/test-server-start.groovy index 0000000,83efcd5..76bd8ff mode 000000,100644..100644 --- a/gremlin-server/src/test/scripts/test-server-start.groovy +++ b/gremlin-server/src/test/scripts/test-server-start.groovy @@@ -1,0 -1,49 +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. + */ + + import org.apache.tinkerpop.gremlin.server.GremlinServer + import org.apache.tinkerpop.gremlin.server.Settings -import org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator ++import org.apache.tinkerpop.gremlin.server.Settings.SerializerSettings + + if (Boolean.parseBoolean(skipTests)) return + + log.info("Starting Gremlin Server instances for native testing of ${executionName}") + def settings = Settings.read("${gremlinServerDir}/conf/gremlin-server-modern-py.yaml") + settings.graphs.graph = gremlinServerDir + "/conf/tinkergraph-empty.properties" -settings.scriptEngines["gremlin-groovy"].scripts = [gremlinServerDir + "/scripts/generate-modern.groovy"] ++settings.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files = [gremlinServerDir + "/scripts/generate-modern.groovy"] ++settings.serializers << new SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0", [:]) + settings.port = 45940 + + def server = new GremlinServer(settings) + server.start().join() + + project.setContextValue("gremlin.server", server) + log.info("Gremlin Server with no authentication started on port 45940") + ++def securePropsFile = new File("${projectBaseDir}/target/tinkergraph-credentials.properties") ++if (!securePropsFile.exists()) { ++ securePropsFile.createNewFile() ++ securePropsFile << "gremlin.graph=org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph\n" ++ securePropsFile << "gremlin.tinkergraph.vertexIdManager=LONG\n" ++ securePropsFile << "gremlin.tinkergraph.graphLocation=${gremlinServerDir}/data/credentials.kryo\n" ++ securePropsFile << "gremlin.tinkergraph.graphFormat=gryo" ++} ++ + def settingsSecure = Settings.read("${gremlinServerDir}/conf/gremlin-server-modern.yaml") + settingsSecure.graphs.graph = gremlinServerDir + "/conf/tinkergraph-empty.properties" -settingsSecure.scriptEngines["gremlin-groovy"].scripts = [gremlinServerDir + "/scripts/generate-modern.groovy"] ++settingsSecure.scriptEngines["gremlin-groovy"].plugins["org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin"].files = [gremlinServerDir + "/scripts/generate-modern.groovy"] ++settingsSecure.serializers << new SerializerSettings("org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0", [:]) + settingsSecure.port = 45941 -settingsSecure.authentication.className = SimpleAuthenticator.class.name -settingsSecure.authentication.config = [credentialsDb: gremlinServerDir + "/conf/tinkergraph-credentials.properties", credentialsDbLocation: gremlinServerDir + "/data/credentials.kryo"] ++settingsSecure.authentication.authenticator = "org.apache.tinkerpop.gremlin.server.auth.SimpleAuthenticator" ++settingsSecure.authentication.config = [credentialsDb: projectBaseDir + "/target/tinkergraph-credentials.properties"] + + def serverSecure = new GremlinServer(settingsSecure) + serverSecure.start().join() + + project.setContextValue("gremlin.server.secure", serverSecure) + log.info("Gremlin Server with authentication started on port 45941") http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/hadoop-gremlin/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/pom.xml ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0f6a32ca/spark-gremlin/pom.xml ----------------------------------------------------------------------