You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/05/03 12:24:00 UTC
[01/25] tinkerpop git commit: Supply test [Forced Update!]
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-786 1f7b5e12a -> 8d82fd7b1 (forced update)
Supply test
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c423d101
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c423d101
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c423d101
Branch: refs/heads/TINKERPOP-786
Commit: c423d101f4bc09c6c3593b1bad10d9b4d8b53fea
Parents: 9bdef4d
Author: dpitera <dp...@us.ibm.com>
Authored: Thu Apr 6 13:53:18 2017 -0400
Committer: dpitera <dp...@us.ibm.com>
Committed: Mon Apr 17 14:31:41 2017 -0400
----------------------------------------------------------------------
...remlinGroovyScriptEngineFileSandboxTest.java | 12 +++++
.../sandbox-empty-static-variable-types.yaml | 56 ++++++++++++++++++++
2 files changed, 68 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c423d101/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineFileSandboxTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineFileSandboxTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineFileSandboxTest.java
index 3ee1306..a998aba 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineFileSandboxTest.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineFileSandboxTest.java
@@ -61,6 +61,18 @@ public class GremlinGroovyScriptEngineFileSandboxTest extends AbstractGremlinTes
}
@Test
+ public void shouldSuccessfullyInstantiateGroovyScriptEngineWithEmptyStaticVariableTyping() throws Exception {
+ final File f = TestHelper.generateTempFileFromResource(graph.getClass(), GremlinGroovyScriptEngineFileSandboxTest.class, "sandbox-empty-static-variable-types.yaml", ".yaml");
+ System.setProperty(FileSandboxExtension.GREMLIN_SERVER_SANDBOX, f.getAbsolutePath());
+ final CompilerCustomizerProvider standardSandbox = new CompileStaticCustomizerProvider(FileSandboxExtension.class.getName());
+ try (GremlinGroovyScriptEngine engine = new GremlinGroovyScriptEngine(standardSandbox)) {
+ assertEquals(123, engine.eval("java.lang.Math.abs(-123)"));
+ assertThat(engine.eval("new Boolean(true)"), is(true));
+ assertThat(engine.eval("new Boolean(true).toString()"), is("true"));
+ }
+ }
+
+ @Test
public void shouldEvalAsTheMethodIsWhiteListed() throws Exception {
final CompilerCustomizerProvider standardSandbox = new CompileStaticCustomizerProvider(FileSandboxExtension.class.getName());
try (GremlinGroovyScriptEngine engine = new GremlinGroovyScriptEngine(standardSandbox)) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c423d101/gremlin-groovy-test/src/main/resources/org/apache/tinkerpop/gremlin/groovy/jsr223/sandbox-empty-static-variable-types.yaml
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/resources/org/apache/tinkerpop/gremlin/groovy/jsr223/sandbox-empty-static-variable-types.yaml b/gremlin-groovy-test/src/main/resources/org/apache/tinkerpop/gremlin/groovy/jsr223/sandbox-empty-static-variable-types.yaml
new file mode 100644
index 0000000..8fe108e
--- /dev/null
+++ b/gremlin-groovy-test/src/main/resources/org/apache/tinkerpop/gremlin/groovy/jsr223/sandbox-empty-static-variable-types.yaml
@@ -0,0 +1,56 @@
+# 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.
+
+# This is an example configuration for the FileSandboxExtension.
+
+autoTypeUnknown: true
+methodWhiteList:
+ - java\.lang\.Boolean.*
+ - java\.lang\.Byte.*
+ - java\.lang\.Character.*
+ - java\.lang\.Double.*
+ - java\.lang\.Enum.*
+ - java\.lang\.Float.*
+ - java\.lang\.Integer.*
+ - java\.lang\.Long.*
+ - java\.lang\.Math.*
+ - java\.lang\.Number.*
+ - java\.lang\.Object.*
+ - java\.lang\.Short.*
+ - java\.lang\.String.*
+ - java\.lang\.StringBuffer.*
+ - java\.lang\.System#currentTimeMillis\(\)
+ - java\.lang\.System#nanoTime\(\)
+ - java\.lang\.Throwable.*
+ - java\.lang\.Void.*
+ - java\.util\..*
+ - org\.codehaus\.groovy\.runtime\.DefaultGroovyMethods.*
+ - org\.codehaus\.groovy\.runtime\.InvokerHelper#runScript\(java\.lang\.Class,java\.lang\.String\[\]\)
+ - org\.codehaus\.groovy\.runtime\.StringGroovyMethods.*
+ - groovy\.lang\.Script#<init>\(groovy.lang.Binding\)
+ - org\.apache\.tinkerpop\.gremlin\.structure\..*
+ - org\.apache\.tinkerpop\.gremlin\.process\..*
+ - org\.apache\.tinkerpop\.gremlin\.process\.computer\..*
+ - org\.apache\.tinkerpop\.gremlin\.process\.computer\.bulkloading\..*
+ - org\.apache\.tinkerpop\.gremlin\.process\.computer\.clustering\.peerpressure\.*
+ - org\.apache\.tinkerpop\.gremlin\.process\.computer\.ranking\.pagerank\.*
+ - org\.apache\.tinkerpop\.gremlin\.process\.computer\.traversal\..*
+ - org\.apache\.tinkerpop\.gremlin\.process\.traversal\..*
+ - org\.apache\.tinkerpop\.gremlin\.process\.traversal\.dsl\.graph\..*
+ - org\.apache\.tinkerpop\.gremlin\.process\.traversal\.engine\..*
+ - org\.apache\.tinkerpop\.gremlin\.server\.util\.LifeCycleHook.*
+staticVariableTypes:
[25/25] tinkerpop git commit: TINKERPOP-786 Removed some commented
out config in the pom.xml
Posted by sp...@apache.org.
TINKERPOP-786 Removed some commented out config in the pom.xml
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/8d82fd7b
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/8d82fd7b
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/8d82fd7b
Branch: refs/heads/TINKERPOP-786
Commit: 8d82fd7b180f04d433ae6213143946702fb4ed36
Parents: 4e7019b
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sat Apr 29 06:57:46 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:42 2017 -0400
----------------------------------------------------------------------
gremlin-core/pom.xml | 14 --------------
1 file changed, 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8d82fd7b/gremlin-core/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-core/pom.xml b/gremlin-core/pom.xml
index 0efadfa..f3bff75 100644
--- a/gremlin-core/pom.xml
+++ b/gremlin-core/pom.xml
@@ -107,20 +107,6 @@ limitations under the License.
<version>0.10</version>
<scope>test</scope>
</dependency>
- <!--
- <dependency>
- <groupId>com.google.truth</groupId>
- <artifactId>truth</artifactId>
- <version>0.25</version>
- <exclusions>
- truth comes in through compile-testing and has a self-conflict - produces further conflict with hadoop-gremlin
- <exclusion>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
--->
</dependencies>
<build>
<directory>${basedir}/target</directory>
[12/25] tinkerpop git commit: Merge branch 'tp31' into tp32
Posted by sp...@apache.org.
Merge branch 'tp31' into tp32
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/cac7f6f9
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/cac7f6f9
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/cac7f6f9
Branch: refs/heads/TINKERPOP-786
Commit: cac7f6f91de8a92d25e96a01a24d48801d37bacd
Parents: 60ad862 b5c978c
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed May 3 07:55:26 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 07:55:26 2017 -0400
----------------------------------------------------------------------
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/cac7f6f9/pom.xml
----------------------------------------------------------------------
[16/25] tinkerpop git commit: TINKERPOP-786 Worked in custom
GraphTraversalSource into DSL
Posted by sp...@apache.org.
TINKERPOP-786 Worked in custom GraphTraversalSource into DSL
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/97a7039e
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/97a7039e
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/97a7039e
Branch: refs/heads/TINKERPOP-786
Commit: 97a7039ec9ddff03fff2f979b900c3e4dbc5227b
Parents: 01734ba
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Apr 28 14:58:52 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../src/main/java/SocialTraversalDsl.java | 2 +-
.../src/main/java/SocialTraversalSourceDsl.java | 51 ++++++++++++
.../src/test/java/SocialDslTest.java | 6 ++
.../process/traversal/dsl/GremlinDsl.java | 6 ++
.../traversal/dsl/GremlinDslProcessor.java | 87 ++++++++++++++++----
.../traversal/util/DefaultTraversal.java | 5 ++
.../traversal/dsl/GremlinDslProcessorTest.java | 8 ++
.../dsl/SocialPackageTraversalSourceDsl.java | 54 ++++++++++++
.../traversal/dsl/SocialMoveTraversalDsl.java | 2 +-
.../dsl/SocialPackageTraversalDsl.java | 37 +++++++++
.../traversal/dsl/SocialTraversalDsl.java | 2 +-
11 files changed, 242 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
index fb2a3f6..add44aa 100644
--- a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
@@ -23,7 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Vertex;
-@GremlinDsl
+@GremlinDsl(traversalSource = "${package}.SocialTraversalSourceDsl")
public interface SocialTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
public default GraphTraversal<S, Vertex> knows(final String personName) {
return out("knows").hasLabel("person").has("name", personName);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalSourceDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalSourceDsl.java b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalSourceDsl.java
new file mode 100644
index 0000000..0117914
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalSourceDsl.java
@@ -0,0 +1,51 @@
+/*
+ * 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 ${package};
+
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+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.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+public class SocialTraversalSourceDsl extends GraphTraversalSource {
+
+ public SocialTraversalSourceDsl(final Graph graph, final TraversalStrategies traversalStrategies) {
+ super(graph, traversalStrategies);
+ }
+
+ public SocialTraversalSourceDsl(final Graph graph) {
+ super(graph);
+ }
+
+ public GraphTraversal<Vertex, Vertex> persons() {
+ final GraphTraversalSource clone = this.clone();
+ clone.getBytecode().addStep(GraphTraversal.Symbols.V);
+ clone.getBytecode().addStep(GraphTraversal.Symbols.hasLabel, "person");
+ final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(clone);
+ return TraversalHelper.addHasContainer(traversal.addStep(new GraphStep<>(traversal, Vertex.class, true)), new HasContainer(T.label.getAccessor(), P.eq("person")));
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java
index ddd584c..be73500 100644
--- a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java
@@ -43,4 +43,10 @@ public class SocialDslTest {
SocialTraversalSource social = graph.traversal(SocialTraversalSource.class);
assertEquals(27, social.V().has("name","marko").youngestFriendsAge().next().intValue());
}
+
+ @Test
+ public void shouldFindAllPersons() {
+ SocialTraversalSource social = graph.traversal(SocialTraversalSource.class);
+ assertEquals(4, social.persons().count().next().intValue());
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
index cbeb5ba..d08736e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.dsl;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -39,4 +40,9 @@ public @interface GremlinDsl {
* it will default to the same package as the class or interface the annotation is on.
*/
public String packageName() default "";
+
+ /**
+ * Defines the optional canonical name of the {@link GraphTraversalSource} that this DSL should extend from.
+ */
+ public String traversalSource() default "org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource";
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index c2c4fc7..6a09ef5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -111,7 +111,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
}
private void generateTraversalSource(final Context ctx) throws IOException {
- final TypeElement graphTraversalSourceElement = elementUtils.getTypeElement(GraphTraversalSource.class.getCanonicalName());
+ final TypeElement graphTraversalSourceElement = ctx.traversalSourceDslType;
final TypeSpec.Builder traversalSourceClass = TypeSpec.classBuilder(ctx.traversalSourceClazz)
.addModifiers(Modifier.PUBLIC)
.superclass(TypeName.get(graphTraversalSourceElement.asType()));
@@ -129,22 +129,58 @@ public class GremlinDslProcessor extends AbstractProcessor {
.addStatement("super($N, $N)", "graph", "strategies")
.build());
- // override methods to return a the DSL TraversalSource
- for (Element elementOfGraphTraversal : graphTraversalSourceElement.getEnclosedElements()) {
+ // override methods to return a the DSL TraversalSource. find GraphTraversalSource class somewhere in the hierarchy
+ final Element tinkerPopsGraphTraversalSource = findTinkerPopsGraphTraversalSource(graphTraversalSourceElement);
+ for (Element elementOfGraphTraversalSource : tinkerPopsGraphTraversalSource.getEnclosedElements()) {
// first copy/override methods that return a GraphTraversalSource so that we can instead return
// the DSL TraversalSource class.
- tryConstructMethod(elementOfGraphTraversal, ctx.traversalSourceClassName, "",
+ tryConstructMethod(elementOfGraphTraversalSource, ctx.traversalSourceClassName, "",
e -> !(e.getReturnType().getKind() == TypeKind.DECLARED && ((DeclaredType) e.getReturnType()).asElement().getSimpleName().contentEquals(GraphTraversalSource.class.getSimpleName())),
Modifier.PUBLIC)
.ifPresent(traversalSourceClass::addMethod);
}
+ // override methods that return GraphTraversal that come from the user defined extension of GraphTraversal
+ if (!graphTraversalSourceElement.getSimpleName().contentEquals(GraphTraversalSource.class.getSimpleName())) {
+ for (Element elementOfGraphTraversalSource : graphTraversalSourceElement.getEnclosedElements()) {
+ if (elementOfGraphTraversalSource.getKind() != ElementKind.METHOD) continue;
+
+ final ExecutableElement templateMethod = (ExecutableElement) elementOfGraphTraversalSource;
+ final MethodSpec.Builder methodToAdd = MethodSpec.methodBuilder(elementOfGraphTraversalSource.getSimpleName().toString())
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class);
+
+ boolean added = false;
+ final List<? extends VariableElement> parameters = templateMethod.getParameters();
+ String body = "return new " + ctx.defaultTraversalClassName + "(clone, super." + elementOfGraphTraversalSource.getSimpleName().toString() + "(";
+ for (VariableElement param : parameters) {
+ methodToAdd.addParameter(ParameterSpec.get(param));
+
+ body = body + param.getSimpleName() + ",";
+ added = true;
+ }
+
+ // treat a final array as a varargs param
+ if (!parameters.isEmpty() && parameters.get(parameters.size() - 1).asType().getKind() == TypeKind.ARRAY)
+ methodToAdd.varargs(true);
+
+ if (added) body = body.substring(0, body.length() - 1);
+
+ body = body + ").asAdmin())";
+ methodToAdd.addStatement("$T clone = this.clone()", ctx.traversalSourceClassName)
+ .addStatement(body)
+ .returns(getReturnTypeDefinition(ctx.traversalClassName, templateMethod));
+
+ traversalSourceClass.addMethod(methodToAdd.build());
+ }
+ }
+
// override methods that return GraphTraversal
traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.addV)", GraphTraversal.Symbols.class)
+ .addStatement("clone.getBytecode().addStep($T.addV)", GraphTraversal.Symbols.class)
.addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
.addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", ctx.traversalClassName, AddVertexStartStep.class)
.returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
@@ -154,7 +190,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
.addAnnotation(Override.class)
.addParameter(String.class, "label")
.addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.addV, label)", GraphTraversal.Symbols.class)
+ .addStatement("clone.getBytecode().addStep($T.addV, label)", GraphTraversal.Symbols.class)
.addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
.addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", ctx.traversalClassName, AddVertexStartStep.class)
.returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
@@ -165,7 +201,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
.addParameter(Object[].class, "vertexIds")
.varargs(true)
.addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
+ .addStatement("clone.getBytecode().addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
.addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
.addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", ctx.traversalClassName, GraphStep.class, Vertex.class)
.returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
@@ -176,7 +212,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
.addParameter(Object[].class, "edgeIds")
.varargs(true)
.addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
+ .addStatement("clone.getBytecode().addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
.addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
.addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", ctx.traversalClassName, GraphStep.class, Edge.class)
.returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
@@ -186,6 +222,15 @@ public class GremlinDslProcessor extends AbstractProcessor {
traversalSourceJavaFile.writeTo(filer);
}
+ private Element findTinkerPopsGraphTraversalSource(final Element element) {
+ if (element.getSimpleName().contentEquals(GraphTraversalSource.class.getSimpleName())) {
+ return element;
+ }
+
+ final List<? extends TypeMirror> supertypes = typeUtils.directSupertypes(element.asType());
+ return findTinkerPopsGraphTraversalSource(typeUtils.asElement(supertypes.get(0)));
+ }
+
private void generateDefaultTraversal(final Context ctx) throws IOException {
final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(ctx.defaultTraversalClazz)
.addModifiers(Modifier.PUBLIC)
@@ -208,6 +253,12 @@ public class GremlinDslProcessor extends AbstractProcessor {
.addParameter(ctx.traversalSourceClassName, "traversalSource")
.addStatement("super($N)", "traversalSource")
.build());
+ defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(ctx.traversalSourceClassName, "traversalSource")
+ .addParameter(ctx.graphTraversalAdminClassName, "traversal")
+ .addStatement("super($N, $N.asAdmin())", "traversalSource", "traversal")
+ .build());
// add the override
defaultTraversalClass.addMethod(MethodSpec.methodBuilder("iterate")
@@ -277,13 +328,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
if (ignore != null && ignore.test(templateMethod)) return Optional.empty();
- final DeclaredType returnTypeMirror = (DeclaredType) templateMethod.getReturnType();
- final List<? extends TypeMirror> returnTypeArguments = returnTypeMirror.getTypeArguments();
-
- // build a return type with appropriate generic declarations (if such declarations are present)
- final TypeName returnType = returnTypeArguments.isEmpty() ?
- returnClazz :
- ParameterizedTypeName.get(returnClazz, returnTypeArguments.stream().map(TypeName::get).collect(Collectors.toList()).toArray(new TypeName[returnTypeArguments.size()]));
+ final TypeName returnType = getReturnTypeDefinition(returnClazz, templateMethod);
final MethodSpec.Builder methodToAdd = MethodSpec.methodBuilder(methodName)
.addModifiers(modifiers)
.addAnnotation(Override.class)
@@ -315,6 +360,16 @@ public class GremlinDslProcessor extends AbstractProcessor {
return Optional.of(methodToAdd.build());
}
+ private TypeName getReturnTypeDefinition(final ClassName returnClazz, final ExecutableElement templateMethod) {
+ final DeclaredType returnTypeMirror = (DeclaredType) templateMethod.getReturnType();
+ final List<? extends TypeMirror> returnTypeArguments = returnTypeMirror.getTypeArguments();
+
+ // build a return type with appropriate generic declarations (if such declarations are present)
+ return returnTypeArguments.isEmpty() ?
+ returnClazz :
+ ParameterizedTypeName.get(returnClazz, returnTypeArguments.stream().map(TypeName::get).collect(Collectors.toList()).toArray(new TypeName[returnTypeArguments.size()]));
+ }
+
private void validateDSL(final Element dslElement) throws ProcessorException {
if (dslElement.getKind() != ElementKind.INTERFACE)
throw new ProcessorException(dslElement, "Only interfaces can be annotated with @%s", GremlinDsl.class.getSimpleName());
@@ -335,6 +390,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
private final String defaultTraversalClazz;
private final ClassName defaultTraversalClassName;
private final ClassName graphTraversalAdminClassName;
+ private final TypeElement traversalSourceDslType;
public Context(final TypeElement dslElement) {
annotatedDslType = dslElement;
@@ -342,6 +398,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
// gets the annotation on the dsl class/interface
GremlinDsl gremlinDslAnnotation = dslElement.getAnnotation(GremlinDsl.class);
+ traversalSourceDslType = elementUtils.getTypeElement(gremlinDslAnnotation.traversalSource());
packageName = getPackageName(dslElement, gremlinDslAnnotation);
// create the Traversal implementation interface
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
index c8f4b24..5a65006 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
@@ -79,6 +79,11 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
this(traversalSource.getGraph(), traversalSource.getStrategies(), traversalSource.getBytecode());
}
+ public DefaultTraversal(final TraversalSource traversalSource, final DefaultTraversal.Admin<S,E> traversal) {
+ this(traversalSource.getGraph(), traversalSource.getStrategies(), traversal.getBytecode());
+ steps.addAll(traversal.getSteps());
+ }
+
// TODO: clean up unused or redundant constructors
public DefaultTraversal() {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
index d1e976d..d0d7d6f 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
@@ -48,4 +48,12 @@ public class GremlinDslProcessorTest {
.and()
.generatesFileNamed(StandardLocation.SOURCE_OUTPUT, "org.apache.tinkerpop.gremlin.process.traversal.dsl.social", "SocialMoveTraversal.java");
}
+
+ @Test
+ public void shouldCompileTraversalAndTraversalSourceToDefaultPackage() {
+ ASSERT.about(javaSource())
+ .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialPackageTraversalDsl.java")))
+ .processedWith(new GremlinDslProcessor())
+ .compilesWithoutError();
+ }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java
new file mode 100644
index 0000000..143a5c9
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalSourceDsl.java
@@ -0,0 +1,54 @@
+/*
+ * 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.process.traversal.dsl;
+
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+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.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class SocialPackageTraversalSourceDsl extends GraphTraversalSource {
+
+ public SocialPackageTraversalSourceDsl(final Graph graph, final TraversalStrategies traversalStrategies) {
+ super(graph, traversalStrategies);
+ }
+
+ public SocialPackageTraversalSourceDsl(final Graph graph) {
+ super(graph);
+ }
+
+ public GraphTraversal<Vertex, Vertex> persons() {
+ final GraphTraversalSource clone = this.clone();
+ clone.getBytecode().addStep(GraphTraversal.Symbols.V);
+ clone.getBytecode().addStep(GraphTraversal.Symbols.hasLabel, "person");
+ final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(clone);
+ return TraversalHelper.addHasContainer(traversal.addStep(new GraphStep<>(traversal, Vertex.class, true)), new HasContainer(T.label.getAccessor(), P.eq("person")));
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
index 1ef5ca8..bb27a9e 100644
--- a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.gremlin.util.dsl;
+package org.apache.tinkerpop.gremlin.process.traversal.dsl;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java
new file mode 100644
index 0000000..f472932
--- /dev/null
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialPackageTraversalDsl.java
@@ -0,0 +1,37 @@
+/*
+ * 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.process.traversal.dsl;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+@GremlinDsl(traversalSource = "org.apache.tinkerpop.gremlin.process.traversal.dsl.SocialPackageTraversalSourceDsl")
+public interface SocialPackageTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
+ public default GraphTraversal<S, Vertex> knows(final String personName) {
+ return out("knows").hasLabel("person").has("name", personName);
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
+ return out("knows").hasLabel("person").values("age").mean();
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/97a7039e/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
index c3c40a3..4c31330 100644
--- a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.gremlin.util.dsl;
+package org.apache.tinkerpop.gremlin.process.traversal.dsl;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
[17/25] tinkerpop git commit: TINKERPOP-786 Allow the package name of
the dsl to change
Posted by sp...@apache.org.
TINKERPOP-786 Allow the package name of the dsl to change
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c217ae02
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c217ae02
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c217ae02
Branch: refs/heads/TINKERPOP-786
Commit: c217ae02a2515c2ca0d5eb35f295cc785a4ab879
Parents: d653e4c
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 14:02:32 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../process/traversal/dsl/GremlinDsl.java | 6 +++
.../traversal/dsl/GremlinDslProcessor.java | 11 ++++-
.../traversal/dsl/GremlinDslProcessorTest.java | 14 ++++++-
.../traversal/dsl/SocialMoveTraversalDsl.java | 43 ++++++++++++++++++++
4 files changed, 72 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c217ae02/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
index 370ad9b..cbeb5ba 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
@@ -33,4 +33,10 @@ import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface GremlinDsl {
+
+ /**
+ * The default package name in which to generate the DSL. If this value is left unset or set to an empty string,
+ * it will default to the same package as the class or interface the annotation is on.
+ */
+ public String packageName() default "";
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c217ae02/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index d2bcc65..f2c89e7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -91,8 +91,11 @@ public class GremlinDslProcessor extends AbstractProcessor {
for (Element dslElement : roundEnv.getElementsAnnotatedWith(GremlinDsl.class)) {
validateDSL(dslElement);
+ // gets the annotation on the dsl class/interface
+ GremlinDsl gremlinDslAnnotation = dslElement.getAnnotation(GremlinDsl.class);
+
final TypeElement annotatedDslType = (TypeElement) dslElement;
- final String packageName = elementUtils.getPackageOf(dslElement).getQualifiedName().toString();
+ final String packageName = getPackageName(dslElement, gremlinDslAnnotation);
// create the Traversal implementation interface
final String dslName = dslElement.getSimpleName().toString();
@@ -260,6 +263,12 @@ public class GremlinDslProcessor extends AbstractProcessor {
return true;
}
+ private String getPackageName(final Element dslElement, final GremlinDsl gremlinDslAnnotation) {
+ return gremlinDslAnnotation.packageName().isEmpty() ?
+ elementUtils.getPackageOf(dslElement).getQualifiedName().toString() :
+ gremlinDslAnnotation.packageName();
+ }
+
private Optional<MethodSpec> tryConstructMethod(final Element element, final ClassName returnClazz, final String parent,
final Predicate<ExecutableElement> ignore, final Modifier... modifiers) {
if (element.getKind() != ElementKind.METHOD) return Optional.empty();
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c217ae02/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
index c3c62cd..d1e976d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
@@ -21,6 +21,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.dsl;
import com.google.testing.compile.JavaFileObjects;
import org.junit.Test;
+import javax.tools.StandardLocation;
+
import static com.google.common.truth.Truth.ASSERT;
import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
@@ -30,10 +32,20 @@ import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
public class GremlinDslProcessorTest {
@Test
- public void shouldCompile() {
+ public void shouldCompileToDefaultPackage() {
ASSERT.about(javaSource())
.that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialTraversalDsl.java")))
.processedWith(new GremlinDslProcessor())
.compilesWithoutError();
}
+
+ @Test
+ public void shouldCompileAndMovePackage() {
+ ASSERT.about(javaSource())
+ .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialMoveTraversalDsl.java")))
+ .processedWith(new GremlinDslProcessor())
+ .compilesWithoutError()
+ .and()
+ .generatesFileNamed(StandardLocation.SOURCE_OUTPUT, "org.apache.tinkerpop.gremlin.process.traversal.dsl.social", "SocialMoveTraversal.java");
+ }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c217ae02/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
new file mode 100644
index 0000000..1392e30
--- /dev/null
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
@@ -0,0 +1,43 @@
+/*
+ * 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.util.dsl;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+@GremlinDsl(packageName = "org.apache.tinkerpop.gremlin.process.traversal.dsl.social")
+public interface SocialMoveTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
+ public default GraphTraversal<S, Vertex> knows(final String personName) {
+ return out("knows").hasLabel("person").has("name", personName);
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
+ return out("knows").hasLabel("person").properties("age").mean();
+ }
+
+ @Override
+ public default GraphTraversal<S, E> iterate() {
+ GraphTraversal.Admin.super.iterate();
+ return this;
+ }
+}
[10/25] tinkerpop git commit: Merge branch 'tp31' into tp32
Posted by sp...@apache.org.
Merge branch 'tp31' into tp32
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/60ad862e
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/60ad862e
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/60ad862e
Branch: refs/heads/TINKERPOP-786
Commit: 60ad862ee5a341e400d279a03e3818812fcad2a5
Parents: 1f1faf4 c2a10da
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 13:23:18 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Apr 27 13:23:18 2017 -0400
----------------------------------------------------------------------
.travis.yml | 1 -
1 file changed, 1 deletion(-)
----------------------------------------------------------------------
[09/25] tinkerpop git commit: Removed myself from notifications - no
likey
Posted by sp...@apache.org.
Removed myself from notifications - no likey
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c2a10da7
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c2a10da7
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c2a10da7
Branch: refs/heads/TINKERPOP-786
Commit: c2a10da786ba9407bbb737d3e15f4e95e8eff072
Parents: f72901c
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 13:22:29 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Apr 27 13:22:29 2017 -0400
----------------------------------------------------------------------
.travis.yml | 1 -
1 file changed, 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c2a10da7/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index 9606c87..4f9af05 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,7 +14,6 @@ script:
notifications:
email:
recipients:
- - spmallette@gmail.com
- me@gremlin.guru
- robdale@gmail.com
on_success: change # default: change
[06/25] tinkerpop git commit: Merge branch 'TINKERPOP-1666' into tp32
Posted by sp...@apache.org.
Merge branch 'TINKERPOP-1666' into tp32
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/ea2ea711
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/ea2ea711
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/ea2ea711
Branch: refs/heads/TINKERPOP-786
Commit: ea2ea7116f2d407619e8c5beee7201877fd423c3
Parents: a4e6015 c423d10
Author: Robert Dale <ro...@gmail.com>
Authored: Tue Apr 25 22:19:41 2017 -0400
Committer: Robert Dale <ro...@gmail.com>
Committed: Tue Apr 25 22:19:41 2017 -0400
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
...remlinGroovyScriptEngineFileSandboxTest.java | 12 +++++
.../sandbox-empty-static-variable-types.yaml | 56 ++++++++++++++++++++
.../customizer/AbstractSandboxExtension.groovy | 4 +-
.../customizer/FileSandboxExtension.groovy | 16 +++---
5 files changed, 81 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ea2ea711/CHANGELOG.asciidoc
----------------------------------------------------------------------
[13/25] tinkerpop git commit: TINKERPOP-786 Bumped to 0.10 of google
compile-test
Posted by sp...@apache.org.
TINKERPOP-786 Bumped to 0.10 of google compile-test
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/4e7019b6
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/4e7019b6
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/4e7019b6
Branch: refs/heads/TINKERPOP-786
Commit: 4e7019b674140791655b35f454a4bf4dc409a609
Parents: 1d7187b
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sat Apr 29 06:53:15 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
gremlin-core/pom.xml | 6 ++-
.../traversal/dsl/GremlinDslProcessorTest.java | 41 ++++++++++----------
2 files changed, 25 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4e7019b6/gremlin-core/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-core/pom.xml b/gremlin-core/pom.xml
index 989bf83..0efadfa 100644
--- a/gremlin-core/pom.xml
+++ b/gremlin-core/pom.xml
@@ -104,21 +104,23 @@ limitations under the License.
<dependency>
<groupId>com.google.testing.compile</groupId>
<artifactId>compile-testing</artifactId>
- <version>0.8</version>
+ <version>0.10</version>
<scope>test</scope>
</dependency>
+ <!--
<dependency>
<groupId>com.google.truth</groupId>
<artifactId>truth</artifactId>
<version>0.25</version>
<exclusions>
- <!-- truth comes in through compile-testing and has a self-conflict - produces further conflict with hadoop-gremlin -->
+ truth comes in through compile-testing and has a self-conflict - produces further conflict with hadoop-gremlin
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
+-->
</dependencies>
<build>
<directory>${basedir}/target</directory>
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4e7019b6/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
index 982ec5b..5df010d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
@@ -18,13 +18,14 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.dsl;
+import com.google.testing.compile.Compilation;
import com.google.testing.compile.JavaFileObjects;
import org.junit.Test;
import javax.tools.StandardLocation;
-import static com.google.common.truth.Truth.ASSERT;
-import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
+import static com.google.testing.compile.CompilationSubject.assertThat;
+import static com.google.testing.compile.Compiler.javac;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
@@ -33,35 +34,35 @@ public class GremlinDslProcessorTest {
@Test
public void shouldCompileToDefaultPackage() {
- ASSERT.about(javaSource())
- .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialTraversalDsl.java")))
- .processedWith(new GremlinDslProcessor())
- .compilesWithoutError();
+ Compilation compilation = javac()
+ .withProcessors(new GremlinDslProcessor())
+ .compile(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialTraversalDsl.java")));
+ assertThat(compilation).succeededWithoutWarnings();
}
@Test
public void shouldCompileAndMovePackage() {
- ASSERT.about(javaSource())
- .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialMoveTraversalDsl.java")))
- .processedWith(new GremlinDslProcessor())
- .compilesWithoutError()
- .and()
- .generatesFileNamed(StandardLocation.SOURCE_OUTPUT, "org.apache.tinkerpop.gremlin.process.traversal.dsl.social", "SocialMoveTraversal.java");
+ Compilation compilation = javac()
+ .withProcessors(new GremlinDslProcessor())
+ .compile(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialMoveTraversalDsl.java")));
+ assertThat(compilation).succeededWithoutWarnings();
+ assertThat(compilation)
+ .generatedFile(StandardLocation.SOURCE_OUTPUT, "org.apache.tinkerpop.gremlin.process.traversal.dsl.social", "SocialMoveTraversal.java");
}
@Test
public void shouldCompileTraversalAndTraversalSourceToDefaultPackage() {
- ASSERT.about(javaSource())
- .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialPackageTraversalDsl.java")))
- .processedWith(new GremlinDslProcessor())
- .compilesWithoutError();
+ Compilation compilation = javac()
+ .withProcessors(new GremlinDslProcessor())
+ .compile(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialPackageTraversalDsl.java")));
+ assertThat(compilation).succeededWithoutWarnings();
}
@Test
public void shouldCompileWithNoDefaultMethods() {
- ASSERT.about(javaSource())
- .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialNoDefaultMethodsTraversalDsl.java")))
- .processedWith(new GremlinDslProcessor())
- .compilesWithoutError();
+ Compilation compilation = javac()
+ .withProcessors(new GremlinDslProcessor())
+ .compile(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialNoDefaultMethodsTraversalDsl.java")));
+ assertThat(compilation).succeededWithoutWarnings();
}
}
[22/25] tinkerpop git commit: TINKERPOP-786 Refactored settings
extraction for DSL generation
Posted by sp...@apache.org.
TINKERPOP-786 Refactored settings extraction for DSL generation
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/1052b3b6
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/1052b3b6
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/1052b3b6
Branch: refs/heads/TINKERPOP-786
Commit: 1052b3b6e74361b70dc9078d5c54f5cfe034a488
Parents: c217ae0
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 14:52:07 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../traversal/dsl/GremlinDslProcessor.java | 125 ++++++++++---------
1 file changed, 69 insertions(+), 56 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1052b3b6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index f2c89e7..d96ae01 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -26,7 +26,6 @@ import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;
import com.squareup.javapoet.TypeVariableName;
-import jdk.nashorn.internal.codegen.types.Type;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
@@ -50,7 +49,6 @@ import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
-import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
@@ -90,55 +88,40 @@ public class GremlinDslProcessor extends AbstractProcessor {
try {
for (Element dslElement : roundEnv.getElementsAnnotatedWith(GremlinDsl.class)) {
validateDSL(dslElement);
-
- // gets the annotation on the dsl class/interface
- GremlinDsl gremlinDslAnnotation = dslElement.getAnnotation(GremlinDsl.class);
-
final TypeElement annotatedDslType = (TypeElement) dslElement;
- final String packageName = getPackageName(dslElement, gremlinDslAnnotation);
-
- // create the Traversal implementation interface
- final String dslName = dslElement.getSimpleName().toString();
- final String dslPrefix = dslName.substring(0, dslName.length() - "TraversalDSL".length()); // chop off "TraversalDSL"
- final String traversalClazz = dslPrefix + "Traversal";
- final ClassName traversalClassName = ClassName.get(packageName, traversalClazz);
- final String traversalSourceClazz = dslPrefix + "TraversalSource";
- final ClassName traversalSourceClassName = ClassName.get(packageName, traversalSourceClazz);
- final String defaultTraversalClazz = "Default" + traversalClazz;
- final ClassName defaultTraversalClassName = ClassName.get(packageName, defaultTraversalClazz);
- final ClassName graphTraversalAdminClassName = ClassName.get(GraphTraversal.Admin.class);
+ final Context ctx = new Context(annotatedDslType);
// START write "Traversal" class
- final TypeSpec.Builder traversalInterface = TypeSpec.interfaceBuilder(traversalClazz)
+ final TypeSpec.Builder traversalInterface = TypeSpec.interfaceBuilder(ctx.traversalClazz)
.addModifiers(Modifier.PUBLIC)
.addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
.addSuperinterface(TypeName.get(dslElement.asType()));
// process the methods of the GremlinDsl annotated class
for (Element elementOfDsl : annotatedDslType.getEnclosedElements()) {
- tryConstructMethod(elementOfDsl, traversalClassName, dslName, null,
+ tryConstructMethod(elementOfDsl, ctx.traversalClassName, ctx.dslName, null,
Modifier.PUBLIC, Modifier.DEFAULT).ifPresent(traversalInterface::addMethod);
}
// process the methods of GraphTraversal
final TypeElement graphTraversalElement = elementUtils.getTypeElement(GraphTraversal.class.getCanonicalName());
for (Element elementOfGraphTraversal : graphTraversalElement.getEnclosedElements()) {
- tryConstructMethod(elementOfGraphTraversal, traversalClassName, dslName,
+ tryConstructMethod(elementOfGraphTraversal, ctx.traversalClassName, ctx.dslName,
e -> e.getSimpleName().contentEquals("asAdmin") || e.getSimpleName().contentEquals("iterate"),
Modifier.PUBLIC, Modifier.DEFAULT)
.ifPresent(traversalInterface::addMethod);
}
- final JavaFile traversalJavaFile = JavaFile.builder(packageName, traversalInterface.build()).build();
+ final JavaFile traversalJavaFile = JavaFile.builder(ctx.packageName, traversalInterface.build()).build();
traversalJavaFile.writeTo(filer);
// END write "Traversal" class
// START write of the "DefaultTraversal" class
- final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(defaultTraversalClazz)
+ final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(ctx.defaultTraversalClazz)
.addModifiers(Modifier.PUBLIC)
.addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
.superclass(TypeName.get(elementUtils.getTypeElement(DefaultTraversal.class.getCanonicalName()).asType()))
- .addSuperinterface(ParameterizedTypeName.get(traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")));
+ .addSuperinterface(ParameterizedTypeName.get(ctx.traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")));
// add the required constructors for instantiation
defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
@@ -152,7 +135,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
.build());
defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
.addModifiers(Modifier.PUBLIC)
- .addParameter(traversalSourceClassName, "traversalSource")
+ .addParameter(ctx.traversalSourceClassName, "traversalSource")
.addStatement("super($N)", "traversalSource")
.build());
@@ -160,29 +143,29 @@ public class GremlinDslProcessor extends AbstractProcessor {
defaultTraversalClass.addMethod(MethodSpec.methodBuilder("iterate")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
- .addStatement("return ($T) super.iterate()", traversalClassName)
- .returns(ParameterizedTypeName.get(traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .addStatement("return ($T) super.iterate()", ctx.traversalClassName)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
.build());
defaultTraversalClass.addMethod(MethodSpec.methodBuilder("asAdmin")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addStatement("return ($T) super.asAdmin()", GraphTraversal.Admin.class)
- .returns(ParameterizedTypeName.get(graphTraversalAdminClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .returns(ParameterizedTypeName.get(ctx.graphTraversalAdminClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
.build());
defaultTraversalClass.addMethod(MethodSpec.methodBuilder("clone")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
- .addStatement("return ($T) super.clone()", defaultTraversalClassName)
- .returns(ParameterizedTypeName.get(defaultTraversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .addStatement("return ($T) super.clone()", ctx.defaultTraversalClassName)
+ .returns(ParameterizedTypeName.get(ctx.defaultTraversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
.build());
- final JavaFile defaultTraversalJavaFile = JavaFile.builder(packageName, defaultTraversalClass.build()).build();
+ final JavaFile defaultTraversalJavaFile = JavaFile.builder(ctx.packageName, defaultTraversalClass.build()).build();
defaultTraversalJavaFile.writeTo(filer);
// END write of the "DefaultTraversal" class
// START write "TraversalSource" class
final TypeElement graphTraversalSourceElement = elementUtils.getTypeElement(GraphTraversalSource.class.getCanonicalName());
- final TypeSpec.Builder traversalSourceClass = TypeSpec.classBuilder(traversalSourceClazz)
+ final TypeSpec.Builder traversalSourceClass = TypeSpec.classBuilder(ctx.traversalSourceClazz)
.addModifiers(Modifier.PUBLIC)
.superclass(TypeName.get(graphTraversalSourceElement.asType()));
@@ -203,7 +186,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
for (Element elementOfGraphTraversal : graphTraversalSourceElement.getEnclosedElements()) {
// first copy/override methods that return a GraphTraversalSource so that we can instead return
// the DSL TraversalSource class.
- tryConstructMethod(elementOfGraphTraversal, traversalSourceClassName, "",
+ tryConstructMethod(elementOfGraphTraversal, ctx.traversalSourceClassName, "",
e -> !(e.getReturnType().getKind() == TypeKind.DECLARED && ((DeclaredType) e.getReturnType()).asElement().getSimpleName().contentEquals(GraphTraversalSource.class.getSimpleName())),
Modifier.PUBLIC)
.ifPresent(traversalSourceClass::addMethod);
@@ -213,46 +196,46 @@ public class GremlinDslProcessor extends AbstractProcessor {
traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
- .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
.addStatement("clone.bytecode.addStep($T.addV)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", traversalClassName, AddVertexStartStep.class)
- .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", ctx.traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
.build());
traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addParameter(String.class, "label")
- .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
.addStatement("clone.bytecode.addStep($T.addV, label)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", traversalClassName, AddVertexStartStep.class)
- .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", ctx.traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
.build());
traversalSourceClass.addMethod(MethodSpec.methodBuilder("V")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addParameter(Object[].class, "vertexIds")
.varargs(true)
- .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
.addStatement("clone.bytecode.addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", traversalClassName, GraphStep.class, Vertex.class)
- .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", ctx.traversalClassName, GraphStep.class, Vertex.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
.build());
traversalSourceClass.addMethod(MethodSpec.methodBuilder("E")
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addParameter(Object[].class, "edgeIds")
.varargs(true)
- .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
.addStatement("clone.bytecode.addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", traversalClassName, GraphStep.class, Edge.class)
- .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", ctx.traversalClassName, GraphStep.class, Edge.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
.build());
- final JavaFile traversalSourceJavaFile = JavaFile.builder(packageName, traversalSourceClass.build()).build();
+ final JavaFile traversalSourceJavaFile = JavaFile.builder(ctx.packageName, traversalSourceClass.build()).build();
traversalSourceJavaFile.writeTo(filer);
// END write "TraversalSource" class
}
@@ -263,12 +246,6 @@ public class GremlinDslProcessor extends AbstractProcessor {
return true;
}
- private String getPackageName(final Element dslElement, final GremlinDsl gremlinDslAnnotation) {
- return gremlinDslAnnotation.packageName().isEmpty() ?
- elementUtils.getPackageOf(dslElement).getQualifiedName().toString() :
- gremlinDslAnnotation.packageName();
- }
-
private Optional<MethodSpec> tryConstructMethod(final Element element, final ClassName returnClazz, final String parent,
final Predicate<ExecutableElement> ignore, final Modifier... modifiers) {
if (element.getKind() != ElementKind.METHOD) return Optional.empty();
@@ -324,4 +301,40 @@ public class GremlinDslProcessor extends AbstractProcessor {
if (!typeElement.getModifiers().contains(Modifier.PUBLIC))
throw new ProcessorException(dslElement, "The interface %s is not public.", typeElement.getQualifiedName());
}
+
+ private class Context {
+ private final String packageName;
+ private final String dslName;
+ private final String traversalClazz;
+ private final ClassName traversalClassName;
+ private final String traversalSourceClazz;
+ private final ClassName traversalSourceClassName;
+ private final String defaultTraversalClazz;
+ private final ClassName defaultTraversalClassName;
+ private final ClassName graphTraversalAdminClassName;
+
+ public Context(final TypeElement dslElement) {
+ // gets the annotation on the dsl class/interface
+ GremlinDsl gremlinDslAnnotation = dslElement.getAnnotation(GremlinDsl.class);
+
+ packageName = getPackageName(dslElement, gremlinDslAnnotation);
+
+ // create the Traversal implementation interface
+ dslName = dslElement.getSimpleName().toString();
+ final String dslPrefix = dslName.substring(0, dslName.length() - "TraversalDSL".length()); // chop off "TraversalDSL"
+ traversalClazz = dslPrefix + "Traversal";
+ traversalClassName = ClassName.get(packageName, traversalClazz);
+ traversalSourceClazz = dslPrefix + "TraversalSource";
+ traversalSourceClassName = ClassName.get(packageName, traversalSourceClazz);
+ defaultTraversalClazz = "Default" + traversalClazz;
+ defaultTraversalClassName = ClassName.get(packageName, defaultTraversalClazz);
+ graphTraversalAdminClassName = ClassName.get(GraphTraversal.Admin.class);
+ }
+
+ private String getPackageName(final Element dslElement, final GremlinDsl gremlinDslAnnotation) {
+ return gremlinDslAnnotation.packageName().isEmpty() ?
+ elementUtils.getPackageOf(dslElement).getQualifiedName().toString() :
+ gremlinDslAnnotation.packageName();
+ }
+ }
}
[07/25] tinkerpop git commit: added travis ci email notifications for
when builds break
Posted by sp...@apache.org.
added travis ci email notifications for when builds break
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f72901c2
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f72901c2
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f72901c2
Branch: refs/heads/TINKERPOP-786
Commit: f72901c223a7dde662806d8be776f823a0d1f6d3
Parents: 4d117cb
Author: Robert Dale <ro...@gmail.com>
Authored: Thu Apr 27 08:46:13 2017 -0400
Committer: Robert Dale <ro...@gmail.com>
Committed: Thu Apr 27 08:46:13 2017 -0400
----------------------------------------------------------------------
.travis.yml | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f72901c2/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index 56c729d..9606c87 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,4 +11,11 @@ addons:
- oracle-java8-installer
script:
- "mvn clean install -Dci"
-
+notifications:
+ email:
+ recipients:
+ - spmallette@gmail.com
+ - me@gremlin.guru
+ - robdale@gmail.com
+ on_success: change # default: change
+ on_failure: always # default: always
[24/25] tinkerpop git commit: TINKERPOP-786 Added a bunch of javadoc
Posted by sp...@apache.org.
TINKERPOP-786 Added a bunch of javadoc
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/8e123faa
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/8e123faa
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/8e123faa
Branch: refs/heads/TINKERPOP-786
Commit: 8e123faa48c7d79d0c03667a64240e326f8906a4
Parents: 97a7039
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Apr 28 16:07:00 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../process/traversal/dsl/GremlinDsl.java | 19 +++++++++++++++++--
.../traversal/dsl/GremlinDslProcessor.java | 2 ++
.../traversal/dsl/ProcessorException.java | 2 ++
3 files changed, 21 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8e123faa/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
index d08736e..15b93d6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
@@ -27,7 +27,21 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * An annotation that specifies that an interface is meant to be used a DSL extension to a {@link GraphTraversal}.
+ * An annotation that specifies that an interface is meant to be used to produce Gremlin DSL. This annotation should
+ * be applied to an interface that extends {@link GraphTraversal}. This interface should be suffixed with
+ * {@code TraversalDsl}. The DSL classes will be generated to the package of the annotated class or the to the value
+ * specified in the {@link #packageName()} and will use the part of the interface name up to the suffix to generate
+ * the classes. Therefore, assuming an interface, annotated with {@code GremlinDsl}, called {@code SocialTraversalDsl},
+ * there will be three classes generated:
+ *
+ * <ul>
+ * <li>{@code SocialTraversal} - an interface that is an extension to {@code SocialTraversalDsl}</li>
+ * <li>{@code DefaultSocialTraversal} - an implementation of the {@code SocialTraversal}</li>
+ * <li>{@code SocialTraversalSource} - an extension of {@link GraphTraversalSource} which spawns {@code DefaultSocialTraversal} instances</li>
+ * </ul>
+ *
+ * Together these generated classes provide all the infrastructure required to properly Gremlin traversals enhanced
+ * with domain specific steps.
*
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
@@ -42,7 +56,8 @@ public @interface GremlinDsl {
public String packageName() default "";
/**
- * Defines the optional canonical name of the {@link GraphTraversalSource} that this DSL should extend from.
+ * Defines the optional canonical name of the {@link GraphTraversalSource} that this DSL should extend from. If
+ * this value is not supplied the generated "source" will simply extend from {@link GraphTraversalSource}.
*/
public String traversalSource() default "org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource";
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8e123faa/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index 6a09ef5..9e23410 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -65,6 +65,8 @@ import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
+ * A custom Java annotation processor for the {@link GremlinDsl} annotation that helps to generate DSLs classes.
+ *
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
@SupportedAnnotationTypes("org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl")
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8e123faa/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
index c84278e..3051890 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
@@ -21,6 +21,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.dsl;
import javax.lang.model.element.Element;
/**
+ * Exception thrown by the {@link GremlinDslProcessor}.
+ *
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public class ProcessorException extends Exception {
[04/25] tinkerpop git commit: Merge branch 'tp31' into tp32
Posted by sp...@apache.org.
Merge branch 'tp31' into tp32
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/273ad2c8
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/273ad2c8
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/273ad2c8
Branch: refs/heads/TINKERPOP-786
Commit: 273ad2c8e72344c7f9db8b310577fbad82ae9fa8
Parents: db035d5 4d117cb
Author: Robert Dale <ro...@gmail.com>
Authored: Mon Apr 24 12:21:22 2017 -0400
Committer: Robert Dale <ro...@gmail.com>
Committed: Mon Apr 24 12:21:22 2017 -0400
----------------------------------------------------------------------
docs/src/dev/provider/index.asciidoc | 8 ++++----
docs/src/reference/gremlin-applications.asciidoc | 8 ++++----
docs/src/tutorials/getting-started/index.asciidoc | 4 ++--
3 files changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/273ad2c8/docs/src/dev/provider/index.asciidoc
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/273ad2c8/docs/src/reference/gremlin-applications.asciidoc
----------------------------------------------------------------------
diff --cc docs/src/reference/gremlin-applications.asciidoc
index 1ecb616,a5c162e..ce8c1b5
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@@ -929,118 -767,8 +929,118 @@@ string argument with by setting the `la
WARNING: Consider the size of the result of a submitted script being returned from the REST endpoint. A script
that iterates thousands of results will serialize each of those in memory into a single JSON result set. It is
quite possible that such a script will generate `OutOfMemoryError` exceptions on the server. Consider the default
- WebSockets configuration, which supports streaming, if that type of use case is required.
+ WebSocket configuration, which supports streaming, if that type of use case is required.
+[[connecting-via-remotegraph]]
+Connecting via withRemote
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+[source,xml]
+----
+<dependency>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-driver</artifactId>
+ <version>x.y.z</version>
+</dependency>
+----
+
+image:remote-graph.png[width=145,float=left] A `TraversalSource` has several `withRemote()` methods which provide an
+interesting alternative to the other methods for connecting to Gremlin Server. It is interesting in that all other
+methods involve construction of a `String` representation of the `Traversal` which is then submitted as a script
+to Gremlin Server (via driver or REST). This approach is quite akin to SQL, where query strings are embedded into code
+and submitted to a database server. While there are patterns for taking this approach that can lead to maintainable
+application code, using `withRemote()` could be a better method as it brings some good benefits with it:
+
+* Get auto-complete when writing traversals in an IDE.
+* Get compile-time errors in traversal writing.
+* Get the feel of working with an embedded database.
+
+One way to create a `Traversal` instance that is remote-enabled is by configuration file. Here is an example of what
+that file looks like:
+
+[source,properties]
+----
+gremlin.remote.remoteConnectionClass=org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection
+gremlin.remote.driver.clusterFile=conf/remote-objects.yaml
+gremlin.remote.driver.sourceName=g
+----
+
+The `gremlin.remote.remoteConnectionClass` should be an implementation of the `RemoteConnection` interface in
+`gremlin-core`. In this case, it points at the `gremlin-driver` implementation, called `DriverRemoteConnection`. The
+other setting, `gremlin.remote.driver.clusterFile`, is a configuration to `DriverRemoteConnection`, and it
+provides a pointer to the config file to use to construct a `gremlin-driver` `Cluster` object to be utilized when
+connecting to Gremlin Server. Please see the <<connecting-via-java, "Connecting Via Java">> section for more
+information on those classes and their usage. Finally, the `gremlin.remote.driver.sourceName` setting tells the
+`DriverRemoteConnection` the name of the `TraversalSource` in Gremlin Server to connect to.
+
+IMPORTANT: Gremlin Server supports configurable serialization options. The `withRemote()` feature works best with
+Gryo serialization. While it is compatible with GraphSON, unknown incompatibilities may arise
+
+Gremlin Server needs to be running for this example to work. Use the following configuration:
+
+[source,bourne]
+$ bin/gremlin-server.sh conf/gremlin-server-modern.yaml
+
+To configure a "remote" traversal, there first needs to be a `TraversalSource`. A `TraversalSource` can be generated
+from any `Graph` instance with the `traversal()` method. Of course, any traversals generated from this source using the
+`withRemote()` configuration option will not execute against the local graph. That could be confusing and it maybe be
+easier to think of the local graph as being "empty". To that end, it is recommended that when using `withRemote()`,
+the `TraversalSource` be generated with `EmptyGraph` as follows:
+
+[gremlin-groovy]
+----
+graph = EmptyGraph.instance()
+g = graph.traversal().withRemote('conf/remote-graph.properties')
+g.V().valueMap(true)
+g.close()
+----
+
+Note the call to `close()` above. The call to `withRemote()` internally instantiates a `Client` instance that can only
+be released by "closing" the `GraphTraversalSource`. It is important to take that step to release resources created
+in that step.
+
+If working with multiple remote `TraversalSource` instances it is more efficient to construct a `Cluster` object and
+then re-use it.
+
+[gremlin-groovy]
+----
+cluster = Cluster.open('conf/remote-objects.yaml')
+graph = EmptyGraph.instance()
+g = graph.traversal().withRemote(DriverRemoteConnection.using(cluster, "g"))
+g.V().valueMap(true)
+g.close()
+cluster.close()
+----
+
+If the `Cluster` instance is supplied externally, as is shown above, then it is not closed implicitly by the close of
+"g". Closing "g" will only close the `Client` instance associated with that `TraversalSource`. In this case, the
+`Cluster` must also be closed explicitly. Closing "g" and the "cluster" aren't actually both necessary - the close of
+a `Cluster` will close all `Client` instance spawned by the `Cluster`.
+
+IMPORTANT: `RemoteGraph` uses the `TraversalOpProcessor` in Gremlin Server which requires a cache to enable the
+retrieval of side-effects (if the `Traversal` produces any). That cache can be configured (e.g. controlling eviction
+times and sizing) can be done in the Gremlin Server configuration file as described <<traversalopprocessor, here>>.
+
+Finally, Gremlin `Bytecode` supports the encoding of bindings which allow GremlinServer to cache traversals that will
+be reused over and over again save that some parameterization may change. Thus, instead of translating, compiling, and
+then executing each submitted bytecode, it is possible to simply execute. To express bindings in Gremlin-Java and
+Gremlin-Groovy, use `Bindings`.
+
+[gremlin-groovy]
+----
+cluster = Cluster.open('conf/remote-objects.yaml')
+b = Bindings.instance()
+g = EmptyGraph.instance().traversal().withRemote(DriverRemoteConnection.using(cluster, "g"))
+g.V(b.of('id',1)).out('created').values('name')
+g.V(b.of('id',4)).out('created').values('name')
+g.V(b.of('id',4)).out('created').values('name').getBytecode()
+g.V(b.of('id',4)).out('created').values('name').getBytecode().getBindings()
+cluster.close()
+----
+
+Both traversals are abstractly defined as `g.V(id).out('created').values('name')` and thus, the first submission
+can be cached for faster evaluation on the next submission.
+
Configuring
~~~~~~~~~~~
@@@ -1072,13 -800,11 +1072,13 @@@ The following table describes the vario
[width="100%",cols="3,10,^2",options="header"]
|=========================================================
|Key |Description |Default
-|authentication.className |The fully qualified classname of an `Authenticator` implementation to use. If this setting is not present, then authentication is effectively disabled. |`AllowAllAuthenticator`
+|authentication.authenticator |The fully qualified classname of an `Authenticator` implementation to use. If this setting is not present, then authentication is effectively disabled. |`AllowAllAuthenticator`
+|authentication.authenticationHandler | The fully qualified classname of an `AbstractAuthenticationHandler` implementation to use. If this setting is not present, but the `authentication.authenticator` is, it will use that authenticator with the default `AbstractAuthenticationHandler` implementation for the specified `Channelizer` |_none_
|authentication.config |A `Map` of configuration settings to be passes to the `Authenticator` when it is constructed. The settings available are dependent on the implementation. |_none_
- |channelizer |The fully qualified classname of the `Channelizer` implementation to use. A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use. By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. Websockets, Java NIO, etc.). |`WebSocketChannelizer`
-|channelizer |The fully qualified classname of the `Channelizer` implementation to use. A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use. By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. WebSocket, Java NIO, etc.). |`WebSocketChannelizer`
++|channelizer |The fully qualified classname of the `Channelizer` implementation to use. A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use. By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. Websocket, Java NIO, etc.). |`WebSocketChannelizer`
+|graphManager |The fully qualified classname of the `GraphManager` implementation to use. A `GraphManager` is a class that adheres to the TinkerPop `GraphManager` interface, allowing custom implementations for storing and managing graph references, as well as defining custom methods to open and close graphs instantiations. It is important to note that the Tinkerpop Http and WebSocketChannelizers auto-commit and auto-rollback based on the graphs stored in the graphManager upon script execution completion. |`DefaultGraphManager`
|graphs |A `Map` of `Graph` configuration files where the key of the `Map` becomes the name to which the `Graph` will be bound and the value is the file name of a `Graph` configuration file. |_none_
-|gremlinPool |The number of "Gremlin" threads available to execute actual scripts in a `ScriptEngine`. This pool represents the workers available to handle blocking operations in Gremlin Server. |8
+|gremlinPool |The number of "Gremlin" threads available to execute actual scripts in a `ScriptEngine`. This pool represents the workers available to handle blocking operations in Gremlin Server. When set to `0`, Gremlin Server will use the value provided by `Runtime.availableProcessors()`. |0
|host |The name of the host to bind the server to. |localhost
|useEpollEventLoop |try to use epoll event loops (works only on Linux os) instead of netty NIO. |false
|maxAccumulationBufferComponents |Maximum number of request components that can be aggregated for a message. |1024
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/273ad2c8/docs/src/tutorials/getting-started/index.asciidoc
----------------------------------------------------------------------
[11/25] tinkerpop git commit: Bump to latest maven-compiler-plugin at
3.6.1 CTR
Posted by sp...@apache.org.
Bump to latest maven-compiler-plugin at 3.6.1 CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/b5c978c5
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/b5c978c5
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/b5c978c5
Branch: refs/heads/TINKERPOP-786
Commit: b5c978c5aef565c766eaf9dbe13ca4bfdba9c92c
Parents: c2a10da
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed May 3 07:53:41 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 07:53:41 2017 -0400
----------------------------------------------------------------------
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b5c978c5/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 23f31f2..1fcc681 100644
--- a/pom.xml
+++ b/pom.xml
@@ -313,7 +313,7 @@ limitations under the License.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
+ <version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
[21/25] tinkerpop git commit: TINKERPOP-786 Deleted an unused
interface
Posted by sp...@apache.org.
TINKERPOP-786 Deleted an unused interface
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f467d15e
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f467d15e
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f467d15e
Branch: refs/heads/TINKERPOP-786
Commit: f467d15ee0266dd82b33e40d251856df189b92a9
Parents: 8e123fa
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Apr 28 16:07:52 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../dsl/GremlinDslAnnotatedInterface.java | 32 --------------------
1 file changed, 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f467d15e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java
deleted file mode 100644
index 2f6db74..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java
+++ /dev/null
@@ -1,32 +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.process.traversal.dsl;
-
-import javax.lang.model.element.TypeElement;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-class GremlinDslAnnotatedInterface {
- private final TypeElement annotatedInterfaceElement;
-
- public GremlinDslAnnotatedInterface(final TypeElement interfaceElement) {
- annotatedInterfaceElement = interfaceElement;
- }
-}
[08/25] tinkerpop git commit: Merge branch 'tp31' into tp32
Posted by sp...@apache.org.
Merge branch 'tp31' into tp32
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/1f1faf4b
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/1f1faf4b
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/1f1faf4b
Branch: refs/heads/TINKERPOP-786
Commit: 1f1faf4ba4f0854bfb0d06d77e55b565bbbac6c9
Parents: ea2ea71 f72901c
Author: Robert Dale <ro...@gmail.com>
Authored: Thu Apr 27 08:46:29 2017 -0400
Committer: Robert Dale <ro...@gmail.com>
Committed: Thu Apr 27 08:46:29 2017 -0400
----------------------------------------------------------------------
.travis.yml | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
[05/25] tinkerpop git commit: minor edit CTR
Posted by sp...@apache.org.
minor edit CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/a4e60151
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a4e60151
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a4e60151
Branch: refs/heads/TINKERPOP-786
Commit: a4e6015133bc358c3d24ff3a8b1f302bc780ce38
Parents: 273ad2c
Author: Robert Dale <ro...@gmail.com>
Authored: Mon Apr 24 12:40:32 2017 -0400
Committer: Robert Dale <ro...@gmail.com>
Committed: Mon Apr 24 12:40:32 2017 -0400
----------------------------------------------------------------------
docs/src/reference/gremlin-applications.asciidoc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a4e60151/docs/src/reference/gremlin-applications.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/gremlin-applications.asciidoc b/docs/src/reference/gremlin-applications.asciidoc
index ce8c1b5..7e25585 100644
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@ -1075,7 +1075,7 @@ The following table describes the various configuration options that Gremlin Ser
|authentication.authenticator |The fully qualified classname of an `Authenticator` implementation to use. If this setting is not present, then authentication is effectively disabled. |`AllowAllAuthenticator`
|authentication.authenticationHandler | The fully qualified classname of an `AbstractAuthenticationHandler` implementation to use. If this setting is not present, but the `authentication.authenticator` is, it will use that authenticator with the default `AbstractAuthenticationHandler` implementation for the specified `Channelizer` |_none_
|authentication.config |A `Map` of configuration settings to be passes to the `Authenticator` when it is constructed. The settings available are dependent on the implementation. |_none_
-|channelizer |The fully qualified classname of the `Channelizer` implementation to use. A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use. By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. Websocket, Java NIO, etc.). |`WebSocketChannelizer`
+|channelizer |The fully qualified classname of the `Channelizer` implementation to use. A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use. By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. WebSocket, Java NIO, etc.). |`WebSocketChannelizer`
|graphManager |The fully qualified classname of the `GraphManager` implementation to use. A `GraphManager` is a class that adheres to the TinkerPop `GraphManager` interface, allowing custom implementations for storing and managing graph references, as well as defining custom methods to open and close graphs instantiations. It is important to note that the Tinkerpop Http and WebSocketChannelizers auto-commit and auto-rollback based on the graphs stored in the graphManager upon script execution completion. |`DefaultGraphManager`
|graphs |A `Map` of `Graph` configuration files where the key of the `Map` becomes the name to which the `Graph` will be bound and the value is the file name of a `Graph` configuration file. |_none_
|gremlinPool |The number of "Gremlin" threads available to execute actual scripts in a `ScriptEngine`. This pool represents the workers available to handle blocking operations in Gremlin Server. When set to `0`, Gremlin Server will use the value provided by `Runtime.availableProcessors()`. |0
[20/25] tinkerpop git commit: TINKERPOP-786 Refactored code to
extract TraversalSource generation in DSLs
Posted by sp...@apache.org.
TINKERPOP-786 Refactored code to extract TraversalSource generation in DSLs
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/8385e195
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/8385e195
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/8385e195
Branch: refs/heads/TINKERPOP-786
Commit: 8385e195fb5cf2a3af0efca2343fa9c8abde7065
Parents: 870e39d
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 15:22:32 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../traversal/dsl/GremlinDslProcessor.java | 156 ++++++++++---------
1 file changed, 80 insertions(+), 76 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8385e195/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index f9d5a40..c2c4fc7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -96,84 +96,12 @@ public class GremlinDslProcessor extends AbstractProcessor {
generateTraversalInterface(ctx);
// create the "DefaultTraversal" class which implements the above generated "Traversal" and can then
- // be used by the "TraversalSource" generated below to spawn new traversal instances
+ // be used by the "TraversalSource" generated below to spawn new traversal instances.
generateDefaultTraversal(ctx);
- // START write "TraversalSource" class
- final TypeElement graphTraversalSourceElement = elementUtils.getTypeElement(GraphTraversalSource.class.getCanonicalName());
- final TypeSpec.Builder traversalSourceClass = TypeSpec.classBuilder(ctx.traversalSourceClazz)
- .addModifiers(Modifier.PUBLIC)
- .superclass(TypeName.get(graphTraversalSourceElement.asType()));
-
- // add the required constructors for instantiation
- traversalSourceClass.addMethod(MethodSpec.constructorBuilder()
- .addModifiers(Modifier.PUBLIC)
- .addParameter(Graph.class, "graph")
- .addStatement("super($N)", "graph")
- .build());
- traversalSourceClass.addMethod(MethodSpec.constructorBuilder()
- .addModifiers(Modifier.PUBLIC)
- .addParameter(Graph.class, "graph")
- .addParameter(TraversalStrategies.class, "strategies")
- .addStatement("super($N, $N)", "graph", "strategies")
- .build());
-
- // override methods to return a the DSL TraversalSource
- for (Element elementOfGraphTraversal : graphTraversalSourceElement.getEnclosedElements()) {
- // first copy/override methods that return a GraphTraversalSource so that we can instead return
- // the DSL TraversalSource class.
- tryConstructMethod(elementOfGraphTraversal, ctx.traversalSourceClassName, "",
- e -> !(e.getReturnType().getKind() == TypeKind.DECLARED && ((DeclaredType) e.getReturnType()).asElement().getSimpleName().contentEquals(GraphTraversalSource.class.getSimpleName())),
- Modifier.PUBLIC)
- .ifPresent(traversalSourceClass::addMethod);
- }
-
- // override methods that return GraphTraversal
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.addV)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", ctx.traversalClassName, AddVertexStartStep.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
- .build());
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addParameter(String.class, "label")
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.addV, label)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", ctx.traversalClassName, AddVertexStartStep.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
- .build());
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("V")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addParameter(Object[].class, "vertexIds")
- .varargs(true)
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", ctx.traversalClassName, GraphStep.class, Vertex.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
- .build());
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("E")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addParameter(Object[].class, "edgeIds")
- .varargs(true)
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.bytecode.addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", ctx.traversalClassName, GraphStep.class, Edge.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
- .build());
-
- final JavaFile traversalSourceJavaFile = JavaFile.builder(ctx.packageName, traversalSourceClass.build()).build();
- traversalSourceJavaFile.writeTo(filer);
- // END write "TraversalSource" class
+ // create the "TraversalSource" class which is used to spawn traversals from a Graph instance. It will
+ // spawn instances of the "DefaultTraversal" generated above.
+ generateTraversalSource(ctx);
}
} catch (Exception ex) {
messager.printMessage(Diagnostic.Kind.ERROR, ex.getMessage());
@@ -182,6 +110,82 @@ public class GremlinDslProcessor extends AbstractProcessor {
return true;
}
+ private void generateTraversalSource(final Context ctx) throws IOException {
+ final TypeElement graphTraversalSourceElement = elementUtils.getTypeElement(GraphTraversalSource.class.getCanonicalName());
+ final TypeSpec.Builder traversalSourceClass = TypeSpec.classBuilder(ctx.traversalSourceClazz)
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(TypeName.get(graphTraversalSourceElement.asType()));
+
+ // add the required constructors for instantiation
+ traversalSourceClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(Graph.class, "graph")
+ .addStatement("super($N)", "graph")
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(Graph.class, "graph")
+ .addParameter(TraversalStrategies.class, "strategies")
+ .addStatement("super($N, $N)", "graph", "strategies")
+ .build());
+
+ // override methods to return a the DSL TraversalSource
+ for (Element elementOfGraphTraversal : graphTraversalSourceElement.getEnclosedElements()) {
+ // first copy/override methods that return a GraphTraversalSource so that we can instead return
+ // the DSL TraversalSource class.
+ tryConstructMethod(elementOfGraphTraversal, ctx.traversalSourceClassName, "",
+ e -> !(e.getReturnType().getKind() == TypeKind.DECLARED && ((DeclaredType) e.getReturnType()).asElement().getSimpleName().contentEquals(GraphTraversalSource.class.getSimpleName())),
+ Modifier.PUBLIC)
+ .ifPresent(traversalSourceClass::addMethod);
+ }
+
+ // override methods that return GraphTraversal
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.addV)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", ctx.traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(String.class, "label")
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.addV, label)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", ctx.traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("V")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(Object[].class, "vertexIds")
+ .varargs(true)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", ctx.traversalClassName, GraphStep.class, Vertex.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("E")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(Object[].class, "edgeIds")
+ .varargs(true)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", ctx.traversalClassName, GraphStep.class, Edge.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
+ .build());
+
+ final JavaFile traversalSourceJavaFile = JavaFile.builder(ctx.packageName, traversalSourceClass.build()).build();
+ traversalSourceJavaFile.writeTo(filer);
+ }
+
private void generateDefaultTraversal(final Context ctx) throws IOException {
final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(ctx.defaultTraversalClazz)
.addModifiers(Modifier.PUBLIC)
[14/25] tinkerpop git commit: TINKERPOP-786 Fixed gremlin syntax in
test DSL files
Posted by sp...@apache.org.
TINKERPOP-786 Fixed gremlin syntax in test DSL files
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/01734bad
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/01734bad
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/01734bad
Branch: refs/heads/TINKERPOP-786
Commit: 01734bada44e23aa16f43ebeac29c5e53f614b90
Parents: 8385e19
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 15:40:41 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java | 2 +-
.../gremlin/process/traversal/dsl/SocialTraversalDsl.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/01734bad/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
index 1db1dff..1ef5ca8 100644
--- a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
@@ -32,6 +32,6 @@ public interface SocialMoveTraversalDsl<S, E> extends GraphTraversal.Admin<S, E>
}
public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
- return out("knows").hasLabel("person").properties("age").mean();
+ return out("knows").hasLabel("person").values("age").mean();
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/01734bad/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
index fc4921f..c3c40a3 100644
--- a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
@@ -32,6 +32,6 @@ public interface SocialTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
}
public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
- return out("knows").hasLabel("person").properties("age").mean();
+ return out("knows").hasLabel("person").values("age").mean();
}
}
[02/25] tinkerpop git commit: Check if variable is null to avoid NPE
Posted by sp...@apache.org.
Check if variable is null to avoid NPE
If staticVariableTypes is an empty list in the YAML file, then we throw
an NPE by trying to run collectEntries() on a null object or trying to
run containsKey() on a null object.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/9bdef4d8
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/9bdef4d8
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/9bdef4d8
Branch: refs/heads/TINKERPOP-786
Commit: 9bdef4d86c3065b02c402a6d44dbf0329a0e2ddc
Parents: 1e349c8
Author: dpitera <dp...@us.ibm.com>
Authored: Thu Apr 6 12:16:59 2017 -0400
Committer: dpitera <dp...@us.ibm.com>
Committed: Mon Apr 17 14:31:41 2017 -0400
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../customizer/AbstractSandboxExtension.groovy | 4 ++--
.../jsr223/customizer/FileSandboxExtension.groovy | 16 ++++++++++------
3 files changed, 13 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bdef4d8/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 40819af..6923a84 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -73,6 +73,7 @@ TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET)
* Implemented `DefaultGraphManager` to include previous `GraphManager` functionality and adhere to updated interface.
* Deprecated `GraphManager.getGraphs()` and added `GraphManager.getGraphNames()`.
* Deprecated `GraphManager.getTraversalSources()` and added `GraphManager.getTraversalSourceNames()`.
+* Fixed a bug so now users can supply a YAML with an empty `staticVariableTypes` to be used by the `FileSandboxExtension`
[[release-3-2-4]]
TinkerPop 3.2.4 (Release Date: February 8, 2017)
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bdef4d8/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/AbstractSandboxExtension.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/AbstractSandboxExtension.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/AbstractSandboxExtension.groovy
index 699e250..9685607 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/AbstractSandboxExtension.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/AbstractSandboxExtension.groovy
@@ -51,7 +51,7 @@ abstract class AbstractSandboxExtension extends GroovyTypeCheckingExtensionSuppo
def boolean autoTypeUnknown = allowAutoTypeOfUnknown()
unresolvedVariable { var ->
- if (staticVariableTyping.containsKey(var.name)) {
+ if ((null != staticVariableTyping) && (staticVariableTyping.containsKey(var.name))) {
storeType(var, classNodeFor(staticVariableTyping[var.name]))
handled = true
return
@@ -87,4 +87,4 @@ abstract class AbstractSandboxExtension extends GroovyTypeCheckingExtensionSuppo
visitor.visitMethod(methodNode)
}
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9bdef4d8/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/FileSandboxExtension.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/FileSandboxExtension.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/FileSandboxExtension.groovy
index 30e440b..6e9e374 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/FileSandboxExtension.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/jsr223/customizer/FileSandboxExtension.groovy
@@ -63,12 +63,16 @@ class FileSandboxExtension extends AbstractSandboxExtension {
autoTypeUnknown = settings.autoTypeUnknown
methodWhiteList = settings.methodWhiteList
- staticVariableTypes = settings.staticVariableTypes.collectEntries { kv ->
- try {
- return [(kv.key): Class.forName(kv.value)]
- } catch (Exception ex) {
- logger.error("Could not convert ${kv.value} to a Class for variable ${kv.key}", ex)
- throw ex
+ if (null == settings.staticVariableTypes) {
+ staticVariableTypes = null
+ } else {
+ staticVariableTypes = settings.staticVariableTypes.collectEntries { kv ->
+ try {
+ return [(kv.key): Class.forName(kv.value)]
+ } catch (Exception ex) {
+ logger.error("Could not convert ${kv.value} to a Class for variable ${kv.key}", ex)
+ throw ex
+ }
}
}
}
[15/25] tinkerpop git commit: TINKERPOP-786 Add option for no default
method generation on GremlinDsl
Posted by sp...@apache.org.
TINKERPOP-786 Add option for no default method generation on GremlinDsl
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/1d7187b6
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/1d7187b6
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/1d7187b6
Branch: refs/heads/TINKERPOP-786
Commit: 1d7187b6b03b603cdb506882ff237086474b90f9
Parents: f467d15
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sat Apr 29 06:40:59 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../process/traversal/dsl/GremlinDsl.java | 13 +++
.../traversal/dsl/GremlinDslProcessor.java | 88 ++++++++++----------
.../traversal/dsl/GremlinDslProcessorTest.java | 8 ++
.../dsl/SocialNoDefaultMethodsTraversalDsl.java | 37 ++++++++
4 files changed, 104 insertions(+), 42 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1d7187b6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
index 15b93d6..df96007 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
@@ -60,4 +60,17 @@ public @interface GremlinDsl {
* this value is not supplied the generated "source" will simply extend from {@link GraphTraversalSource}.
*/
public String traversalSource() default "org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource";
+
+ /**
+ * When set to {@code true}, which is the default, the following methods will be generated to the DSL
+ * implementation of the {@link GraphTraversalSource}:
+ *
+ * <ul>
+ * <li>{@link GraphTraversalSource#addV()}</li>
+ * <li>{@link GraphTraversalSource#addV(String)}</li>
+ * <li>{@link GraphTraversalSource#V(Object...)}</li>
+ * <li>{@link GraphTraversalSource#E(Object...)}</li>
+ * </ul>
+ */
+ public boolean generateDefaultMethods() default true;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1d7187b6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index 9e23410..f8a3266 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -177,48 +177,50 @@ public class GremlinDslProcessor extends AbstractProcessor {
}
}
- // override methods that return GraphTraversal
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.getBytecode().addStep($T.addV)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", ctx.traversalClassName, AddVertexStartStep.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
- .build());
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addParameter(String.class, "label")
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.getBytecode().addStep($T.addV, label)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", ctx.traversalClassName, AddVertexStartStep.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
- .build());
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("V")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addParameter(Object[].class, "vertexIds")
- .varargs(true)
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.getBytecode().addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", ctx.traversalClassName, GraphStep.class, Vertex.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
- .build());
- traversalSourceClass.addMethod(MethodSpec.methodBuilder("E")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addParameter(Object[].class, "edgeIds")
- .varargs(true)
- .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
- .addStatement("clone.getBytecode().addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
- .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
- .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", ctx.traversalClassName, GraphStep.class, Edge.class)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
- .build());
+ if (ctx.generateDefaultMethods) {
+ // override methods that return GraphTraversal
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.getBytecode().addStep($T.addV)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", ctx.traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(String.class, "label")
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.getBytecode().addStep($T.addV, label)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", ctx.traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("V")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(Object[].class, "vertexIds")
+ .varargs(true)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.getBytecode().addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", ctx.traversalClassName, GraphStep.class, Vertex.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("E")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(Object[].class, "edgeIds")
+ .varargs(true)
+ .addStatement("$N clone = this.clone()", ctx.traversalSourceClazz)
+ .addStatement("clone.getBytecode().addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", ctx.defaultTraversalClazz, ctx.defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", ctx.traversalClassName, GraphStep.class, Edge.class)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
+ .build());
+ }
final JavaFile traversalSourceJavaFile = JavaFile.builder(ctx.packageName, traversalSourceClass.build()).build();
traversalSourceJavaFile.writeTo(filer);
@@ -393,12 +395,14 @@ public class GremlinDslProcessor extends AbstractProcessor {
private final ClassName defaultTraversalClassName;
private final ClassName graphTraversalAdminClassName;
private final TypeElement traversalSourceDslType;
+ private final boolean generateDefaultMethods;
public Context(final TypeElement dslElement) {
annotatedDslType = dslElement;
// gets the annotation on the dsl class/interface
GremlinDsl gremlinDslAnnotation = dslElement.getAnnotation(GremlinDsl.class);
+ generateDefaultMethods = gremlinDslAnnotation.generateDefaultMethods();
traversalSourceDslType = elementUtils.getTypeElement(gremlinDslAnnotation.traversalSource());
packageName = getPackageName(dslElement, gremlinDslAnnotation);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1d7187b6/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
index d0d7d6f..982ec5b 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
@@ -56,4 +56,12 @@ public class GremlinDslProcessorTest {
.processedWith(new GremlinDslProcessor())
.compilesWithoutError();
}
+
+ @Test
+ public void shouldCompileWithNoDefaultMethods() {
+ ASSERT.about(javaSource())
+ .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialNoDefaultMethodsTraversalDsl.java")))
+ .processedWith(new GremlinDslProcessor())
+ .compilesWithoutError();
+ }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/1d7187b6/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java
new file mode 100644
index 0000000..4eb15bd
--- /dev/null
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialNoDefaultMethodsTraversalDsl.java
@@ -0,0 +1,37 @@
+/*
+ * 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.process.traversal.dsl;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+@GremlinDsl(generateDefaultMethods = false)
+public interface SocialNoDefaultMethodsTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
+ public default GraphTraversal<S, Vertex> knows(final String personName) {
+ return out("knows").hasLabel("person").has("name", personName);
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
+ return out("knows").hasLabel("person").values("age").mean();
+ }
+}
[03/25] tinkerpop git commit: WebSocket is a protocol and a proper
noun - CTR
Posted by sp...@apache.org.
WebSocket is a protocol and a proper noun - CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/4d117cbd
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/4d117cbd
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/4d117cbd
Branch: refs/heads/TINKERPOP-786
Commit: 4d117cbd6df0ccc9f8ccef47011e855cea392447
Parents: ec4f83c
Author: Robert Dale <ro...@gmail.com>
Authored: Mon Apr 24 12:12:24 2017 -0400
Committer: Robert Dale <ro...@gmail.com>
Committed: Mon Apr 24 12:12:24 2017 -0400
----------------------------------------------------------------------
docs/src/dev/provider/index.asciidoc | 8 ++++----
docs/src/reference/gremlin-applications.asciidoc | 8 ++++----
docs/src/tutorials/getting-started/index.asciidoc | 4 ++--
3 files changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4d117cbd/docs/src/dev/provider/index.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/dev/provider/index.asciidoc b/docs/src/dev/provider/index.asciidoc
index aa89020..69060af 100644
--- a/docs/src/dev/provider/index.asciidoc
+++ b/docs/src/dev/provider/index.asciidoc
@@ -626,7 +626,7 @@ which should provide enough information to develop a driver for a specific langu
image::gremlin-server-flow.png[width=300,float=right]
-Gremlin Server is distributed with a configuration that utilizes link:http://en.wikipedia.org/wiki/WebSocket[WebSockets]
+Gremlin Server is distributed with a configuration that utilizes link:http://en.wikipedia.org/wiki/WebSocket[WebSocket]
with a custom sub-protocol. Under this configuration, Gremlin Server accepts requests containing a Gremlin script,
evaluates that script and then streams back the results. The notion of "streaming" is depicted in the diagram to the
right.
@@ -674,7 +674,7 @@ A `RequestMessage` to evaluate a script with variable bindings looks like this i
----
The above JSON represents the "body" of the request to send to Gremlin Server. When sending this "body" over
-websockets Gremlin Server can accept a packet frame using a "text" (1) or a "binary" (2) opcode. Using "text"
+WebSocket, Gremlin Server can accept a packet frame using a "text" (1) or a "binary" (2) opcode. Using "text"
is a bit more limited in that Gremlin Server will always process the body of that request as JSON. Generally speaking
"text" is just for testing purposes.
@@ -689,7 +689,7 @@ The first byte represents the length of the "mime type" string value that follow
Gremlin Server, this value should be set to `application/json`. The "payload" represents the JSON message above
encoded as bytes.
-NOTE: Gremlin Server will only accept masked packets as it pertains to websocket packet header construction.
+NOTE: Gremlin Server will only accept masked packets as it pertains to a WebSocket packet header construction.
When Gremlin Server receives that request, it will decode it given the "mime type", pass it to the requested
`OpProcessor` which will execute the `op` defined in the message. In this case, it will evaluate the script
@@ -716,7 +716,7 @@ In this case the `ResponseMessage` returned to the client would look something l
"status":{"code":206,"attributes":{},"message":""}}
----
-Gremlin Server is capable of streaming results such that additional responses will arrive over the websocket until
+Gremlin Server is capable of streaming results such that additional responses will arrive over the WebSocket connection until
the iteration of the result on the server is complete. Each successful incremental message will have a `ResultCode`
of `206`. Termination of the stream will be marked by a final `200` status code. Note that all messages without a
`206` represent terminating conditions for a request. The following table details the various status codes that
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4d117cbd/docs/src/reference/gremlin-applications.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/gremlin-applications.asciidoc b/docs/src/reference/gremlin-applications.asciidoc
index c4a1493..a5c162e 100644
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@ -297,7 +297,7 @@ NOTE: Gremlin Server is the replacement for link:http://rexster.tinkerpop.com[Re
NOTE: Please see the link:http://tinkerpop.apache.org/docs/x.y.z/dev/provider/[Provider Documentation] for information
on how to develop a driver for Gremlin Server.
-By default, communication with Gremlin Server occurs over link:http://en.wikipedia.org/wiki/WebSocket[WebSockets] and
+By default, communication with Gremlin Server occurs over link:http://en.wikipedia.org/wiki/WebSocket[WebSocket] and
exposes a custom sub-protocol for interacting with the server.
[[starting-gremlin-server]]
@@ -691,7 +691,7 @@ Connecting via REST
~~~~~~~~~~~~~~~~~~~
image:gremlin-rexster.png[width=225,float=left] While the default behavior for Gremlin Server is to provide a
-WebSockets-based connection, it can also be configured to support link:http://en.wikipedia.org/wiki/Representational_state_transfer[REST].
+WebSocket-based connection, it can also be configured to support link:http://en.wikipedia.org/wiki/Representational_state_transfer[REST].
The REST endpoint provides for a communication protocol familiar to most developers, with a wide support of
programming languages, tools and libraries for accessing it. As a result, REST provides a fast way to get started
with Gremlin Server. It also may represent an easier upgrade path from link:http://rexster.tinkerpop.com/[Rexster]
@@ -767,7 +767,7 @@ string argument with by setting the `language` key.
WARNING: Consider the size of the result of a submitted script being returned from the REST endpoint. A script
that iterates thousands of results will serialize each of those in memory into a single JSON result set. It is
quite possible that such a script will generate `OutOfMemoryError` exceptions on the server. Consider the default
-WebSockets configuration, which supports streaming, if that type of use case is required.
+WebSocket configuration, which supports streaming, if that type of use case is required.
Configuring
~~~~~~~~~~~
@@ -802,7 +802,7 @@ The following table describes the various configuration options that Gremlin Ser
|Key |Description |Default
|authentication.className |The fully qualified classname of an `Authenticator` implementation to use. If this setting is not present, then authentication is effectively disabled. |`AllowAllAuthenticator`
|authentication.config |A `Map` of configuration settings to be passes to the `Authenticator` when it is constructed. The settings available are dependent on the implementation. |_none_
-|channelizer |The fully qualified classname of the `Channelizer` implementation to use. A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use. By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. Websockets, Java NIO, etc.). |`WebSocketChannelizer`
+|channelizer |The fully qualified classname of the `Channelizer` implementation to use. A `Channelizer` is a "channel initializer" which Gremlin Server uses to define the type of processing pipeline to use. By allowing different `Channelizer` implementations, Gremlin Server can support different communication protocols (e.g. WebSocket, Java NIO, etc.). |`WebSocketChannelizer`
|graphs |A `Map` of `Graph` configuration files where the key of the `Map` becomes the name to which the `Graph` will be bound and the value is the file name of a `Graph` configuration file. |_none_
|gremlinPool |The number of "Gremlin" threads available to execute actual scripts in a `ScriptEngine`. This pool represents the workers available to handle blocking operations in Gremlin Server. |8
|host |The name of the host to bind the server to. |localhost
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4d117cbd/docs/src/tutorials/getting-started/index.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/tutorials/getting-started/index.asciidoc b/docs/src/tutorials/getting-started/index.asciidoc
index 3ac80ce..7af5364 100644
--- a/docs/src/tutorials/getting-started/index.asciidoc
+++ b/docs/src/tutorials/getting-started/index.asciidoc
@@ -527,7 +527,7 @@ Gremlin Server
image:gremlin-server-protocol.png[width=325,float=right] link:http://tinkerpop.apache.org/docs/x.y.z/reference/#gremlin-server[Gremlin Server]
provides a way to remotely execute Gremlin scripts against one or more `Graph` instances hosted within it. It does
this by exposing different endpoints, such as link:http://tinkerpop.apache.org/docs/x.y.z/reference/#_connecting_via_rest[REST]
-and link:http://tinkerpop.apache.org/docs/x.y.z/reference/#_connecting_via_java[websockets], which allow a request
+and link:http://tinkerpop.apache.org/docs/x.y.z/reference/#_connecting_via_java[WebSocket], which allow a request
containing a Gremlin script to be processed with results returned.
[source,text]
@@ -574,7 +574,7 @@ applied to the script on execution and is essentially a way to parameterize your
critical to link:http://tinkerpop.apache.org/docs/x.y.z/reference/#_best_practices[performance]. Whenever
possible, parameterize your queries.
-As mentioned earlier, Gremlin Server can also be configured with a websockets endpoint. This endpoint has an
+As mentioned earlier, Gremlin Server can also be configured with a WebSocket endpoint. This endpoint has an
embedded link:http://tinkerpop.apache.org/docs/x.y.z/reference/#_developing_a_driver[subprotocol] that allow a
compliant driver to communicate with it. TinkerPop supplies a
link:http://tinkerpop.apache.org/docs/x.y.z/reference/#_connecting_via_java[reference driver] written in Java, but
[18/25] tinkerpop git commit: TINKERPOP-768 Implemented basic DSL
tooling WIP
Posted by sp...@apache.org.
TINKERPOP-768 Implemented basic DSL tooling WIP
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/d653e4cc
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/d653e4cc
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/d653e4cc
Branch: refs/heads/TINKERPOP-786
Commit: d653e4cc6defb4f8a8eba6fdab4c0fb3e7779808
Parents: cac7f6f
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Apr 26 07:01:53 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
gremlin-archetype/gremlin-archetype-dsl/pom.xml | 44 +++
.../META-INF/maven/archetype-metadata.xml | 38 +++
.../archetype-resources/README.asciidoc | 33 ++
.../main/resources/archetype-resources/pom.xml | 63 ++++
.../src/main/java/SocialTraversalDsl.java | 41 +++
.../src/test/java/SocialDslTest.java | 46 +++
.../projects/standard/archetype.properties | 21 ++
.../test/resources/projects/standard/goal.txt | 1 +
gremlin-archetype/pom.xml | 1 +
gremlin-core/pom.xml | 36 +++
.../process/traversal/dsl/GremlinDsl.java | 36 +++
.../dsl/GremlinDslAnnotatedInterface.java | 32 ++
.../traversal/dsl/GremlinDslProcessor.java | 318 +++++++++++++++++++
.../traversal/dsl/ProcessorException.java | 37 +++
.../javax.annotation.processing.Processor | 1 +
.../traversal/dsl/GremlinDslProcessorTest.java | 39 +++
.../traversal/dsl/SocialTraversalDsl.java | 43 +++
17 files changed, 830 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/pom.xml b/gremlin-archetype/gremlin-archetype-dsl/pom.xml
new file mode 100644
index 0000000..d4922f5
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>gremlin-archetype</artifactId>
+ <groupId>org.apache.tinkerpop</groupId>
+ <version>3.2.5-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>gremlin-archetype-dsl</artifactId>
+ <name>Apache TinkerPop :: Archetype - TinkerGraph</name>
+ <packaging>jar</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.4</version>
+ </plugin>
+ </plugins>
+
+ <!-- apply variable substitution on the following files using variables from this pom -->
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>archetype-resources/pom.xml</include>
+ <include>archetype-resources/README.asciidoc</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>false</filtering>
+ <excludes>
+ <exclude>archetype-resources/pom.xml</exclude>
+ <exclude>archetype-resources/README.asciidoc</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ </build>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/META-INF/maven/archetype-metadata.xml
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/META-INF/maven/archetype-metadata.xml b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 0000000..a159ee3
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,38 @@
+<!--
+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.
+-->
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd" name="gremlin-archetype-tinkergraph"
+ xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <fileSets>
+ <fileSet filtered="true">
+ <directory></directory>
+ <includes>
+ <include>README.asciidoc</include>
+ </includes>
+ <excludes>
+ <exclude>**/*.xml</exclude>
+ </excludes>
+ </fileSet>
+ <fileSet filtered="true" packaged="true">
+ <directory>src/main/java</directory>
+ </fileSet>
+ <fileSet filtered="true" packaged="true">
+ <directory>src/test/java</directory>
+ </fileSet>
+ </fileSets>
+
+</archetype-descriptor>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/README.asciidoc
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/README.asciidoc b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/README.asciidoc
new file mode 100644
index 0000000..1e131b1
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/README.asciidoc
@@ -0,0 +1,33 @@
+////
+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.
+////
+Gremlin DSL
+===========
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+Prerequisites
+-------------
+
+* Java 8 Update 40+
+* link:https://maven.apache.org/[Maven 3.x]
+
+Building and Running
+--------------------
+
+[source,text]
+mvn clean package
+mvn exec:java -Dexec.mainClass="${package}.App"
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 0000000..d7bb31c
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,63 @@
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>${groupId}</groupId>
+ <artifactId>\${artifactId}</artifactId>
+ <version>${version}</version>
+
+ <name>Social DSL: Modern Graph</name>
+
+ <packaging>jar</packaging>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>tinkergraph-gremlin</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <!-- TinkerPop3 requires Java 8 -->
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.3</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
new file mode 100644
index 0000000..546a328
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.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 ${package};
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+@GremlinDsl
+public interface SocialTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
+ public default GraphTraversal<S, Vertex> knows(final String personName) {
+ return out("knows").hasLabel("person").has("name", personName);
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> youngestFriendsAge() {
+ return out("knows").hasLabel("person").values("age").min();
+ }
+
+ @Override
+ public default GraphTraversal<S, E> iterate() {
+ GraphTraversal.Admin.super.iterate();
+ return this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java
new file mode 100644
index 0000000..ddd584c
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/test/java/SocialDslTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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 ${package};
+
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class SocialDslTest {
+
+ private Graph graph = TinkerFactory.createModern();
+
+ @Test
+ public void shouldValidateThatMarkoKnowsJosh() {
+ SocialTraversalSource social = graph.traversal(SocialTraversalSource.class);
+ assertTrue(social.V().has("name","marko").knows("josh").hasNext());
+ }
+
+ @Test
+ public void shouldGetAgeOfYoungestFriendOfMarko() {
+ SocialTraversalSource social = graph.traversal(SocialTraversalSource.class);
+ assertEquals(27, social.V().has("name","marko").youngestFriendsAge().next().intValue());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/archetype.properties
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/archetype.properties b/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/archetype.properties
new file mode 100644
index 0000000..cf98705
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/archetype.properties
@@ -0,0 +1,21 @@
+# 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.
+
+groupId=org.apache.tinkerpop
+artifactId=gremlin-archetype-dsl
+package=com.test.example
+version=1.0.0-SNAPSHOT
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/goal.txt
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/goal.txt b/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/goal.txt
new file mode 100644
index 0000000..4a1a71d
--- /dev/null
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/test/resources/projects/standard/goal.txt
@@ -0,0 +1 @@
+verify
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-archetype/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-archetype/pom.xml b/gremlin-archetype/pom.xml
index fbe808f..961fabc 100644
--- a/gremlin-archetype/pom.xml
+++ b/gremlin-archetype/pom.xml
@@ -30,6 +30,7 @@ limitations under the License.
<modules>
<module>gremlin-archetype-tinkergraph</module>
<module>gremlin-archetype-server</module>
+ <module>gremlin-archetype-dsl</module>
</modules>
<build>
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-core/pom.xml b/gremlin-core/pom.xml
index 55047ab..989bf83 100644
--- a/gremlin-core/pom.xml
+++ b/gremlin-core/pom.xml
@@ -60,6 +60,11 @@ limitations under the License.
</exclusion>
</exclusions>
</dependency>
+ <dependency>
+ <groupId>com.squareup</groupId>
+ <artifactId>javapoet</artifactId>
+ <version>1.8.0</version>
+ </dependency>
<!-- LOGGING -->
<dependency>
<groupId>org.slf4j</groupId>
@@ -96,6 +101,24 @@ limitations under the License.
<artifactId>commons-collections</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>com.google.testing.compile</groupId>
+ <artifactId>compile-testing</artifactId>
+ <version>0.8</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.truth</groupId>
+ <artifactId>truth</artifactId>
+ <version>0.25</version>
+ <exclusions>
+ <!-- truth comes in through compile-testing and has a self-conflict - produces further conflict with hadoop-gremlin -->
+ <exclusion>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
</dependencies>
<build>
<directory>${basedir}/target</directory>
@@ -115,6 +138,19 @@ limitations under the License.
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
+ <!-- disable annotation processing - testing of the GremlinDslProcessor is handled separately -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ <compilerArgs>
+ <arg>-parameters</arg>
+ <arg>-proc:none</arg>
+ </compilerArgs>
+ </configuration>
+ </plugin>
</plugins>
</build>
</project>
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
new file mode 100644
index 0000000..370ad9b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDsl.java
@@ -0,0 +1,36 @@
+/*
+ * 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.process.traversal.dsl;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * An annotation that specifies that an interface is meant to be used a DSL extension to a {@link GraphTraversal}.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.CLASS)
+public @interface GremlinDsl {
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java
new file mode 100644
index 0000000..2f6db74
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslAnnotatedInterface.java
@@ -0,0 +1,32 @@
+/*
+ * 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.process.traversal.dsl;
+
+import javax.lang.model.element.TypeElement;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+class GremlinDslAnnotatedInterface {
+ private final TypeElement annotatedInterfaceElement;
+
+ public GremlinDslAnnotatedInterface(final TypeElement interfaceElement) {
+ annotatedInterfaceElement = interfaceElement;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
new file mode 100644
index 0000000..d2bcc65
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -0,0 +1,318 @@
+/*
+ * 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.process.traversal.dsl;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterSpec;
+import com.squareup.javapoet.ParameterizedTypeName;
+import com.squareup.javapoet.TypeName;
+import com.squareup.javapoet.TypeSpec;
+import com.squareup.javapoet.TypeVariableName;
+import jdk.nashorn.internal.codegen.types.Type;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+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.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Filer;
+import javax.annotation.processing.Messager;
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.annotation.processing.SupportedSourceVersion;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.TypeParameterElement;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.TypeKind;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.util.Elements;
+import javax.lang.model.util.Types;
+import javax.tools.Diagnostic;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+@SupportedAnnotationTypes("org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl")
+@SupportedSourceVersion(SourceVersion.RELEASE_8)
+public class GremlinDslProcessor extends AbstractProcessor {
+ private Messager messager;
+ private Elements elementUtils;
+ private Filer filer;
+ private Types typeUtils;
+
+ @Override
+ public synchronized void init(final ProcessingEnvironment processingEnv) {
+ super.init(processingEnv);
+ messager = processingEnv.getMessager();
+ elementUtils = processingEnv.getElementUtils();
+ filer = processingEnv.getFiler();
+ typeUtils = processingEnv.getTypeUtils();
+ }
+
+ @Override
+ public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
+ try {
+ for (Element dslElement : roundEnv.getElementsAnnotatedWith(GremlinDsl.class)) {
+ validateDSL(dslElement);
+
+ final TypeElement annotatedDslType = (TypeElement) dslElement;
+ final String packageName = elementUtils.getPackageOf(dslElement).getQualifiedName().toString();
+
+ // create the Traversal implementation interface
+ final String dslName = dslElement.getSimpleName().toString();
+ final String dslPrefix = dslName.substring(0, dslName.length() - "TraversalDSL".length()); // chop off "TraversalDSL"
+ final String traversalClazz = dslPrefix + "Traversal";
+ final ClassName traversalClassName = ClassName.get(packageName, traversalClazz);
+ final String traversalSourceClazz = dslPrefix + "TraversalSource";
+ final ClassName traversalSourceClassName = ClassName.get(packageName, traversalSourceClazz);
+ final String defaultTraversalClazz = "Default" + traversalClazz;
+ final ClassName defaultTraversalClassName = ClassName.get(packageName, defaultTraversalClazz);
+ final ClassName graphTraversalAdminClassName = ClassName.get(GraphTraversal.Admin.class);
+
+ // START write "Traversal" class
+ final TypeSpec.Builder traversalInterface = TypeSpec.interfaceBuilder(traversalClazz)
+ .addModifiers(Modifier.PUBLIC)
+ .addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .addSuperinterface(TypeName.get(dslElement.asType()));
+
+ // process the methods of the GremlinDsl annotated class
+ for (Element elementOfDsl : annotatedDslType.getEnclosedElements()) {
+ tryConstructMethod(elementOfDsl, traversalClassName, dslName, null,
+ Modifier.PUBLIC, Modifier.DEFAULT).ifPresent(traversalInterface::addMethod);
+ }
+
+ // process the methods of GraphTraversal
+ final TypeElement graphTraversalElement = elementUtils.getTypeElement(GraphTraversal.class.getCanonicalName());
+ for (Element elementOfGraphTraversal : graphTraversalElement.getEnclosedElements()) {
+ tryConstructMethod(elementOfGraphTraversal, traversalClassName, dslName,
+ e -> e.getSimpleName().contentEquals("asAdmin") || e.getSimpleName().contentEquals("iterate"),
+ Modifier.PUBLIC, Modifier.DEFAULT)
+ .ifPresent(traversalInterface::addMethod);
+ }
+
+ final JavaFile traversalJavaFile = JavaFile.builder(packageName, traversalInterface.build()).build();
+ traversalJavaFile.writeTo(filer);
+ // END write "Traversal" class
+
+ // START write of the "DefaultTraversal" class
+ final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(defaultTraversalClazz)
+ .addModifiers(Modifier.PUBLIC)
+ .addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .superclass(TypeName.get(elementUtils.getTypeElement(DefaultTraversal.class.getCanonicalName()).asType()))
+ .addSuperinterface(ParameterizedTypeName.get(traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")));
+
+ // add the required constructors for instantiation
+ defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addStatement("super()")
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(Graph.class, "graph")
+ .addStatement("super($N)", "graph")
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(traversalSourceClassName, "traversalSource")
+ .addStatement("super($N)", "traversalSource")
+ .build());
+
+ // add the override
+ defaultTraversalClass.addMethod(MethodSpec.methodBuilder("iterate")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("return ($T) super.iterate()", traversalClassName)
+ .returns(ParameterizedTypeName.get(traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.methodBuilder("asAdmin")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("return ($T) super.asAdmin()", GraphTraversal.Admin.class)
+ .returns(ParameterizedTypeName.get(graphTraversalAdminClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.methodBuilder("clone")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("return ($T) super.clone()", defaultTraversalClassName)
+ .returns(ParameterizedTypeName.get(defaultTraversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .build());
+
+ final JavaFile defaultTraversalJavaFile = JavaFile.builder(packageName, defaultTraversalClass.build()).build();
+ defaultTraversalJavaFile.writeTo(filer);
+ // END write of the "DefaultTraversal" class
+
+ // START write "TraversalSource" class
+ final TypeElement graphTraversalSourceElement = elementUtils.getTypeElement(GraphTraversalSource.class.getCanonicalName());
+ final TypeSpec.Builder traversalSourceClass = TypeSpec.classBuilder(traversalSourceClazz)
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(TypeName.get(graphTraversalSourceElement.asType()));
+
+ // add the required constructors for instantiation
+ traversalSourceClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(Graph.class, "graph")
+ .addStatement("super($N)", "graph")
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(Graph.class, "graph")
+ .addParameter(TraversalStrategies.class, "strategies")
+ .addStatement("super($N, $N)", "graph", "strategies")
+ .build());
+
+ // override methods to return a the DSL TraversalSource
+ for (Element elementOfGraphTraversal : graphTraversalSourceElement.getEnclosedElements()) {
+ // first copy/override methods that return a GraphTraversalSource so that we can instead return
+ // the DSL TraversalSource class.
+ tryConstructMethod(elementOfGraphTraversal, traversalSourceClassName, "",
+ e -> !(e.getReturnType().getKind() == TypeKind.DECLARED && ((DeclaredType) e.getReturnType()).asElement().getSimpleName().contentEquals(GraphTraversalSource.class.getSimpleName())),
+ Modifier.PUBLIC)
+ .ifPresent(traversalSourceClass::addMethod);
+ }
+
+ // override methods that return GraphTraversal
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.addV)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, null))", traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("addV")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(String.class, "label")
+ .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.addV, label)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, label))", traversalClassName, AddVertexStartStep.class)
+ .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("V")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(Object[].class, "vertexIds")
+ .varargs(true)
+ .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.V, vertexIds)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, vertexIds))", traversalClassName, GraphStep.class, Vertex.class)
+ .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Vertex.class), ClassName.get(Vertex.class)))
+ .build());
+ traversalSourceClass.addMethod(MethodSpec.methodBuilder("E")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(Object[].class, "edgeIds")
+ .varargs(true)
+ .addStatement("$N clone = this.clone()", traversalSourceClazz)
+ .addStatement("clone.bytecode.addStep($T.E, edgeIds)", GraphTraversal.Symbols.class)
+ .addStatement("$N traversal = new $N(clone)", defaultTraversalClazz, defaultTraversalClazz)
+ .addStatement("return ($T) traversal.asAdmin().addStep(new $T(traversal, $T.class, true, edgeIds))", traversalClassName, GraphStep.class, Edge.class)
+ .returns(ParameterizedTypeName.get(traversalClassName, ClassName.get(Edge.class), ClassName.get(Edge.class)))
+ .build());
+
+ final JavaFile traversalSourceJavaFile = JavaFile.builder(packageName, traversalSourceClass.build()).build();
+ traversalSourceJavaFile.writeTo(filer);
+ // END write "TraversalSource" class
+ }
+ } catch (Exception ex) {
+ messager.printMessage(Diagnostic.Kind.ERROR, ex.getMessage());
+ }
+
+ return true;
+ }
+
+ private Optional<MethodSpec> tryConstructMethod(final Element element, final ClassName returnClazz, final String parent,
+ final Predicate<ExecutableElement> ignore, final Modifier... modifiers) {
+ if (element.getKind() != ElementKind.METHOD) return Optional.empty();
+
+ final ExecutableElement templateMethod = (ExecutableElement) element;
+ final String methodName = templateMethod.getSimpleName().toString();
+
+ if (ignore != null && ignore.test(templateMethod)) return Optional.empty();
+
+ final DeclaredType returnTypeMirror = (DeclaredType) templateMethod.getReturnType();
+ final List<? extends TypeMirror> returnTypeArguments = returnTypeMirror.getTypeArguments();
+
+ // build a return type with appropriate generic declarations (if such declarations are present)
+ final TypeName returnType = returnTypeArguments.isEmpty() ?
+ returnClazz :
+ ParameterizedTypeName.get(returnClazz, returnTypeArguments.stream().map(TypeName::get).collect(Collectors.toList()).toArray(new TypeName[returnTypeArguments.size()]));
+ final MethodSpec.Builder methodToAdd = MethodSpec.methodBuilder(methodName)
+ .addModifiers(modifiers)
+ .addAnnotation(Override.class)
+ .addExceptions(templateMethod.getThrownTypes().stream().map(TypeName::get).collect(Collectors.toList()))
+ .returns(returnType);
+
+ templateMethod.getTypeParameters().forEach(tp -> methodToAdd.addTypeVariable(TypeVariableName.get(tp)));
+
+ boolean added = false;
+ final List<? extends VariableElement> parameters = templateMethod.getParameters();
+ final String parentCall = parent.isEmpty() ? "" : parent + ".";
+ String body = "return (" + returnClazz.simpleName() + ") " + parentCall + "super." + methodName + "(";
+ for (VariableElement param : parameters) {
+ methodToAdd.addParameter(ParameterSpec.get(param));
+
+ body = body + param.getSimpleName() + ",";
+ added = true;
+ }
+
+ // treat a final array as a varargs param
+ if (!parameters.isEmpty() && parameters.get(parameters.size() - 1).asType().getKind() == TypeKind.ARRAY)
+ methodToAdd.varargs(true);
+
+ if (added) body = body.substring(0, body.length() - 1);
+
+ body = body + ")";
+ methodToAdd.addStatement(body);
+
+ return Optional.of(methodToAdd.build());
+ }
+
+ private void validateDSL(final Element dslElement) throws ProcessorException {
+ if (dslElement.getKind() != ElementKind.INTERFACE)
+ throw new ProcessorException(dslElement, "Only interfaces can be annotated with @%s", GremlinDsl.class.getSimpleName());
+
+ final TypeElement typeElement = (TypeElement) dslElement;
+ if (!typeElement.getModifiers().contains(Modifier.PUBLIC))
+ throw new ProcessorException(dslElement, "The interface %s is not public.", typeElement.getQualifiedName());
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
new file mode 100644
index 0000000..c84278e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/ProcessorException.java
@@ -0,0 +1,37 @@
+/*
+ * 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.process.traversal.dsl;
+
+import javax.lang.model.element.Element;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class ProcessorException extends Exception {
+ private Element element;
+
+ public ProcessorException(final Element element, final String msg, final Object... args) {
+ super(String.format(msg, args));
+ this.element = element;
+ }
+
+ public Element getElement() {
+ return element;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/gremlin-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
new file mode 100644
index 0000000..bd34c93
--- /dev/null
+++ b/gremlin-core/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -0,0 +1 @@
+org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDslProcessor
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
new file mode 100644
index 0000000..c3c62cd
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessorTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.process.traversal.dsl;
+
+import com.google.testing.compile.JavaFileObjects;
+import org.junit.Test;
+
+import static com.google.common.truth.Truth.ASSERT;
+import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class GremlinDslProcessorTest {
+
+ @Test
+ public void shouldCompile() {
+ ASSERT.about(javaSource())
+ .that(JavaFileObjects.forResource(GremlinDsl.class.getResource("SocialTraversalDsl.java")))
+ .processedWith(new GremlinDslProcessor())
+ .compilesWithoutError();
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d653e4cc/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
new file mode 100644
index 0000000..af53dd2
--- /dev/null
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
@@ -0,0 +1,43 @@
+/*
+ * 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.util.dsl;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+@GremlinDsl
+public interface SocialTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
+ public default GraphTraversal<S, Vertex> knows(final String personName) {
+ return out("knows").hasLabel("person").has("name", personName);
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
+ return out("knows").hasLabel("person").properties("age").mean();
+ }
+
+ @Override
+ public default GraphTraversal<S, E> iterate() {
+ GraphTraversal.Admin.super.iterate();
+ return this;
+ }
+}
[23/25] tinkerpop git commit: TINKERPOP-786 Extracted logic for
DefaultTraversal generation for DSLs
Posted by sp...@apache.org.
TINKERPOP-786 Extracted logic for DefaultTraversal generation for DSLs
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/870e39d5
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/870e39d5
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/870e39d5
Branch: refs/heads/TINKERPOP-786
Commit: 870e39d591d1673e17853fd59d3a9e586c9dd7a6
Parents: d757c05
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 15:19:46 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../traversal/dsl/GremlinDslProcessor.java | 96 ++++++++++----------
1 file changed, 50 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/870e39d5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index 5a1a6bd..f9d5a40 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -95,52 +95,9 @@ public class GremlinDslProcessor extends AbstractProcessor {
// GremlinDsl annotation on it
generateTraversalInterface(ctx);
- // START write of the "DefaultTraversal" class
- final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(ctx.defaultTraversalClazz)
- .addModifiers(Modifier.PUBLIC)
- .addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
- .superclass(TypeName.get(elementUtils.getTypeElement(DefaultTraversal.class.getCanonicalName()).asType()))
- .addSuperinterface(ParameterizedTypeName.get(ctx.traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")));
-
- // add the required constructors for instantiation
- defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
- .addModifiers(Modifier.PUBLIC)
- .addStatement("super()")
- .build());
- defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
- .addModifiers(Modifier.PUBLIC)
- .addParameter(Graph.class, "graph")
- .addStatement("super($N)", "graph")
- .build());
- defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
- .addModifiers(Modifier.PUBLIC)
- .addParameter(ctx.traversalSourceClassName, "traversalSource")
- .addStatement("super($N)", "traversalSource")
- .build());
-
- // add the override
- defaultTraversalClass.addMethod(MethodSpec.methodBuilder("iterate")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addStatement("return ($T) super.iterate()", ctx.traversalClassName)
- .returns(ParameterizedTypeName.get(ctx.traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
- .build());
- defaultTraversalClass.addMethod(MethodSpec.methodBuilder("asAdmin")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addStatement("return ($T) super.asAdmin()", GraphTraversal.Admin.class)
- .returns(ParameterizedTypeName.get(ctx.graphTraversalAdminClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
- .build());
- defaultTraversalClass.addMethod(MethodSpec.methodBuilder("clone")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .addStatement("return ($T) super.clone()", ctx.defaultTraversalClassName)
- .returns(ParameterizedTypeName.get(ctx.defaultTraversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
- .build());
-
- final JavaFile defaultTraversalJavaFile = JavaFile.builder(ctx.packageName, defaultTraversalClass.build()).build();
- defaultTraversalJavaFile.writeTo(filer);
- // END write of the "DefaultTraversal" class
+ // create the "DefaultTraversal" class which implements the above generated "Traversal" and can then
+ // be used by the "TraversalSource" generated below to spawn new traversal instances
+ generateDefaultTraversal(ctx);
// START write "TraversalSource" class
final TypeElement graphTraversalSourceElement = elementUtils.getTypeElement(GraphTraversalSource.class.getCanonicalName());
@@ -225,6 +182,53 @@ public class GremlinDslProcessor extends AbstractProcessor {
return true;
}
+ private void generateDefaultTraversal(final Context ctx) throws IOException {
+ final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(ctx.defaultTraversalClazz)
+ .addModifiers(Modifier.PUBLIC)
+ .addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .superclass(TypeName.get(elementUtils.getTypeElement(DefaultTraversal.class.getCanonicalName()).asType()))
+ .addSuperinterface(ParameterizedTypeName.get(ctx.traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")));
+
+ // add the required constructors for instantiation
+ defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addStatement("super()")
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(Graph.class, "graph")
+ .addStatement("super($N)", "graph")
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(ctx.traversalSourceClassName, "traversalSource")
+ .addStatement("super($N)", "traversalSource")
+ .build());
+
+ // add the override
+ defaultTraversalClass.addMethod(MethodSpec.methodBuilder("iterate")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("return ($T) super.iterate()", ctx.traversalClassName)
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.methodBuilder("asAdmin")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("return ($T) super.asAdmin()", GraphTraversal.Admin.class)
+ .returns(ParameterizedTypeName.get(ctx.graphTraversalAdminClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .build());
+ defaultTraversalClass.addMethod(MethodSpec.methodBuilder("clone")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addStatement("return ($T) super.clone()", ctx.defaultTraversalClassName)
+ .returns(ParameterizedTypeName.get(ctx.defaultTraversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .build());
+
+ final JavaFile defaultTraversalJavaFile = JavaFile.builder(ctx.packageName, defaultTraversalClass.build()).build();
+ defaultTraversalJavaFile.writeTo(filer);
+ }
+
private void generateTraversalInterface(final Context ctx) throws IOException {
final TypeSpec.Builder traversalInterface = TypeSpec.interfaceBuilder(ctx.traversalClazz)
.addModifiers(Modifier.PUBLIC)
[19/25] tinkerpop git commit: TINKERPOP-786 Made override of
iterate() automatic
Posted by sp...@apache.org.
TINKERPOP-786 Made override of iterate() automatic
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/d757c05b
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/d757c05b
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/d757c05b
Branch: refs/heads/TINKERPOP-786
Commit: d757c05b1b9d23e2753493ba990a06959c0fe634
Parents: 1052b3b
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Apr 27 15:16:16 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 08:23:41 2017 -0400
----------------------------------------------------------------------
.../src/main/java/SocialTraversalDsl.java | 6 --
.../traversal/dsl/GremlinDslProcessor.java | 69 ++++++++++++--------
.../traversal/dsl/SocialMoveTraversalDsl.java | 6 --
.../traversal/dsl/SocialTraversalDsl.java | 6 --
4 files changed, 43 insertions(+), 44 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d757c05b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
index 546a328..fb2a3f6 100644
--- a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
+++ b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/src/main/java/SocialTraversalDsl.java
@@ -32,10 +32,4 @@ public interface SocialTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
public default <E2 extends Number> GraphTraversal<S, E2> youngestFriendsAge() {
return out("knows").hasLabel("person").values("age").min();
}
-
- @Override
- public default GraphTraversal<S, E> iterate() {
- GraphTraversal.Admin.super.iterate();
- return this;
- }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d757c05b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
index d96ae01..5a1a6bd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/GremlinDslProcessor.java
@@ -56,6 +56,7 @@ import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import javax.tools.Diagnostic;
+import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@@ -88,33 +89,11 @@ public class GremlinDslProcessor extends AbstractProcessor {
try {
for (Element dslElement : roundEnv.getElementsAnnotatedWith(GremlinDsl.class)) {
validateDSL(dslElement);
- final TypeElement annotatedDslType = (TypeElement) dslElement;
- final Context ctx = new Context(annotatedDslType);
+ final Context ctx = new Context((TypeElement) dslElement);
- // START write "Traversal" class
- final TypeSpec.Builder traversalInterface = TypeSpec.interfaceBuilder(ctx.traversalClazz)
- .addModifiers(Modifier.PUBLIC)
- .addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
- .addSuperinterface(TypeName.get(dslElement.asType()));
-
- // process the methods of the GremlinDsl annotated class
- for (Element elementOfDsl : annotatedDslType.getEnclosedElements()) {
- tryConstructMethod(elementOfDsl, ctx.traversalClassName, ctx.dslName, null,
- Modifier.PUBLIC, Modifier.DEFAULT).ifPresent(traversalInterface::addMethod);
- }
-
- // process the methods of GraphTraversal
- final TypeElement graphTraversalElement = elementUtils.getTypeElement(GraphTraversal.class.getCanonicalName());
- for (Element elementOfGraphTraversal : graphTraversalElement.getEnclosedElements()) {
- tryConstructMethod(elementOfGraphTraversal, ctx.traversalClassName, ctx.dslName,
- e -> e.getSimpleName().contentEquals("asAdmin") || e.getSimpleName().contentEquals("iterate"),
- Modifier.PUBLIC, Modifier.DEFAULT)
- .ifPresent(traversalInterface::addMethod);
- }
-
- final JavaFile traversalJavaFile = JavaFile.builder(ctx.packageName, traversalInterface.build()).build();
- traversalJavaFile.writeTo(filer);
- // END write "Traversal" class
+ // creates the "Traversal" interface using an extension of the GraphTraversal class that has the
+ // GremlinDsl annotation on it
+ generateTraversalInterface(ctx);
// START write of the "DefaultTraversal" class
final TypeSpec.Builder defaultTraversalClass = TypeSpec.classBuilder(ctx.defaultTraversalClazz)
@@ -246,6 +225,41 @@ public class GremlinDslProcessor extends AbstractProcessor {
return true;
}
+ private void generateTraversalInterface(final Context ctx) throws IOException {
+ final TypeSpec.Builder traversalInterface = TypeSpec.interfaceBuilder(ctx.traversalClazz)
+ .addModifiers(Modifier.PUBLIC)
+ .addTypeVariables(Arrays.asList(TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .addSuperinterface(TypeName.get(ctx.annotatedDslType.asType()));
+
+ // process the methods of the GremlinDsl annotated class
+ for (Element elementOfDsl : ctx.annotatedDslType.getEnclosedElements()) {
+ tryConstructMethod(elementOfDsl, ctx.traversalClassName, ctx.dslName, null,
+ Modifier.PUBLIC, Modifier.DEFAULT).ifPresent(traversalInterface::addMethod);
+ }
+
+ // process the methods of GraphTraversal
+ final TypeElement graphTraversalElement = elementUtils.getTypeElement(GraphTraversal.class.getCanonicalName());
+ for (Element elementOfGraphTraversal : graphTraversalElement.getEnclosedElements()) {
+ tryConstructMethod(elementOfGraphTraversal, ctx.traversalClassName, ctx.dslName,
+ e -> e.getSimpleName().contentEquals("asAdmin") || e.getSimpleName().contentEquals("iterate"),
+ Modifier.PUBLIC, Modifier.DEFAULT)
+ .ifPresent(traversalInterface::addMethod);
+ }
+
+ // there are weird things with generics that require this method to be implemented if it isn't already present
+ // in the GremlinDsl annotated class extending from GraphTraversal
+ traversalInterface.addMethod(MethodSpec.methodBuilder("iterate")
+ .addModifiers(Modifier.PUBLIC, Modifier.DEFAULT)
+ .addAnnotation(Override.class)
+ .addStatement("$T.super.iterate()", ClassName.get(ctx.annotatedDslType))
+ .addStatement("return this")
+ .returns(ParameterizedTypeName.get(ctx.traversalClassName, TypeVariableName.get("S"), TypeVariableName.get("E")))
+ .build());
+
+ final JavaFile traversalJavaFile = JavaFile.builder(ctx.packageName, traversalInterface.build()).build();
+ traversalJavaFile.writeTo(filer);
+ }
+
private Optional<MethodSpec> tryConstructMethod(final Element element, final ClassName returnClazz, final String parent,
final Predicate<ExecutableElement> ignore, final Modifier... modifiers) {
if (element.getKind() != ElementKind.METHOD) return Optional.empty();
@@ -303,6 +317,7 @@ public class GremlinDslProcessor extends AbstractProcessor {
}
private class Context {
+ private final TypeElement annotatedDslType;
private final String packageName;
private final String dslName;
private final String traversalClazz;
@@ -314,6 +329,8 @@ public class GremlinDslProcessor extends AbstractProcessor {
private final ClassName graphTraversalAdminClassName;
public Context(final TypeElement dslElement) {
+ annotatedDslType = dslElement;
+
// gets the annotation on the dsl class/interface
GremlinDsl gremlinDslAnnotation = dslElement.getAnnotation(GremlinDsl.class);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d757c05b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
index 1392e30..1db1dff 100644
--- a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialMoveTraversalDsl.java
@@ -34,10 +34,4 @@ public interface SocialMoveTraversalDsl<S, E> extends GraphTraversal.Admin<S, E>
public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
return out("knows").hasLabel("person").properties("age").mean();
}
-
- @Override
- public default GraphTraversal<S, E> iterate() {
- GraphTraversal.Admin.super.iterate();
- return this;
- }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/d757c05b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
index af53dd2..fc4921f 100644
--- a/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
+++ b/gremlin-core/src/test/resources/org/apache/tinkerpop/gremlin/process/traversal/dsl/SocialTraversalDsl.java
@@ -34,10 +34,4 @@ public interface SocialTraversalDsl<S, E> extends GraphTraversal.Admin<S, E> {
public default <E2 extends Number> GraphTraversal<S, E2> meanAgeOfFriends() {
return out("knows").hasLabel("person").properties("age").mean();
}
-
- @Override
- public default GraphTraversal<S, E> iterate() {
- GraphTraversal.Admin.super.iterate();
- return this;
- }
}