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 13:10:59 UTC
[01/15] tinkerpop git commit: Explicitly add the compiler plugin to
tinkerpop root [Forced Update!]
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-786 8d82fd7b1 -> 5b1124d99 (forced update)
Explicitly add the compiler plugin to tinkerpop root
Not sure if there's a bug in newer versions of intellij, but this seems to fix a problem with intellij being able to read the langauge level properly from maven in the root of the project CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/08edb2a6
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/08edb2a6
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/08edb2a6
Branch: refs/heads/TINKERPOP-786
Commit: 08edb2a61b78e47947c7b57b17cdc19096f5f2d5
Parents: b5c978c
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed May 3 09:08:15 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 09:08:15 2017 -0400
----------------------------------------------------------------------
pom.xml | 4 ++++
1 file changed, 4 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/08edb2a6/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 1fcc681..1eea927 100644
--- a/pom.xml
+++ b/pom.xml
@@ -153,6 +153,10 @@ limitations under the License.
<directory>${basedir}/target</directory>
<plugins>
<plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ </plugin>
+ <plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.3.1</version>
<executions>
[04/15] 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/c04d5e35
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c04d5e35
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c04d5e35
Branch: refs/heads/TINKERPOP-786
Commit: c04d5e35dab8526e85fe9e133ceb7897a209a5da
Parents: 211d352
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 09:10:40 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/c04d5e35/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/c04d5e35/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();
}
}
[14/15] 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/b9c680b8
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/b9c680b8
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/b9c680b8
Branch: refs/heads/TINKERPOP-786
Commit: b9c680b8b13616e7a097abec6ec280e08765d149
Parents: 86fff4e
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 09:10:40 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/b9c680b8/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/b9c680b8/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();
}
}
[06/15] 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/a46fc1f9
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a46fc1f9
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a46fc1f9
Branch: refs/heads/TINKERPOP-786
Commit: a46fc1f95108da452dc63e22a8b07fa91e15e87e
Parents: c04d5e3
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 09:10:40 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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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/a46fc1f9/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;
[15/15] 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/a363f3bd
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a363f3bd
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a363f3bd
Branch: refs/heads/TINKERPOP-786
Commit: a363f3bdd60ce6b991025927594b08e3f2dd9089
Parents: 9ab78fa
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 09:10:40 2017 -0400
----------------------------------------------------------------------
.../dsl/GremlinDslAnnotatedInterface.java | 32 --------------------
1 file changed, 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a363f3bd/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/15] 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/e0d6ed61
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/e0d6ed61
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/e0d6ed61
Branch: refs/heads/TINKERPOP-786
Commit: e0d6ed618795de7f0ea711791594ade6986eb87b
Parents: 634736d
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 09:10:40 2017 -0400
----------------------------------------------------------------------
.../traversal/dsl/GremlinDslProcessor.java | 125 ++++++++++---------
1 file changed, 69 insertions(+), 56 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e0d6ed61/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();
+ }
+ }
}
[05/15] 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/5b1124d9
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/5b1124d9
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/5b1124d9
Branch: refs/heads/TINKERPOP-786
Commit: 5b1124d99aedeef22c1a1ae92634aff34912a148
Parents: b9c680b
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 09:10:40 2017 -0400
----------------------------------------------------------------------
gremlin-core/pom.xml | 14 --------------
1 file changed, 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5b1124d9/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>
[03/15] 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/82c4255f
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/82c4255f
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/82c4255f
Branch: refs/heads/TINKERPOP-786
Commit: 82c4255f16134964296dc43fccae790710dbff75
Parents: feffe79
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 09:10:39 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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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/82c4255f/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;
+ }
+}
[02/15] 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/feffe794
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/feffe794
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/feffe794
Branch: refs/heads/TINKERPOP-786
Commit: feffe7940621e7b4ae7d459e9ddceca1b83de4a0
Parents: cac7f6f 08edb2a
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed May 3 09:09:23 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed May 3 09:09:23 2017 -0400
----------------------------------------------------------------------
pom.xml | 4 ++++
1 file changed, 4 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/feffe794/pom.xml
----------------------------------------------------------------------
[10/15] 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/94ad0a1c
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/94ad0a1c
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/94ad0a1c
Branch: refs/heads/TINKERPOP-786
Commit: 94ad0a1c8a4f7aa151f38e0dd18c4641bc0f39c8
Parents: 9f8cc2b
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 09:10:40 2017 -0400
----------------------------------------------------------------------
.../traversal/dsl/GremlinDslProcessor.java | 96 ++++++++++----------
1 file changed, 50 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/94ad0a1c/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)
[07/15] 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/634736de
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/634736de
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/634736de
Branch: refs/heads/TINKERPOP-786
Commit: 634736de6bcdd21cffbd94125ad68cf07ada0e7a
Parents: 82c4255
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 09:10:40 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/634736de/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/634736de/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/634736de/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/634736de/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;
+ }
+}
[11/15] 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/86fff4eb
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/86fff4eb
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/86fff4eb
Branch: refs/heads/TINKERPOP-786
Commit: 86fff4eb46d97b13fbafcb663b3c4e63dadbc215
Parents: a363f3b
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 09:10:40 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/86fff4eb/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/86fff4eb/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/86fff4eb/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/86fff4eb/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();
+ }
+}
[12/15] 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/211d3521
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/211d3521
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/211d3521
Branch: refs/heads/TINKERPOP-786
Commit: 211d3521c43a223503dfc3bad061a1cc3792f344
Parents: 94ad0a1
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 09:10:40 2017 -0400
----------------------------------------------------------------------
.../traversal/dsl/GremlinDslProcessor.java | 156 ++++++++++---------
1 file changed, 80 insertions(+), 76 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/211d3521/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)
[09/15] 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/9f8cc2bc
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/9f8cc2bc
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/9f8cc2bc
Branch: refs/heads/TINKERPOP-786
Commit: 9f8cc2bc94be5f280e1f73dea9328d966eb348a1
Parents: e0d6ed6
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 09:10:40 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/9f8cc2bc/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/9f8cc2bc/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/9f8cc2bc/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/9f8cc2bc/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;
- }
}
[13/15] 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/9ab78fa5
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/9ab78fa5
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/9ab78fa5
Branch: refs/heads/TINKERPOP-786
Commit: 9ab78fa5c82facbcdcbd3ebd7226f1adae71ad5e
Parents: a46fc1f
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 09:10:40 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/9ab78fa5/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/9ab78fa5/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/9ab78fa5/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 {