TINKERPOP-1504 Added the property key to events for new properties.

Newly added properties triggered "changed" events when using EventStrategy but 
the specific key that was newly added was not available in the mutation 
listener. The listener would simply report the new value only. After this 
change the listener now gets a DetachedVertexPropery/Property with the newly 
added key and a null value set.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/06bf620c
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/06bf620c
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/06bf620c

Branch: refs/heads/TINKERPOP-1642
Commit: 06bf620caf6fda6325512fde704e4b92329fa8fd
Parents: cde8b31
Author: Stephen Mallette <[email protected]>
Authored: Wed Mar 15 10:40:09 2017 -0400
Committer: Stephen Mallette <[email protected]>
Committed: Wed Mar 15 10:40:09 2017 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   1 +
 .../step/sideEffect/AddPropertyStep.java        |  17 +-
 .../decoration/EventStrategyProcessTest.java    | 474 ++++++++++++++++++-
 3 files changed, 488 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/06bf620c/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index f4eaaa8..90b9f00 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 TinkerPop 3.1.7 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Fixed `EventStrategy` so that newly added properties trigger events with the 
name of the key that was added.
 * Drop use of jitpack for the jbcrypt artifact - using the official one in 
Maven Central.
 
 [[release-3-1-6]]

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/06bf620c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
index 7c12c0e..3ccff52 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
@@ -36,6 +36,8 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+import 
org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
 
 import java.util.List;
 import java.util.Set;
@@ -91,11 +93,20 @@ public final class AddPropertyStep<S extends Element> 
extends SideEffectStep<S>
             final boolean newProperty = element instanceof Vertex ? 
currentProperty == VertexProperty.empty() : currentProperty == Property.empty();
             final Event.ElementPropertyChangedEvent evt;
             if (element instanceof Vertex)
-                evt = new 
Event.VertexPropertyChangedEvent(DetachedFactory.detach((Vertex) element, 
true), newProperty ? null : DetachedFactory.detach((VertexProperty) 
currentProperty, true), value, vertexPropertyKeyValues);
+                evt = new 
Event.VertexPropertyChangedEvent(DetachedFactory.detach((Vertex) element, true),
+                        newProperty ?
+                                new DetachedVertexProperty(null, key, null, 
null) :
+                                DetachedFactory.detach((VertexProperty) 
currentProperty, true), value, vertexPropertyKeyValues);
             else if (element instanceof Edge)
-                evt = new 
Event.EdgePropertyChangedEvent(DetachedFactory.detach((Edge) element, true), 
newProperty ? null : DetachedFactory.detach(currentProperty), value);
+                evt = new 
Event.EdgePropertyChangedEvent(DetachedFactory.detach((Edge) element, true),
+                        newProperty ?
+                                new DetachedProperty(key, null) :
+                                DetachedFactory.detach(currentProperty), 
value);
             else if (element instanceof VertexProperty)
-                evt = new 
Event.VertexPropertyPropertyChangedEvent(DetachedFactory.detach((VertexProperty)
 element, true), newProperty ? null : DetachedFactory.detach(currentProperty), 
value);
+                evt = new 
Event.VertexPropertyPropertyChangedEvent(DetachedFactory.detach((VertexProperty)
 element, true),
+                        newProperty ?
+                                new DetachedProperty(key, null):
+                                DetachedFactory.detach(currentProperty), 
value);
             else
                 throw new IllegalStateException(String.format("The incoming 
object cannot be processed by change eventing in %s:  %s", 
AddPropertyStep.class.getName(), element));
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/06bf620c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategyProcessTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategyProcessTest.java
 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategyProcessTest.java
index 3effae5..76ae31c 100644
--- 
a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategyProcessTest.java
+++ 
b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategyProcessTest.java
@@ -34,6 +34,7 @@ import org.junit.Test;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -529,11 +530,482 @@ public class EventStrategyProcessTest extends 
AbstractGremlinProcessTest {
         assertEquals(2, listener2.addVertexEventRecorded());
     }
 
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, 
feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
+    public void shouldDetachPropertyOfVertexPropertyWhenRemoved() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final VertexProperty vp = v.property("xxx","blah");
+        final Property p = vp.property("to-drop", "dah");
+        vp.property("not-dropped", "yay!");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexPropertyPropertyRemoved(final VertexProperty 
element, final Property property) {
+                assertEquals(vp.label(), element.label());
+                assertEquals(vp.value(), element.value());
+                assertEquals(p.value(), property.value());
+                assertEquals(p.key(), property.key());
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> 
gts.V(v).properties("xxx").properties("to-drop").drop().iterate());
+
+        assertEquals(1, IteratorUtils.count(v.properties()));
+        assertEquals(1, 
IteratorUtils.count(v.properties().next().properties()));
+        assertEquals("yay!", vp.value("not-dropped"));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, 
feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
+    public void shouldDetachPropertyOfVertexPropertyWhenChanged() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final VertexProperty vp = v.property("xxx","blah");
+        final Property p = vp.property("to-change", "dah");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexPropertyPropertyChanged(final VertexProperty 
element, final Property oldValue, final Object setValue) {
+                assertEquals(vp.label(), element.label());
+                assertEquals(vp.value(), element.value());
+                assertEquals(p.value(), oldValue.value());
+                assertEquals(p.key(), oldValue.key());
+                assertEquals("bah", setValue);
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> 
gts.V(v).properties("xxx").property("to-change","bah").iterate());
+
+        assertEquals(1, IteratorUtils.count(v.properties()));
+        assertEquals(1, 
IteratorUtils.count(v.properties().next().properties()));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, 
feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
+    public void shouldDetachPropertyOfVertexPropertyWhenNew() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final VertexProperty vp = v.property("xxx","blah");
+        final Property p = vp.property("to-change", "dah");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexPropertyPropertyChanged(final VertexProperty 
element, final Property oldValue, final Object setValue) {
+                assertEquals(vp.label(), element.label());
+                assertEquals(vp.value(), element.value());
+                assertEquals(null, oldValue.value());
+                assertEquals("new", oldValue.key());
+                assertEquals("yay!", setValue);
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> 
gts.V(v).properties("xxx").property("new","yay!").iterate());
+
+        assertEquals(1, IteratorUtils.count(v.properties()));
+        assertEquals(2, 
IteratorUtils.count(v.properties().next().properties()));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.SIMPLE)
+    public void shouldDetachPropertyOfEdgeWhenRemoved() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final Edge e = v.addEdge("self", v, "not-dropped", "yay!");
+        final Property p = e.property("to-drop", "dah");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void edgePropertyRemoved(final Edge element, final Property 
property) {
+                assertEquals(e.label(), element.label());
+                assertEquals(e.inVertex().id(), element.inVertex().id());
+                assertEquals(e.outVertex().id(), element.outVertex().id());
+                assertEquals(p.value(), property.value());
+                assertEquals(p.key(), property.key());
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> gts.E(e).properties("to-drop").drop().iterate());
+
+        assertEquals(1, IteratorUtils.count(e.properties()));
+        assertEquals("yay!", e.value("not-dropped"));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.SIMPLE)
+    public void shouldDetachPropertyOfEdgeWhenChanged() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final Edge e = v.addEdge("self", v);
+        final Property p = e.property("to-change", "no!");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void edgePropertyChanged(final Edge element, final Property 
oldValue, final Object setValue) {
+                assertEquals(e.label(), element.label());
+                assertEquals(e.inVertex().id(), element.inVertex().id());
+                assertEquals(e.outVertex().id(), element.outVertex().id());
+                assertEquals(p.value(), oldValue.value());
+                assertEquals(p.key(), oldValue.key());
+                assertEquals("yay!", setValue);
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> gts.E(e).property("to-change","yay!").iterate());
+
+        assertEquals(1, IteratorUtils.count(e.properties()));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.SIMPLE)
+    public void shouldDetachPropertyOfEdgeWhenNew() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final Edge e = v.addEdge("self", v);
+        final Property p = e.property("to-change", "no!");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void edgePropertyChanged(final Edge element, final Property 
oldValue, final Object setValue) {
+                assertEquals(e.label(), element.label());
+                assertEquals(e.inVertex().id(), element.inVertex().id());
+                assertEquals(e.outVertex().id(), element.outVertex().id());
+                assertEquals(null, oldValue.value());
+                assertEquals("new", oldValue.key());
+                assertEquals("yay!", setValue);
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> gts.E(e).property("new","yay!").iterate());
+
+        assertEquals(2, IteratorUtils.count(e.properties()));
+        assertThat(triggered.get(), is(true));
+    }
+
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.SIMPLE)
+    public void shouldDetachEdgeWhenRemoved() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final Edge e = v.addEdge("self", v, "dropped", "yay!");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void edgeRemoved(final Edge element) {
+                assertEquals(e.label(), element.label());
+                assertEquals(e.inVertex().id(), element.inVertex().id());
+                assertEquals(e.outVertex().id(), element.outVertex().id());
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> gts.E(e).drop().iterate());
+
+        assertVertexEdgeCounts(graph, 1, 0);
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.SIMPLE)
+    public void shouldDetachEdgeWhenAdded() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void edgeAdded(final Edge element) {
+                assertEquals("self", element.label());
+                assertEquals(v.id(), element.inVertex().id());
+                assertEquals(v.id(), element.outVertex().id());
+                assertEquals("there", element.value("here"));
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> gts.V(v).as("a").addE("self").property("here", 
"there").from("a").to("a").iterate());
+
+        assertVertexEdgeCounts(graph, 1, 1);
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    public void shouldDetachVertexPropertyWhenRemoved() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        final VertexProperty vp = v.property("to-remove","blah");
+        final VertexProperty vpToKeep = v.property("to-keep","dah");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexPropertyRemoved(final VertexProperty element) {
+                assertEquals(vp.label(), element.label());
+                assertEquals(vp.value(), element.value());
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> 
gts.V(v).properties("to-remove").drop().iterate());
+
+        assertEquals(1, IteratorUtils.count(v.properties()));
+        assertEquals(vpToKeep.value(), v.value("to-keep"));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    public void shouldDetachVertexPropertyWhenChanged() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        v.property("to-change", "blah");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexPropertyChanged(final Vertex element, final 
Property oldValue, final Object setValue, final Object... 
vertexPropertyKeyValues) {
+                assertEquals(v.label(), element.label());
+                assertEquals(v.id(), element.id());
+                assertEquals("to-change", oldValue.key());
+                assertEquals("blah", oldValue.value());
+                assertEquals("dah", setValue);
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> 
gts.V(v).property(VertexProperty.Cardinality.single, "to-change", 
"dah").iterate());
+
+        assertEquals(1, IteratorUtils.count(v.properties()));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    public void shouldDetachVertexPropertyWhenNew() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+        v.property("old","blah");
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexPropertyChanged(final Vertex element, final 
Property oldValue, final Object setValue, final Object... 
vertexPropertyKeyValues) {
+                assertEquals(v.label(), element.label());
+                assertEquals(v.id(), element.id());
+                assertEquals("new", oldValue.key());
+                assertEquals(null, oldValue.value());
+                assertEquals("dah", setValue);
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> 
gts.V(v).property(VertexProperty.Cardinality.single, "new", "dah").iterate());
+
+        assertEquals(2, IteratorUtils.count(v.properties()));
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    public void shouldDetachVertexWhenRemoved() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+        final Vertex v = graph.addVertex();
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexRemoved(final Vertex element) {
+                assertEquals(v.id(), element.id());
+                assertEquals(v.label(), element.label());
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> gts.V(v).drop().iterate());
+
+        assertVertexEdgeCounts(graph, 0, 0);
+        assertThat(triggered.get(), is(true));
+    }
+
+    @Test
+    @FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
+    public void shouldDetachVertexWhenAdded() {
+        final AtomicBoolean triggered = new AtomicBoolean(false);
+
+        final MutationListener listener = new AbstractMutationListener() {
+            @Override
+            public void vertexAdded(final Vertex element) {
+                assertEquals("thing", element.label());
+                assertEquals("there", element.value("here"));
+                triggered.set(true);
+            }
+        };
+        final EventStrategy.Builder builder = 
EventStrategy.build().addListener(listener);
+
+        if (graph.features().graph().supportsTransactions())
+            builder.eventQueue(new 
EventStrategy.TransactionalEventQueue(graph));
+
+        final EventStrategy eventStrategy = builder.create();
+        final GraphTraversalSource gts = create(eventStrategy);
+
+        tryCommit(graph, g -> gts.addV("thing").property("here", 
"there").iterate());
+
+        assertVertexEdgeCounts(graph, 1, 0);
+        assertThat(triggered.get(), is(true));
+    }
+
     private GraphTraversalSource create(final EventStrategy strategy) {
         return graphProvider.traversal(graph, strategy);
     }
 
-    public static class StubMutationListener implements MutationListener {
+    static abstract class AbstractMutationListener implements MutationListener 
{
+        @Override
+        public void vertexAdded(final Vertex vertex) {
+
+        }
+
+        @Override
+        public void vertexRemoved(final Vertex vertex) {
+
+        }
+
+        @Override
+        public void vertexPropertyChanged(final Vertex element, final Property 
oldValue, final Object setValue, final Object... vertexPropertyKeyValues) {
+
+        }
+
+        @Override
+        public void vertexPropertyRemoved(final VertexProperty vertexProperty) 
{
+
+        }
+
+        @Override
+        public void edgeAdded(final Edge edge) {
+
+        }
+
+        @Override
+        public void edgeRemoved(final Edge edge) {
+
+        }
+
+        @Override
+        public void edgePropertyChanged(final Edge element, final Property 
oldValue, final Object setValue) {
+
+        }
+
+        @Override
+        public void edgePropertyRemoved(final Edge element, final Property 
property) {
+
+        }
+
+        @Override
+        public void vertexPropertyPropertyChanged(final VertexProperty 
element, final Property oldValue, final Object setValue) {
+
+        }
+
+        @Override
+        public void vertexPropertyPropertyRemoved(final VertexProperty 
element, final Property property) {
+
+        }
+    }
+
+    static class StubMutationListener implements MutationListener {
         private final AtomicLong addEdgeEvent = new AtomicLong(0);
         private final AtomicLong addVertexEvent = new AtomicLong(0);
         private final AtomicLong vertexRemovedEvent = new AtomicLong(0);

Reply via email to