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 2015/11/09 14:24:39 UTC

[01/16] incubator-tinkerpop git commit: Made Transaction.onReadWrite() a ThreadLocal setting

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 82b2695b5 -> 8f2e2e555


Made Transaction.onReadWrite() a ThreadLocal setting


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

Branch: refs/heads/master
Commit: 8ea6aa25e8fb88f64c8b43572eb4e518233db4b1
Parents: 4fa22d8
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Tue Oct 20 14:29:44 2015 +0200
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Tue Oct 20 14:57:28 2015 +0200

----------------------------------------------------------------------
 .../upgrade-release-3.1.x-incubating.asciidoc   | 19 ++++++++++
 .../structure/util/AbstractTransaction.java     | 37 +++++++++++---------
 .../server/GremlinDriverIntegrateTest.java      |  7 +++-
 3 files changed, 45 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8ea6aa25/docs/src/upgrade-release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade-release-3.1.x-incubating.asciidoc b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
index a3d4e2a..e3d8115 100644
--- a/docs/src/upgrade-release-3.1.x-incubating.asciidoc
+++ b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
@@ -55,6 +55,15 @@ to closing where a user must now explicitly call `commit()` to persist their mut
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
 
+Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+The `Transaction.onReadWrite()` and `Transaction.onClose()` settings now need to be set for each thread (if another behavior than the default is desired).
+For gremlin-server users that may be changing these settings via scripts :
+If the settings are changed from a sessionless request they will now only apply to that one request.
+If the settings are changed from an in-session request they will now only apply to all future requests made in the scope of that session. 
+
+
 Upgrading for Providers
 ~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -73,3 +82,13 @@ previously asserted the opposite (i.e. commit on close).  These tests have been
 If these tests were referenced in an `OptOut`, then their names should be updated.
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
+
+Driver Implementers
+^^^^^^^^^^^^^^^^^^^
+
+Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+If your driver configures the `Transaction.onReadWrite()` or `Transaction.onClose()` settings, note that these no longer apply to all future requests. 
+If the settings are changed from a sessionless request they will only apply to that one request.
+If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8ea6aa25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
index 56c6f36..0ad24a6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
@@ -21,8 +21,6 @@ package org.apache.tinkerpop.gremlin.structure.util;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -37,18 +35,23 @@ import java.util.function.Function;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractTransaction implements Transaction {
-    protected Consumer<Transaction> readWriteConsumer;
-    protected Consumer<Transaction> closeConsumer;
-
+    protected static final ThreadLocal<Consumer<Transaction>> readWriteConsumer = 
+        new ThreadLocal<Consumer<Transaction>>() {
+            @Override protected Consumer<Transaction> initialValue() {
+                return READ_WRITE_BEHAVIOR.AUTO;
+            }
+        };
+    
+    protected static final ThreadLocal<Consumer<Transaction>> closeConsumer = 
+        new ThreadLocal<Consumer<Transaction>>() {
+            @Override protected Consumer<Transaction> initialValue() {
+                return CLOSE_BEHAVIOR.ROLLBACK;
+            }
+        };
+    
     private Graph g;
 
     public AbstractTransaction(final Graph g) {
-        // auto transaction behavior
-        readWriteConsumer = READ_WRITE_BEHAVIOR.AUTO;
-
-        // default is to rollback transactions on close
-        closeConsumer = CLOSE_BEHAVIOR.ROLLBACK;
-
         this.g = g;
     }
 
@@ -100,7 +103,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void commit() {
-        readWriteConsumer.accept(this);
+        readWriteConsumer.get().accept(this);
         try {
             doCommit();
             fireOnCommit();
@@ -114,7 +117,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void rollback() {
-        readWriteConsumer.accept(this);
+        readWriteConsumer.get().accept(this);
         try {
             doRollback();
             fireOnRollback();
@@ -143,7 +146,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void readWrite() {
-        readWriteConsumer.accept(this);
+        readWriteConsumer.get().accept(this);
     }
 
     /**
@@ -151,7 +154,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void close() {
-        closeConsumer.accept(this);
+        closeConsumer.get().accept(this);
     }
 
     /**
@@ -159,7 +162,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public synchronized Transaction onReadWrite(final Consumer<Transaction> consumer) {
-        readWriteConsumer = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull);
+        readWriteConsumer.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
         return this;
     }
 
@@ -168,7 +171,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public synchronized Transaction onClose(final Consumer<Transaction> consumer) {
-        closeConsumer = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onCloseBehaviorCannotBeNull);
+        closeConsumer.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onCloseBehaviorCannotBeNull));
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8ea6aa25/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
index 575f96e..2076cbd 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
@@ -589,7 +589,7 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
 
         final Cluster cluster = Cluster.build().create();
         final Client client = cluster.connect(name.getMethodName());
-
+        final Client sessionlessClient = cluster.connect();
         client.submit("graph.tx().onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);null").all().get();
         client.submit("graph.tx().open()").all().get();
 
@@ -604,6 +604,11 @@ public class GremlinDriverIntegrateTest extends AbstractGremlinServerIntegration
 
         client.submit("v.property(\"color\",\"blue\")").all().get();
         client.submit("graph.tx().commit()").all().get();
+        
+        // Run a sessionless request to change transaction.readWriteConsumer back to AUTO
+        // The will make the next in session request fail if consumers aren't ThreadLocal
+        sessionlessClient.submit("graph.vertices().next()").all().get();
+        
         client.submit("graph.tx().open()").all().get();
 
         final Vertex vertexAfterTx = client.submit("graph.vertices().next()").all().get().get(0).getVertex();


[06/16] incubator-tinkerpop git commit: moved logic to AbstractThreadLocalTransaction and added a couple of tests

Posted by sp...@apache.org.
moved logic to AbstractThreadLocalTransaction and added a couple of tests


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

Branch: refs/heads/master
Commit: 3938caed7fd0eb62453a2a2deb716e283c4b79a7
Parents: 35e97f0
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Sun Oct 25 13:45:35 2015 +0100
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Fri Nov 6 11:18:11 2015 +0100

----------------------------------------------------------------------
 .../util/AbstractThreadLocalTransaction.java    | 38 +++++++-
 .../util/AbstractThreadedTransaction.java       | 29 +++++-
 .../structure/util/AbstractTransaction.java     | 50 +++++++----
 .../gremlin/structure/TransactionTest.java      | 94 ++++++++++++++++++++
 4 files changed, 189 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3938caed/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
index b47eb79..3109215 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.structure.Transaction;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.function.Consumer;
 
 /**
@@ -36,7 +37,20 @@ import java.util.function.Consumer;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractThreadLocalTransaction extends AbstractTransaction {
-
+protected static final ThreadLocal<Consumer<Transaction>> readWriteConsumerInternal = 
+        new ThreadLocal<Consumer<Transaction>>() {
+            @Override protected Consumer<Transaction> initialValue() {
+                return READ_WRITE_BEHAVIOR.AUTO;
+            }
+        };
+    
+    protected static final ThreadLocal<Consumer<Transaction>> closeConsumerInternal = 
+        new ThreadLocal<Consumer<Transaction>>() {
+            @Override protected Consumer<Transaction> initialValue() {
+                return CLOSE_BEHAVIOR.ROLLBACK;
+            }
+        };
+    
     protected final ThreadLocal<List<Consumer<Transaction.Status>>> transactionListeners = new ThreadLocal<List<Consumer<Transaction.Status>>>() {
         @Override
         protected List<Consumer<Transaction.Status>> initialValue() {
@@ -72,4 +86,26 @@ public abstract class AbstractThreadLocalTransaction extends AbstractTransaction
     public void clearTransactionListeners() {
         transactionListeners.get().clear();
     }
+    
+    @Override
+    public void doReadWrite() {
+        readWriteConsumerInternal.get().accept(this);
+    }
+    
+    @Override
+    public void doClose() {
+        closeConsumerInternal.get().accept(this);
+        closeConsumerInternal.remove();
+        readWriteConsumerInternal.remove();
+    }
+    
+    @Override
+    public void setReadWrite(final Consumer<Transaction> consumer) {
+        readWriteConsumerInternal.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+    }
+    
+    @Override
+    public void setClose(final Consumer<Transaction> consumer) {
+        closeConsumerInternal.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3938caed/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
index 57f8ec0..246734a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Consumer;
 
@@ -38,8 +39,12 @@ import java.util.function.Consumer;
 public abstract class AbstractThreadedTransaction extends AbstractTransaction {
 
     protected final List<Consumer<Status>> transactionListeners = new CopyOnWriteArrayList<>();
-
-    public AbstractThreadedTransaction(final Graph g) {
+    
+    protected Consumer<Transaction> readWriteConsumerInternal = READ_WRITE_BEHAVIOR.AUTO;
+    
+    protected Consumer<Transaction> closeConsumerInternal = CLOSE_BEHAVIOR.ROLLBACK;
+    
+     public AbstractThreadedTransaction(final Graph g) {
         super(g);
     }
 
@@ -67,4 +72,24 @@ public abstract class AbstractThreadedTransaction extends AbstractTransaction {
     public void clearTransactionListeners() {
         transactionListeners.clear();
     }
+    
+    @Override
+    public void doReadWrite() {
+        readWriteConsumerInternal.accept(this);
+    }
+    
+    @Override
+    public void doClose() {
+        closeConsumerInternal.accept(this);
+    }
+    
+    @Override
+    public void setReadWrite(final Consumer<Transaction> consumer) {
+        readWriteConsumerInternal = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull);
+    }
+    
+    @Override
+    public void setClose(final Consumer<Transaction> consumer) {
+        closeConsumerInternal = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3938caed/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
index 0ad24a6..de7b6ee 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
@@ -35,19 +35,6 @@ import java.util.function.Function;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractTransaction implements Transaction {
-    protected static final ThreadLocal<Consumer<Transaction>> readWriteConsumer = 
-        new ThreadLocal<Consumer<Transaction>>() {
-            @Override protected Consumer<Transaction> initialValue() {
-                return READ_WRITE_BEHAVIOR.AUTO;
-            }
-        };
-    
-    protected static final ThreadLocal<Consumer<Transaction>> closeConsumer = 
-        new ThreadLocal<Consumer<Transaction>>() {
-            @Override protected Consumer<Transaction> initialValue() {
-                return CLOSE_BEHAVIOR.ROLLBACK;
-            }
-        };
     
     private Graph g;
 
@@ -86,6 +73,31 @@ public abstract class AbstractTransaction implements Transaction {
      * {@link #addTransactionListener(Consumer)}.
      */
     protected abstract void fireOnRollback();
+    
+    
+    /**
+     * Called {@link #readWrite}.  
+     * Implementers should run their readWrite consumer here.
+     */
+    protected abstract void doReadWrite();
+    
+    /**
+     * Called {@link #close}.  
+     * Implementers should run their readWrite consumer here.
+     */
+    protected abstract void doClose();
+    
+    /**
+     * Called {@link #onReadWrite}.  
+     * Implementers should set their readWrite consumer here.
+     */
+    protected abstract void setReadWrite(final Consumer<Transaction> consumer);
+    
+    /**
+     * Called {@link #onClose}.  
+     * Implementers should set their close consumer here.
+     */
+    protected abstract void setClose(final Consumer<Transaction> consumer);
 
     /**
      * {@inheritDoc}
@@ -103,7 +115,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void commit() {
-        readWriteConsumer.get().accept(this);
+        readWrite();
         try {
             doCommit();
             fireOnCommit();
@@ -117,7 +129,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void rollback() {
-        readWriteConsumer.get().accept(this);
+        readWrite();
         try {
             doRollback();
             fireOnRollback();
@@ -146,7 +158,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void readWrite() {
-        readWriteConsumer.get().accept(this);
+        doReadWrite();
     }
 
     /**
@@ -154,7 +166,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void close() {
-        closeConsumer.get().accept(this);
+        doClose();
     }
 
     /**
@@ -162,7 +174,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public synchronized Transaction onReadWrite(final Consumer<Transaction> consumer) {
-        readWriteConsumer.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+        setReadWrite(consumer);
         return this;
     }
 
@@ -171,7 +183,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public synchronized Transaction onClose(final Consumer<Transaction> consumer) {
-        closeConsumer.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onCloseBehaviorCannotBeNull));
+        setClose(consumer);
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3938caed/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
index 2395d9a..0157be2 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
@@ -36,6 +36,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import static org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
 import static org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS;
@@ -1042,4 +1044,96 @@ public class TransactionTest extends AbstractGremlinTest {
 
         g.tx().rollback();
     }
+    
+    @Test
+    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS)
+    public void shouldShareTransactionConsumersAccrossThreads() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(2);
+        final AtomicBoolean openOccured1 = new AtomicBoolean(false);
+        final AtomicBoolean openOccured2 = new AtomicBoolean(false);
+        
+        final Thread t1 = new Thread(() -> {
+            try {
+                g.tx().onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);
+            
+                latch.countDown();
+                latch.await();
+                g.tx().open();
+                openOccured1.set(true);
+            } catch (Exception ex) {
+                openOccured1.set(false);
+            }
+            
+        });
+        
+        final Thread t2 = new Thread(() -> {
+            try {
+                
+                latch.countDown();
+                latch.await();
+                g.tx().open();
+                openOccured2.set(true);
+            } catch (Exception ex) {
+                openOccured2.set(false);
+            }
+            
+        });
+        
+        t1.start();
+        t2.start();
+        t1.join();
+        t2.join();
+        
+        assertTrue(
+                "Thread t1 transaction should have been set to MANUAL and capable of opening a transaction",
+                openOccured1.get()
+        );
+        assertTrue(
+                "Thread t2 transation should have been set to MANUAL and capable of opening a transaction",
+                openOccured2.get()
+        );
+    }
+    
+    @Test
+    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_THREADED_TRANSACTIONS)
+    public void shouldNotShareTransactionConsumersAccrossThreads() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(2);
+        final AtomicBoolean openOccured1 = new AtomicBoolean(false);
+        final AtomicBoolean openOccured2 = new AtomicBoolean(false);
+        
+        final Thread t1 = new Thread(() -> {
+            try {
+                g.tx().onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);
+            
+                latch.countDown();
+                latch.await();
+                g.tx().open();
+                openOccured1.set(true);
+            } catch (Exception ex) {
+                openOccured1.set(false);
+            }
+            
+        });
+        
+        final Thread t2 = new Thread(() -> {
+            try {
+                
+                latch.countDown();
+                latch.await();
+                g.tx().open();
+                openOccured2.set(true);
+            } catch (Exception ex) {
+                openOccured2.set(false);
+            }
+            
+        });
+        
+        t1.start();
+        t2.start();
+        t1.join();
+        t2.join();
+        
+        assertTrue("Thread t1 transaction should have been set to MANUAL and capable of opening a transaction", openOccured1.get());
+        assertTrue("Thread t2 transaction should have been set to MANUAL and capable of opening a transaction", !openOccured2.get());
+    }
 }


[07/16] incubator-tinkerpop git commit: moved logic to AbstractThreadLocalTransaction and added a couple of tests

Posted by sp...@apache.org.
moved logic to AbstractThreadLocalTransaction and added a couple of tests


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

Branch: refs/heads/master
Commit: 46f821a846abc4fceb776f11c3b25888f01d60ef
Parents: 35e97f0
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Sun Oct 25 13:45:35 2015 +0100
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Fri Nov 6 20:16:41 2015 +0100

----------------------------------------------------------------------
 .../util/AbstractThreadLocalTransaction.java    |  38 +++-
 .../util/AbstractThreadedTransaction.java       |  29 +++-
 .../structure/util/AbstractTransaction.java     |  50 ++++--
 .../gremlin/structure/TransactionTest.java      | 174 +++++++++++++++++++
 4 files changed, 269 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/46f821a8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
index b47eb79..3109215 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.structure.Transaction;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.function.Consumer;
 
 /**
@@ -36,7 +37,20 @@ import java.util.function.Consumer;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractThreadLocalTransaction extends AbstractTransaction {
-
+protected static final ThreadLocal<Consumer<Transaction>> readWriteConsumerInternal = 
+        new ThreadLocal<Consumer<Transaction>>() {
+            @Override protected Consumer<Transaction> initialValue() {
+                return READ_WRITE_BEHAVIOR.AUTO;
+            }
+        };
+    
+    protected static final ThreadLocal<Consumer<Transaction>> closeConsumerInternal = 
+        new ThreadLocal<Consumer<Transaction>>() {
+            @Override protected Consumer<Transaction> initialValue() {
+                return CLOSE_BEHAVIOR.ROLLBACK;
+            }
+        };
+    
     protected final ThreadLocal<List<Consumer<Transaction.Status>>> transactionListeners = new ThreadLocal<List<Consumer<Transaction.Status>>>() {
         @Override
         protected List<Consumer<Transaction.Status>> initialValue() {
@@ -72,4 +86,26 @@ public abstract class AbstractThreadLocalTransaction extends AbstractTransaction
     public void clearTransactionListeners() {
         transactionListeners.get().clear();
     }
+    
+    @Override
+    public void doReadWrite() {
+        readWriteConsumerInternal.get().accept(this);
+    }
+    
+    @Override
+    public void doClose() {
+        closeConsumerInternal.get().accept(this);
+        closeConsumerInternal.remove();
+        readWriteConsumerInternal.remove();
+    }
+    
+    @Override
+    public void setReadWrite(final Consumer<Transaction> consumer) {
+        readWriteConsumerInternal.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+    }
+    
+    @Override
+    public void setClose(final Consumer<Transaction> consumer) {
+        closeConsumerInternal.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/46f821a8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
index 57f8ec0..246734a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Consumer;
 
@@ -38,8 +39,12 @@ import java.util.function.Consumer;
 public abstract class AbstractThreadedTransaction extends AbstractTransaction {
 
     protected final List<Consumer<Status>> transactionListeners = new CopyOnWriteArrayList<>();
-
-    public AbstractThreadedTransaction(final Graph g) {
+    
+    protected Consumer<Transaction> readWriteConsumerInternal = READ_WRITE_BEHAVIOR.AUTO;
+    
+    protected Consumer<Transaction> closeConsumerInternal = CLOSE_BEHAVIOR.ROLLBACK;
+    
+     public AbstractThreadedTransaction(final Graph g) {
         super(g);
     }
 
@@ -67,4 +72,24 @@ public abstract class AbstractThreadedTransaction extends AbstractTransaction {
     public void clearTransactionListeners() {
         transactionListeners.clear();
     }
+    
+    @Override
+    public void doReadWrite() {
+        readWriteConsumerInternal.accept(this);
+    }
+    
+    @Override
+    public void doClose() {
+        closeConsumerInternal.accept(this);
+    }
+    
+    @Override
+    public void setReadWrite(final Consumer<Transaction> consumer) {
+        readWriteConsumerInternal = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull);
+    }
+    
+    @Override
+    public void setClose(final Consumer<Transaction> consumer) {
+        closeConsumerInternal = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/46f821a8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
index 0ad24a6..de7b6ee 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
@@ -35,19 +35,6 @@ import java.util.function.Function;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractTransaction implements Transaction {
-    protected static final ThreadLocal<Consumer<Transaction>> readWriteConsumer = 
-        new ThreadLocal<Consumer<Transaction>>() {
-            @Override protected Consumer<Transaction> initialValue() {
-                return READ_WRITE_BEHAVIOR.AUTO;
-            }
-        };
-    
-    protected static final ThreadLocal<Consumer<Transaction>> closeConsumer = 
-        new ThreadLocal<Consumer<Transaction>>() {
-            @Override protected Consumer<Transaction> initialValue() {
-                return CLOSE_BEHAVIOR.ROLLBACK;
-            }
-        };
     
     private Graph g;
 
@@ -86,6 +73,31 @@ public abstract class AbstractTransaction implements Transaction {
      * {@link #addTransactionListener(Consumer)}.
      */
     protected abstract void fireOnRollback();
+    
+    
+    /**
+     * Called {@link #readWrite}.  
+     * Implementers should run their readWrite consumer here.
+     */
+    protected abstract void doReadWrite();
+    
+    /**
+     * Called {@link #close}.  
+     * Implementers should run their readWrite consumer here.
+     */
+    protected abstract void doClose();
+    
+    /**
+     * Called {@link #onReadWrite}.  
+     * Implementers should set their readWrite consumer here.
+     */
+    protected abstract void setReadWrite(final Consumer<Transaction> consumer);
+    
+    /**
+     * Called {@link #onClose}.  
+     * Implementers should set their close consumer here.
+     */
+    protected abstract void setClose(final Consumer<Transaction> consumer);
 
     /**
      * {@inheritDoc}
@@ -103,7 +115,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void commit() {
-        readWriteConsumer.get().accept(this);
+        readWrite();
         try {
             doCommit();
             fireOnCommit();
@@ -117,7 +129,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void rollback() {
-        readWriteConsumer.get().accept(this);
+        readWrite();
         try {
             doRollback();
             fireOnRollback();
@@ -146,7 +158,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void readWrite() {
-        readWriteConsumer.get().accept(this);
+        doReadWrite();
     }
 
     /**
@@ -154,7 +166,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public void close() {
-        closeConsumer.get().accept(this);
+        doClose();
     }
 
     /**
@@ -162,7 +174,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public synchronized Transaction onReadWrite(final Consumer<Transaction> consumer) {
-        readWriteConsumer.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+        setReadWrite(consumer);
         return this;
     }
 
@@ -171,7 +183,7 @@ public abstract class AbstractTransaction implements Transaction {
      */
     @Override
     public synchronized Transaction onClose(final Consumer<Transaction> consumer) {
-        closeConsumer.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onCloseBehaviorCannotBeNull));
+        setClose(consumer);
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/46f821a8/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
index 2395d9a..eae224f 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
@@ -36,6 +36,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import static org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
 import static org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS;
@@ -1042,4 +1044,176 @@ public class TransactionTest extends AbstractGremlinTest {
 
         g.tx().rollback();
     }
+    
+    @Test
+    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS)
+    public void shouldNotShareTransactionReadWriteConsumersAccrossThreads() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final AtomicBoolean commitFailed = new AtomicBoolean(false);
+        final AtomicBoolean commitOccured = new AtomicBoolean(false);
+        
+        final Thread manualThread = new Thread(() -> {
+            graph.tx().onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);
+            try {
+                latch.await();
+            } catch (InterruptedException ie) {
+                throw new RuntimeException(ie);
+            }
+            
+            try{
+                graph.tx().commit();
+                commitFailed.set(false);
+            } catch (Exception ex) {
+                commitFailed.set(true);
+            }
+        });
+        
+        manualThread.start();
+        
+        final Thread autoThread = new Thread(() -> {
+            latch.countDown();
+            try {
+                graph.tx().commit();
+                commitOccured.set(true);
+            } catch (Exception ex) {
+                commitOccured.set(false);
+            }
+        });
+        
+        autoThread.start();
+        
+        manualThread.join();
+        autoThread.join();
+        
+        assertTrue(
+                "manualThread transaction readWrite should be MANUAL and should fail to commit the transaction",
+                commitFailed.get()
+        );
+        assertTrue(
+                "autoThread transaction readWrite should be AUTO and should commit the transaction",
+                commitOccured.get()
+        );
+    }
+    
+    @Test
+    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS)
+    public void shouldNotShareTransactionCloseConsumersAccrossThreads() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        
+        final Thread manualThread = new Thread(() -> {
+            graph.tx().onClose(Transaction.CLOSE_BEHAVIOR.COMMIT);
+            try {
+                latch.await();
+            } catch (InterruptedException ie) {
+                throw new RuntimeException(ie);
+            }
+        });
+        
+        manualThread.start();
+        
+        final Thread autoThread = new Thread(() -> {
+            latch.countDown();
+            graph.addVertex();
+            graph.tx().close();
+        });
+        
+        autoThread.start();
+        
+        manualThread.join();
+        autoThread.join();
+        
+        assertEquals(
+                "Graph should be empty. autoThread transaction.onClose() should be ROLLBACK (default)",
+                0,
+                IteratorUtils.count(graph.vertices())
+        );
+    }
+    
+    @Test
+    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_THREADED_TRANSACTIONS)
+    public void shouldShareTransactionReadWriteConsumersAccrossThreads() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final AtomicBoolean commitFailed = new AtomicBoolean(false);
+        final AtomicBoolean commitFailedAgain = new AtomicBoolean(false);
+        
+        final Thread manualThread = new Thread(() -> {
+            Transaction tx = graph.tx().createThreadedTx();
+            tx.onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);
+            try {
+                latch.await();
+            } catch (InterruptedException ie) {
+                throw new RuntimeException(ie);
+            }
+            
+            try{
+                tx.commit();
+                commitFailed.set(false);
+            } catch (Exception ex) {
+                commitFailed.set(true);
+            }
+        });
+        
+        manualThread.start();
+        
+        final Thread autoThread = new Thread(() -> {
+            latch.countDown();
+            Transaction tx = graph.tx().createThreadedTx();
+            try {
+                tx.commit();
+                commitFailedAgain.set(false);
+            } catch (Exception ex) {
+                commitFailedAgain.set(true);
+            }
+        });
+        
+        autoThread.start();
+        
+        manualThread.join();
+        autoThread.join();
+        
+        assertTrue(
+                "manualThread transaction readWrite should be MANUAL and should fail to commit the transaction",
+                commitFailed.get()
+        );
+        assertTrue(
+                "autoThread transaction readWrite should be AUTO and should commit the transaction",
+                commitFailedAgain.get()
+        );
+    }
+    
+    @Test
+    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_THREADED_TRANSACTIONS)
+    public void shouldShareTransactionCloseConsumersAccrossThreads() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        
+        final Thread manualThread = new Thread(() -> {
+            Transaction tx = graph.tx().createThreadedTx();
+            tx.onClose(Transaction.CLOSE_BEHAVIOR.COMMIT);
+            try {
+                latch.await();
+            } catch (InterruptedException ie) {
+                throw new RuntimeException(ie);
+            }
+        });
+        
+        manualThread.start();
+        
+        final Thread autoThread = new Thread(() -> {
+            latch.countDown();
+            Transaction tx = graph.tx().createThreadedTx();
+            graph.addVertex();
+            tx.close();
+        });
+        
+        autoThread.start();
+        
+        manualThread.join();
+        autoThread.join();
+        
+        assertEquals(
+                "Graph should contain elements. autoThread.onClose() should be COMMIT.",
+                1,
+                IteratorUtils.count(graph.vertices())
+        );
+    }
 }


[04/16] incubator-tinkerpop git commit: moved Driver implementor section down in it's correct position

Posted by sp...@apache.org.
moved Driver implementor section down in it's correct position


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

Branch: refs/heads/master
Commit: 35e97f08e4359c0ae09f431c7680f8c13567549b
Parents: 285bd28
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Wed Oct 21 14:37:19 2015 +0200
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Wed Oct 21 14:37:19 2015 +0200

----------------------------------------------------------------------
 docs/src/upgrade-release-3.1.x-incubating.asciidoc | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/35e97f08/docs/src/upgrade-release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade-release-3.1.x-incubating.asciidoc b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
index d031b2d..e42be2b 100644
--- a/docs/src/upgrade-release-3.1.x-incubating.asciidoc
+++ b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
@@ -121,6 +121,11 @@ If these tests were referenced in an `OptOut`, then their names should be update
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
 
+Graph Traversal Updates
++++++++++++++++++++++++
+
+There were numerous changes to the `GraphTraversal` API. Nearly all changes are backwards compatible with respective "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
+
 Driver Implementers
 ^^^^^^^^^^^^^^^^^^^
 
@@ -129,9 +134,4 @@ Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settin
 
 If your driver configures the `Transaction.onReadWrite()` or `Transaction.onClose()` settings, note that these no longer apply to all future requests. 
 If the settings are changed from a sessionless request they will only apply to that one request.
-If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 
-
-Graph Traversal Updates
-+++++++++++++++++++++++
-
-There were numerous changes to the `GraphTraversal` API. Nearly all changes are backwards compatible with respective "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
+If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 
\ No newline at end of file


[11/16] incubator-tinkerpop git commit: Merge branch 'TINKERPOP-885' of https://github.com/PommeVerte/incubator-tinkerpop into TINKERPOP3-885

Posted by sp...@apache.org.
Merge branch 'TINKERPOP-885' of https://github.com/PommeVerte/incubator-tinkerpop into TINKERPOP3-885


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

Branch: refs/heads/master
Commit: 1aa1b5ac739a35ab1872ee5602a55c33cf035f29
Parents: 9881e6e 789d6f7
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Nov 6 18:55:42 2015 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Fri Nov 6 18:55:42 2015 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  16 +-
 CONTRIBUTING.asciidoc                           | 236 +-----
 RELEASE.asciidoc                                | 172 -----
 docs/src/acknowledgements.asciidoc              |  19 +-
 docs/src/conclusion.asciidoc                    |   6 +-
 docs/src/developer-administration.asciidoc      |  91 +++
 docs/src/developer-contributing.asciidoc        | 308 ++++++++
 docs/src/developer-meetings.asciidoc            |  64 ++
 docs/src/developer-release.asciidoc             | 171 +++++
 docs/src/developer.asciidoc                     |  33 +
 docs/src/gremlin-applications.asciidoc          | 721 +++++++++++++++----
 docs/src/implementations.asciidoc               | 562 +++++++++++----
 docs/src/intro.asciidoc                         | 173 ++++-
 docs/src/preface.asciidoc                       |  42 +-
 docs/src/the-graph.asciidoc                     | 245 +++++--
 docs/src/the-graphcomputer.asciidoc             | 201 +++++-
 docs/src/the-traversal.asciidoc                 | 666 ++++++++++++-----
 .../upgrade-release-3.1.x-incubating.asciidoc   | 127 +++-
 docs/static/images/gremlin-gym.pdf              | Bin 0 -> 963978 bytes
 docs/static/images/gremlin-gym.png              | Bin 0 -> 273111 bytes
 docs/static/images/gremlin-standing-strong.png  | Bin 0 -> 30985 bytes
 .../images/keep-on-traversin-tiedye-title.png   | Bin 0 -> 943206 bytes
 docs/static/images/keep-on-traversin-tiedye.png | Bin 0 -> 581914 bytes
 docs/static/images/keep-on-traversin-title.png  | Bin 0 -> 669529 bytes
 docs/static/images/keep-on-traversin.png        | Bin 0 -> 400941 bytes
 docs/static/images/not-tinkerpop3-gremlin.png   | Bin 0 -> 186676 bytes
 docs/static/images/provider-integration.png     | Bin 372429 -> 226464 bytes
 docs/static/images/quantum-gremlin.png          | Bin 0 -> 69142 bytes
 docs/static/images/tinkerpop3.graffle           | 236 +++---
 .../process/computer/GiraphGraphComputer.java   |  16 +-
 .../computer/io/GiraphVertexInputFormat.java    |  70 --
 .../computer/io/GiraphVertexOutputFormat.java   |  65 --
 .../process/computer/io/GiraphVertexReader.java |  67 --
 .../process/computer/io/GiraphVertexWriter.java |  57 --
 .../structure/io/GiraphVertexInputFormat.java   |  70 ++
 .../structure/io/GiraphVertexOutputFormat.java  |  65 ++
 .../giraph/structure/io/GiraphVertexReader.java |  67 ++
 .../giraph/structure/io/GiraphVertexWriter.java |  57 ++
 .../GephiTraversalVisualizationStrategy.groovy  |   2 +-
 .../gremlin/process/computer/GraphComputer.java |  19 +-
 .../computer/bulkloading/BulkLoader.java        |  31 +
 .../bulkloading/BulkLoaderVertexProgram.java    | 115 ++-
 .../bulkloading/IncrementalBulkLoader.java      |  14 +-
 .../traversal/TraversalVertexProgram.java       |   4 +-
 .../gremlin/process/traversal/NumberHelper.java | 288 ++++++++
 .../gremlin/process/traversal/Operator.java     |  78 +-
 .../traversal/dsl/graph/GraphTraversal.java     |  23 +-
 .../dsl/graph/GraphTraversalSource.java         |  10 +-
 .../gremlin/process/traversal/dsl/graph/__.java |   9 +-
 .../process/traversal/lambda/LoopTraversal.java |   4 +
 .../traversal/step/branch/RepeatStep.java       |   8 +
 .../process/traversal/step/map/GraphStep.java   | 149 ++++
 .../process/traversal/step/map/MatchStep.java   |  46 +-
 .../traversal/step/map/MaxGlobalStep.java       |  14 +-
 .../traversal/step/map/MaxLocalStep.java        |   5 +-
 .../traversal/step/map/MeanGlobalStep.java      |  61 +-
 .../traversal/step/map/MeanLocalStep.java       |  11 +-
 .../traversal/step/map/MinGlobalStep.java       |  14 +-
 .../traversal/step/map/MinLocalStep.java        |   5 +-
 .../traversal/step/map/SumGlobalStep.java       |  25 +-
 .../traversal/step/map/SumLocalStep.java        |   5 +-
 .../traversal/step/sideEffect/GraphStep.java    | 101 ---
 .../step/util/TraversalComparator.java          |   5 +-
 .../strategy/decoration/ConnectiveStrategy.java |   3 +-
 .../strategy/decoration/ElementIdStrategy.java  |   2 +-
 .../strategy/decoration/PartitionStrategy.java  |   2 +-
 .../strategy/decoration/SubgraphStrategy.java   |   2 +-
 .../finalization/LazyBarrierStrategy.java       |   2 +-
 .../ComputerVerificationStrategy.java           |  39 +-
 .../process/traversal/util/TraversalHelper.java |   3 +
 .../util/AbstractThreadLocalTransaction.java    |  38 +-
 .../util/AbstractThreadedTransaction.java       |  29 +-
 .../structure/util/AbstractTransaction.java     |  50 +-
 .../traversal/OperatorExceptionTest.java        |  39 +-
 .../gremlin/process/traversal/OperatorTest.java | 100 ++-
 .../traversal/step/map/GraphStepTest.java       |  41 ++
 .../traversal/step/map/MatchStepTest.java       |  82 ++-
 .../traversal/step/map/MeanGlobalStepTest.java  |  14 +
 .../traversal/step/map/MeanLocalStepTest.java   |  14 +
 .../ElementIdStrategyTraverseTest.java          |   4 +-
 .../PartitionStrategyTraverseTest.java          |   4 +-
 .../SubgraphStrategyTraverseTest.java           |   5 +-
 .../apache/tinkerpop/gremlin/driver/Client.java |  71 +-
 .../apache/tinkerpop/gremlin/driver/Tokens.java |   6 +
 .../driver/ser/GryoMessageSerializerV1d0.java   |  13 +-
 .../gremlin/driver/AbstractResultQueueTest.java |  23 +
 .../gremlin/driver/ResultQueueTest.java         |  15 +-
 .../ser/GryoMessageSerializerV1d0Test.java      |  55 ++
 .../traversal/step/map/GroovyGraphTest.groovy   |  50 ++
 .../traversal/step/map/GroovyOrderTest.groovy   |  10 +
 .../step/sideEffect/GroovyGroupTest.groovy      |   2 +-
 .../step/sideEffect/GroovySackTest.groovy       |   4 +-
 .../process/GroovyProcessComputerSuite.java     |   2 +
 .../process/GroovyProcessStandardSuite.java     |   2 +
 ...linGroovyScriptEngineTimedInterruptTest.java |  12 +-
 .../groovy/util/DependencyGrabberTest.java      |   8 +-
 gremlin-server/pom.xml                          |  25 +
 .../tinkerpop/gremlin/server/GremlinServer.java |  53 +-
 .../tinkerpop/gremlin/server/Settings.java      |   5 +
 .../handler/HttpGremlinEndpointHandler.java     |  47 +-
 .../handler/NioGremlinBinaryRequestDecoder.java |   5 +
 .../handler/WsGremlinBinaryRequestDecoder.java  |   5 +
 .../handler/WsGremlinCloseRequestDecoder.java   |   5 +
 .../handler/WsGremlinTextRequestDecoder.java    |   5 +
 .../server/op/AbstractEvalOpProcessor.java      |   2 +-
 .../server/op/session/SessionOpProcessor.java   |   9 +-
 .../server/op/standard/StandardOpProcessor.java |  20 +-
 .../AbstractGremlinServerIntegrationTest.java   |   7 +-
 .../server/GremlinDriverIntegrateTest.java      | 101 ++-
 .../server/GremlinServerAuthIntegrateTest.java  |  35 +
 .../server/GremlinServerHttpIntegrateTest.java  |  38 +-
 .../server/GremlinServerIntegrateTest.java      | 125 ++++
 .../gremlin/process/ProcessComputerSuite.java   |   2 +
 .../gremlin/process/ProcessStandardSuite.java   |   2 +
 .../process/computer/GraphComputerTest.java     |  34 +-
 .../traversal/step/map/AddVertexTest.java       |   2 +-
 .../process/traversal/step/map/GraphTest.java   | 109 +++
 .../process/traversal/step/map/OrderTest.java   |  58 +-
 .../process/traversal/step/map/SumTest.java     |   2 +-
 .../traversal/step/sideEffect/GroupTest.java    |  22 +-
 .../traversal/step/sideEffect/SackTest.java     |  20 +-
 .../PartitionStrategyProcessTest.java           |  13 +-
 ...ComputerVerificationStrategyProcessTest.java |   3 +-
 .../gremlin/structure/TransactionTest.java      | 174 +++++
 .../conf/hadoop-grateful-gryo.properties        |   2 +-
 .../tinkerpop/gremlin/hadoop/Constants.java     |   1 -
 .../structure/hdfs/HadoopElementIterator.java   |   4 +-
 .../hadoop/structure/io/HadoopPools.java        |   2 +-
 .../hadoop/structure/io/InputOutputHelper.java  |  22 +
 .../hadoop/structure/util/HadoopHelper.java     |  50 --
 .../groovy/plugin/HadoopGremlinPluginTest.java  |   2 +-
 neo4j-gremlin/pom.xml                           |  28 +-
 .../step/sideEffect/Neo4jGraphStep.java         |  10 +-
 .../optimization/Neo4jGraphStepStrategy.java    |  13 +-
 .../gremlin/neo4j/structure/Neo4jGraph.java     |   1 +
 .../gremlin/neo4j/structure/Neo4jHelper.java    |  16 +-
 .../traversal/strategy/Neo4jStrategySuite.java  |  44 ++
 .../traversal/strategy/Neo4jStrategyTest.java   |  32 +
 .../Neo4jGraphStepStrategyTest.java             |  76 ++
 pom.xml                                         |  34 +-
 .../process/computer/SparkGraphComputer.java    | 102 ++-
 .../process/computer/io/InputFormatRDD.java     |  47 --
 .../spark/process/computer/io/InputRDD.java     |  41 --
 .../process/computer/io/OutputFormatRDD.java    |  49 --
 .../spark/process/computer/io/OutputRDD.java    |  31 -
 .../spark/structure/io/InputFormatRDD.java      |  47 ++
 .../spark/structure/io/InputOutputHelper.java   |  81 +++
 .../gremlin/spark/structure/io/InputRDD.java    |  41 ++
 .../spark/structure/io/OutputFormatRDD.java     |  49 ++
 .../gremlin/spark/structure/io/OutputRDD.java   |  31 +
 .../spark/structure/io/PersistedInputRDD.java   |  60 ++
 .../spark/structure/io/PersistedOutputRDD.java  |  41 ++
 .../process/computer/LocalPropertyTest.java     | 100 +++
 .../process/computer/io/ExampleInputRDD.java    |  47 --
 .../process/computer/io/ExampleOutputRDD.java   |  45 --
 .../process/computer/io/InputOutputRDDTest.java |  59 --
 .../spark/process/computer/io/InputRDDTest.java |  54 --
 .../process/computer/io/OutputRDDTest.java      |  62 --
 .../spark/structure/io/ExampleInputRDD.java     |  51 ++
 .../spark/structure/io/ExampleOutputRDD.java    |  50 ++
 .../spark/structure/io/InputOutputRDDTest.java  |  60 ++
 .../spark/structure/io/InputRDDTest.java        |  55 ++
 .../spark/structure/io/OutputRDDTest.java       |  63 ++
 .../io/PersistedInputOutputRDDTest.java         | 216 ++++++
 .../step/sideEffect/TinkerGraphStep.java        |  10 +-
 .../optimization/TinkerGraphStepStrategy.java   |  13 +-
 .../tinkergraph/structure/TinkerFactory.java    |   8 +-
 .../tinkergraph/structure/TinkerGraph.java      |  59 +-
 .../tinkergraph/TinkerGraphProvider.java        |  14 +-
 .../strategy/TinkerGraphStrategySuite.java      |  44 ++
 .../strategy/TinkerGraphStrategyTest.java       |  32 +
 .../TinkerGraphStepStrategyTest.java            |  33 +-
 .../structure/TinkerGraphIdManagerTest.java     |  18 +-
 .../structure/TinkerGraphPlayTest.java          |  41 +-
 .../tinkergraph/structure/TinkerGraphTest.java  |  16 +-
 175 files changed, 6952 insertions(+), 2498 deletions(-)
----------------------------------------------------------------------



[02/16] incubator-tinkerpop git commit: Merge branch 'master' into TINKERPOP-886

Posted by sp...@apache.org.
Merge branch 'master' into TINKERPOP-886


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

Branch: refs/heads/master
Commit: 5b0dd760a7d1c8609ffda2a415c18d541b2e51ff
Parents: 8ea6aa2 17d4489
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Wed Oct 21 14:31:16 2015 +0200
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Wed Oct 21 14:31:16 2015 +0200

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   5 +
 docs/src/the-traversal.asciidoc                 |   4 +-
 .../upgrade-release-3.1.x-incubating.asciidoc   |  45 +++++
 .../gremlin/process/traversal/Traversal.java    |  10 +
 .../process/traversal/TraversalStrategies.java  |   4 +-
 .../traversal/dsl/graph/GraphTraversal.java     |   4 +-
 .../dsl/graph/GraphTraversalSource.java         |  49 ++---
 .../lambda/AbstractLambdaTraversal.java         |   7 +
 .../process/traversal/step/filter/AndStep.java  |   2 +-
 .../traversal/step/filter/ConjunctionStep.java  |  81 --------
 .../traversal/step/filter/ConnectiveStep.java   |  81 ++++++++
 .../process/traversal/step/filter/OrStep.java   |   2 +-
 .../step/filter/WherePredicateStep.java         |  10 +-
 .../step/filter/WhereTraversalStep.java         |   6 +-
 .../process/traversal/step/map/MatchStep.java   |  40 ++--
 .../traversal/step/util/PathIdentityStep.java   |  48 -----
 .../decoration/ConjunctionStrategy.java         | 114 ------------
 .../strategy/decoration/ConnectiveStrategy.java | 114 ++++++++++++
 .../AdjacentToIncidentStrategy.java             |   4 +-
 .../optimization/RangeByIsCountStrategy.java    |   6 +-
 .../B_LP_O_P_S_SE_SL_TraverserGenerator.java    |   8 +-
 .../B_LP_O_S_SE_SL_TraverserGenerator.java      |   8 +-
 .../B_O_S_SE_SL_TraverserGenerator.java         |   8 +-
 .../traverser/B_O_TraverserGenerator.java       |   6 +-
 .../traverser/LP_O_OB_P_S_SE_SL_Traverser.java  |  98 ++++++++++
 .../LP_O_OB_P_S_SE_SL_TraverserGenerator.java   |  62 +++++++
 .../traverser/LP_O_OB_S_SE_SL_Traverser.java    |  99 ++++++++++
 .../LP_O_OB_S_SE_SL_TraverserGenerator.java     |  61 +++++++
 .../traverser/O_OB_S_SE_SL_Traverser.java       | 137 ++++++++++++++
 .../O_OB_S_SE_SL_TraverserGenerator.java        |  59 ++++++
 .../traverser/O_TraverserGenerator.java         |   2 +-
 .../traverser/TraverserRequirement.java         |   8 +-
 .../util/DefaultTraverserGeneratorFactory.java  |  34 +++-
 .../gremlin/process/traversal/util/AndP.java    |   3 +-
 .../process/traversal/util/ConjunctionP.java    | 117 ------------
 .../process/traversal/util/ConnectiveP.java     | 115 ++++++++++++
 .../traversal/util/DefaultTraversal.java        |  27 +++
 .../process/traversal/util/EmptyTraversal.java  |   5 +
 .../gremlin/process/traversal/util/OrP.java     |   2 +-
 .../process/traversal/util/TraversalHelper.java |   4 +-
 .../gremlin/structure/io/gryo/GryoMapper.java   |  10 +-
 .../traversal/step/map/MatchStepTest.java       |   6 +-
 .../decoration/ConjunctionStrategyTest.java     | 183 -------------------
 .../decoration/ConnectiveStrategyTest.java      | 183 +++++++++++++++++++
 .../DefaultTraverserGeneratorFactoryTest.java   |  85 +++++++++
 .../step/sideEffect/GroovySackTest.groovy       |   5 +
 ...linGroovyScriptEngineTimedInterruptTest.java |   6 +-
 .../traversal/step/sideEffect/SackTest.java     |  25 ++-
 .../TinkerGraphNoStrategyComputerProvider.java  |   4 +-
 .../process/TinkerGraphNoStrategyProvider.java  |   4 +-
 50 files changed, 1352 insertions(+), 658 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5b0dd760/docs/src/upgrade-release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------
diff --cc docs/src/upgrade-release-3.1.x-incubating.asciidoc
index e3d8115,c2425a3..4dd1673
--- a/docs/src/upgrade-release-3.1.x-incubating.asciidoc
+++ b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
@@@ -55,14 -57,39 +57,50 @@@ to closing where a user must now explic
  
  See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
  
++<<<<<<< HEAD
 +Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 +
 +The `Transaction.onReadWrite()` and `Transaction.onClose()` settings now need to be set for each thread (if another behavior than the default is desired).
 +For gremlin-server users that may be changing these settings via scripts :
 +If the settings are changed from a sessionless request they will now only apply to that one request.
 +If the settings are changed from an in-session request they will now only apply to all future requests made in the scope of that session. 
 +
++=======
+ Gremlin Process
+ ^^^^^^^^^^^^^^^
+ 
+ Graph Traversal Updates
+ +++++++++++++++++++++++
+ 
+ * `ConjunctionStrategy` has been renamed to `ConnectiveStrategy` (no other behaviors changed).
+ * `ConjunctionP` has been renamed to `ConnectiveP` (no other behaviors changed).
+ * `DedupBijectionStrategy` has been renamed (and made more effective) as `FilterRankingStrategy`.
+ * The `GraphTraversal` mutation API has change significantly with all previous methods being supported but deprecated.
+ ** The general pattern used now is `addE('knows').from(select('a')).to(select('b')).property('weight',1.0)`.
+ * The `GraphTraversal` sack API has changed with all previous methods being supported but deprecated.
+ ** The old `sack(mult,'weight')` is now `sack(mult).by('weight')`.
+ * `GroupStep` has been redesigned such that there is now only a key- and value-traversal. No more reduce-traversal.
+ ** The previous `group()`-methods have been renamed to `groupV3d0()`. To immediately upgrade, rename all your `group()`-calls to `groupV3d0()`.
+ ** To migrate to the new `group()`-methods, what was `group().by('age').by(outE()).by(sum(local))` is now `group().by('age').by(outE().sum())`.
+ * There was a bug in `fold()`, where if a bulked traverser was provided, the traverser was only represented once.
+ ** This bug fix might cause a breaking change to a user query if the non-bulk behavior was being counted on. If so, used `dedup()` prior to `fold()`.
+ * Both `GraphTraversal().mapKeys()` and `GraphTraversal.mapValues()` has been deprecated.
+ ** Use `select(keys)` and `select(columns)`. However, note that `select()` will not unroll the keys/values. Thus, `mapKeys()` => `select(keys).unfold()`.
+ 
+ Gremlin-Groovy Updates
+ ++++++++++++++++++++++
+ 
+ * The closure wrappers classes `GFunction`, `GSupplier`, `GConsumer` have been deprecated.
+ ** In Groovy, a closure can be specified using `as Function` and thus, these wrappers are not needed.
+ 
+ Hadoop-Gremlin Updates
+ ++++++++++++++++++++++
+ 
+ * Hadoop1 is no longer supported. Hadoop2 is now the only supported Hadoop version in TinkerPop.
+ * The directory where application jars are stored in HDFS is now `hadoop-gremlin-x.y.z-libs`.
+ ** This versioning is important so that cross-version TinkerPop use does not cause jar conflicts.
++>>>>>>> master
  
  Upgrading for Providers
  ~~~~~~~~~~~~~~~~~~~~~~~
@@@ -83,12 -110,7 +121,19 @@@ If these tests were referenced in an `O
  
  See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
  
++<<<<<<< HEAD
 +Driver Implementers
 +^^^^^^^^^^^^^^^^^^^
 +
 +Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 +
 +If your driver configures the `Transaction.onReadWrite()` or `Transaction.onClose()` settings, note that these no longer apply to all future requests. 
 +If the settings are changed from a sessionless request they will only apply to that one request.
 +If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 
++=======
+ Graph Traversal Updates
+ +++++++++++++++++++++++
+ 
 -There were numerous changes to the `GraphTraversal` API. Nearly all changes are backwards compatible with respective "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
++There were numerous changes to the `GraphTraversal` API. Nearly all changes are backwards compatible with respective "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
++>>>>>>> master


[09/16] incubator-tinkerpop git commit: Merge remote-tracking branch 'tinkerpop/master' into TP-885

Posted by sp...@apache.org.
Merge remote-tracking branch 'tinkerpop/master' into TP-885

Conflicts:
	docs/src/upgrade-release-3.1.x-incubating.asciidoc


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

Branch: refs/heads/master
Commit: 7ce6784466e8714edac465f2bbfee6dda5c019dd
Parents: 956d34d 93573ed
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Fri Nov 6 22:40:57 2015 +0100
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Fri Nov 6 22:44:37 2015 +0100

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  44 +-
 CONTRIBUTING.asciidoc                           | 236 +-----
 RELEASE.asciidoc                                | 172 -----
 docs/src/acknowledgements.asciidoc              |  19 +-
 docs/src/conclusion.asciidoc                    |   6 +-
 docs/src/developer-administration.asciidoc      |  91 +++
 docs/src/developer-contributing.asciidoc        | 308 ++++++++
 docs/src/developer-meetings.asciidoc            |  64 ++
 docs/src/developer-release.asciidoc             | 171 +++++
 docs/src/developer.asciidoc                     |  33 +
 docs/src/gremlin-applications.asciidoc          | 721 +++++++++++++++----
 docs/src/implementations.asciidoc               | 562 +++++++++++----
 docs/src/intro.asciidoc                         | 173 ++++-
 docs/src/preface.asciidoc                       |  42 +-
 docs/src/the-graph.asciidoc                     | 245 +++++--
 docs/src/the-graphcomputer.asciidoc             | 201 +++++-
 docs/src/the-traversal.asciidoc                 | 666 ++++++++++++-----
 .../upgrade-release-3.0.x-incubating.asciidoc   |   4 +-
 .../upgrade-release-3.1.x-incubating.asciidoc   | 113 ++-
 docs/static/images/gremlin-gym.pdf              | Bin 0 -> 963978 bytes
 docs/static/images/gremlin-gym.png              | Bin 0 -> 273111 bytes
 docs/static/images/gremlin-standing-strong.png  | Bin 0 -> 30985 bytes
 .../images/keep-on-traversin-tiedye-title.png   | Bin 0 -> 943206 bytes
 docs/static/images/keep-on-traversin-tiedye.png | Bin 0 -> 581914 bytes
 docs/static/images/keep-on-traversin-title.png  | Bin 0 -> 669529 bytes
 docs/static/images/keep-on-traversin.png        | Bin 0 -> 400941 bytes
 docs/static/images/not-tinkerpop3-gremlin.png   | Bin 0 -> 186676 bytes
 docs/static/images/provider-integration.png     | Bin 372429 -> 226464 bytes
 docs/static/images/quantum-gremlin.png          | Bin 0 -> 69142 bytes
 docs/static/images/tinkerpop3.graffle           | 236 +++---
 .../process/computer/GiraphGraphComputer.java   |  16 +-
 .../computer/io/GiraphVertexInputFormat.java    |  70 --
 .../computer/io/GiraphVertexOutputFormat.java   |  65 --
 .../process/computer/io/GiraphVertexReader.java |  67 --
 .../process/computer/io/GiraphVertexWriter.java |  57 --
 .../structure/io/GiraphVertexInputFormat.java   |  70 ++
 .../structure/io/GiraphVertexOutputFormat.java  |  65 ++
 .../giraph/structure/io/GiraphVertexReader.java |  67 ++
 .../giraph/structure/io/GiraphVertexWriter.java |  57 ++
 .../GephiTraversalVisualizationStrategy.groovy  |   2 +-
 .../gremlin/process/computer/GraphComputer.java |  19 +-
 .../computer/bulkloading/BulkLoader.java        |  31 +
 .../bulkloading/BulkLoaderVertexProgram.java    | 115 ++-
 .../bulkloading/IncrementalBulkLoader.java      |  14 +-
 .../traversal/TraversalVertexProgram.java       |   4 +-
 .../gremlin/process/traversal/NumberHelper.java | 288 ++++++++
 .../gremlin/process/traversal/Operator.java     |  78 +-
 .../traversal/dsl/graph/GraphTraversal.java     |  23 +-
 .../dsl/graph/GraphTraversalSource.java         |  10 +-
 .../gremlin/process/traversal/dsl/graph/__.java |   9 +-
 .../process/traversal/lambda/LoopTraversal.java |   4 +
 .../traversal/step/branch/RepeatStep.java       |   8 +
 .../process/traversal/step/map/GraphStep.java   | 149 ++++
 .../process/traversal/step/map/MatchStep.java   |  46 +-
 .../traversal/step/map/MaxGlobalStep.java       |  14 +-
 .../traversal/step/map/MaxLocalStep.java        |   5 +-
 .../traversal/step/map/MeanGlobalStep.java      |  61 +-
 .../traversal/step/map/MeanLocalStep.java       |  11 +-
 .../traversal/step/map/MinGlobalStep.java       |  14 +-
 .../traversal/step/map/MinLocalStep.java        |   5 +-
 .../traversal/step/map/SumGlobalStep.java       |  25 +-
 .../traversal/step/map/SumLocalStep.java        |   5 +-
 .../traversal/step/sideEffect/GraphStep.java    | 101 ---
 .../step/util/TraversalComparator.java          |   5 +-
 .../strategy/decoration/ConnectiveStrategy.java |   3 +-
 .../strategy/decoration/ElementIdStrategy.java  |   2 +-
 .../strategy/decoration/PartitionStrategy.java  |   2 +-
 .../strategy/decoration/SubgraphStrategy.java   |   2 +-
 .../finalization/LazyBarrierStrategy.java       |   2 +-
 .../ComputerVerificationStrategy.java           |  39 +-
 .../process/traversal/util/TraversalHelper.java |   3 +
 .../structure/util/AbstractTransaction.java     |   2 -
 .../traversal/OperatorExceptionTest.java        |  39 +-
 .../gremlin/process/traversal/OperatorTest.java | 100 ++-
 .../traversal/step/map/GraphStepTest.java       |  41 ++
 .../traversal/step/map/MatchStepTest.java       |  82 ++-
 .../traversal/step/map/MeanGlobalStepTest.java  |  14 +
 .../traversal/step/map/MeanLocalStepTest.java   |  14 +
 .../ElementIdStrategyTraverseTest.java          |   4 +-
 .../PartitionStrategyTraverseTest.java          |   4 +-
 .../SubgraphStrategyTraverseTest.java           |   5 +-
 .../apache/tinkerpop/gremlin/driver/Client.java |  71 +-
 .../apache/tinkerpop/gremlin/driver/Tokens.java |   6 +
 .../driver/ser/GryoMessageSerializerV1d0.java   |  13 +-
 .../gremlin/driver/AbstractResultQueueTest.java |  23 +
 .../gremlin/driver/ResultQueueTest.java         |  15 +-
 .../ser/GryoMessageSerializerV1d0Test.java      |  55 ++
 .../traversal/step/map/GroovyGraphTest.groovy   |  50 ++
 .../traversal/step/map/GroovyOrderTest.groovy   |  10 +
 .../step/sideEffect/GroovyGroupTest.groovy      |   2 +-
 .../step/sideEffect/GroovySackTest.groovy       |   4 +-
 .../process/GroovyProcessComputerSuite.java     |   2 +
 .../process/GroovyProcessStandardSuite.java     |   2 +
 ...linGroovyScriptEngineTimedInterruptTest.java |  12 +-
 .../groovy/util/DependencyGrabberTest.java      |   8 +-
 gremlin-server/pom.xml                          |  25 +
 .../tinkerpop/gremlin/server/GremlinServer.java |  53 +-
 .../tinkerpop/gremlin/server/Settings.java      |   5 +
 .../handler/HttpGremlinEndpointHandler.java     |  47 +-
 .../handler/NioGremlinBinaryRequestDecoder.java |   5 +
 .../handler/WsGremlinBinaryRequestDecoder.java  |   5 +
 .../handler/WsGremlinCloseRequestDecoder.java   |   5 +
 .../handler/WsGremlinTextRequestDecoder.java    |   5 +
 .../server/op/AbstractEvalOpProcessor.java      |   2 +-
 .../server/op/session/SessionOpProcessor.java   |   9 +-
 .../server/op/standard/StandardOpProcessor.java |  20 +-
 .../AbstractGremlinServerIntegrationTest.java   |   7 +-
 .../server/GremlinDriverIntegrateTest.java      | 101 ++-
 .../server/GremlinServerAuthIntegrateTest.java  |  35 +
 .../server/GremlinServerHttpIntegrateTest.java  |  38 +-
 .../server/GremlinServerIntegrateTest.java      | 125 ++++
 .../gremlin/process/ProcessComputerSuite.java   |   2 +
 .../gremlin/process/ProcessStandardSuite.java   |   2 +
 .../process/computer/GraphComputerTest.java     |  34 +-
 .../traversal/step/map/AddVertexTest.java       |   2 +-
 .../process/traversal/step/map/GraphTest.java   | 109 +++
 .../process/traversal/step/map/OrderTest.java   |  58 +-
 .../process/traversal/step/map/SumTest.java     |   2 +-
 .../traversal/step/sideEffect/GroupTest.java    |  22 +-
 .../traversal/step/sideEffect/SackTest.java     |  20 +-
 .../PartitionStrategyProcessTest.java           |  13 +-
 ...ComputerVerificationStrategyProcessTest.java |   3 +-
 .../conf/hadoop-grateful-gryo.properties        |   2 +-
 .../tinkerpop/gremlin/hadoop/Constants.java     |   1 -
 .../structure/hdfs/HadoopElementIterator.java   |   4 +-
 .../hadoop/structure/io/HadoopPools.java        |   2 +-
 .../hadoop/structure/io/InputOutputHelper.java  |  22 +
 .../hadoop/structure/util/HadoopHelper.java     |  50 --
 .../groovy/plugin/HadoopGremlinPluginTest.java  |   2 +-
 neo4j-gremlin/pom.xml                           |  28 +-
 .../step/sideEffect/Neo4jGraphStep.java         |  10 +-
 .../optimization/Neo4jGraphStepStrategy.java    |  13 +-
 .../gremlin/neo4j/structure/Neo4jGraph.java     |   1 +
 .../gremlin/neo4j/structure/Neo4jHelper.java    |  16 +-
 .../traversal/strategy/Neo4jStrategySuite.java  |  44 ++
 .../traversal/strategy/Neo4jStrategyTest.java   |  32 +
 .../Neo4jGraphStepStrategyTest.java             |  76 ++
 pom.xml                                         |  34 +-
 .../process/computer/SparkGraphComputer.java    | 102 ++-
 .../process/computer/io/InputFormatRDD.java     |  47 --
 .../spark/process/computer/io/InputRDD.java     |  41 --
 .../process/computer/io/OutputFormatRDD.java    |  49 --
 .../spark/process/computer/io/OutputRDD.java    |  31 -
 .../spark/structure/io/InputFormatRDD.java      |  47 ++
 .../spark/structure/io/InputOutputHelper.java   |  81 +++
 .../gremlin/spark/structure/io/InputRDD.java    |  41 ++
 .../spark/structure/io/OutputFormatRDD.java     |  49 ++
 .../gremlin/spark/structure/io/OutputRDD.java   |  31 +
 .../spark/structure/io/PersistedInputRDD.java   |  60 ++
 .../spark/structure/io/PersistedOutputRDD.java  |  41 ++
 .../process/computer/LocalPropertyTest.java     | 100 +++
 .../process/computer/io/ExampleInputRDD.java    |  47 --
 .../process/computer/io/ExampleOutputRDD.java   |  45 --
 .../process/computer/io/InputOutputRDDTest.java |  59 --
 .../spark/process/computer/io/InputRDDTest.java |  54 --
 .../process/computer/io/OutputRDDTest.java      |  62 --
 .../spark/structure/io/ExampleInputRDD.java     |  51 ++
 .../spark/structure/io/ExampleOutputRDD.java    |  50 ++
 .../spark/structure/io/InputOutputRDDTest.java  |  60 ++
 .../spark/structure/io/InputRDDTest.java        |  55 ++
 .../spark/structure/io/OutputRDDTest.java       |  63 ++
 .../io/PersistedInputOutputRDDTest.java         | 216 ++++++
 .../step/sideEffect/TinkerGraphStep.java        |  10 +-
 .../optimization/TinkerGraphStepStrategy.java   |  13 +-
 .../tinkergraph/structure/TinkerFactory.java    |   8 +-
 .../tinkergraph/structure/TinkerGraph.java      |  59 +-
 .../tinkergraph/TinkerGraphProvider.java        |  14 +-
 .../strategy/TinkerGraphStrategySuite.java      |  44 ++
 .../strategy/TinkerGraphStrategyTest.java       |  32 +
 .../TinkerGraphStepStrategyTest.java            |  33 +-
 .../structure/TinkerGraphIdManagerTest.java     |  18 +-
 .../structure/TinkerGraphPlayTest.java          |  41 +-
 .../tinkergraph/structure/TinkerGraphTest.java  |  16 +-
 173 files changed, 6706 insertions(+), 2473 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7ce67844/docs/src/upgrade-release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------
diff --cc docs/src/upgrade-release-3.1.x-incubating.asciidoc
index e42be2b,5632468..ead97ae
--- a/docs/src/upgrade-release-3.1.x-incubating.asciidoc
+++ b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
@@@ -35,11 -35,19 +35,20 @@@ Additional upgrade information can be f
  Important Changes
  ~~~~~~~~~~~~~~~~~
  
- * The Gephi Plugin has improved integration with Gephi, where manually inserting {{store}} steps to visualize a running traversal is no longer required.
+ * `sum()`, `min()`, `max()` and `mean()` make now use of `NumberHelper`, leading to a more appropriate result type, instead of just `Double`.
+ * `GraphStep` is no longer in `sideEffect`-package, but now in `map`-package as traversals support mid-traversal `V()`.
+ * Traversals now support mid-traversal `V()`-steps. Graph system providers should ensure that a mid-traversal `V()` can leverage any suitable index.
+ * The data type of `Operator` enums will now always be the highest common data type of the two given numbers, rather than the data type of the first number, as it's been before.
+ * The Gephi Plugin has improved integration with Gephi, where manually inserting `store` steps to visualize a running traversal is no longer required.
  * Entire TinkerGraph instances can be serialized over Gryo.
- * Hadoop1 support has been dropped. Hadoop2 is now supported. Giraph 1.1.0 is now supported and Spark of Hadoop2 YARN.
+ * Hadoop1 support has been dropped. Hadoop2 is now supported. Giraph and Spark can work over Hadoop2 YARN.
  * The implementation and semantics of `GraphTraversal.group()` has changed. The previous model is deprecated and renamed to `groupV3d0()`.
 +* `Transaction.onReadWrite()` and `Transaction.onClose()` are now `ThreadLocal` settings
+ * `PartitionStrategy` now supports `VertexProperty` such those properties can be added to partitions.
+ * The Jackson library is now "shaded" and included in the `gremlin-shaded` module.
+ * Configuration for Netty link:http://netty.io/wiki/native-transports.html[native transport] support in Gremlin Server.
+ * The `Channelizer` implementation for Gremlin Driver can now be changed via configuration.
+ * TinkerGraph is now serializable over Gryo so it is possible to request subgraphs via Gremlin Server (and `:remote`).
  
  Please see the link:https://github.com/apache/incubator-tinkerpop/blob/3.1.0-incubating/CHANGELOG.asciidoc#XXXXXXXXXXXXXXXXXXXXXXXXXXXX[changelog] for a complete list of all the modifications that are part of this release.
  
@@@ -58,16 -66,25 +67,35 @@@ to closing where a user must now explic
  
  See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
  
 +Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 +
 +The `Transaction.onReadWrite()` and `Transaction.onClose()` settings now need to be set for each thread (if another behavior than the default is desired).
 +For gremlin-server users that may be changing these settings via scripts :
 +If the settings are changed from a sessionless request they will now only apply to that one request.
 +If the settings are changed from an in-session request they will now only apply to all future requests made in the scope of that session. 
 +
 +See link:https://issues.apache.org/jira/browse/TINKERPOP3-885[TINKERPOP3-885]
 +
+ Hadoop-Gremlin Updates
+ ++++++++++++++++++++++
+ 
+ * Hadoop1 is no longer supported. Hadoop2 is now the only supported Hadoop version in TinkerPop.
+ * Spark and Giraph have been split out of Hadoop-Gremlin into their own respective packages (Spark-Gremlin and Giraph-Gremlin).
+ * The directory where application jars are stored in HDFS is now `hadoop-gremlin-x.y.z-libs`.
+ ** This versioning is important so that cross-version TinkerPop use does not cause jar conflicts.
+ 
+ Spark-Gremlin Updates
+ +++++++++++++++++++++
+ 
+ * Providers that wish to reuse a graphRDD can leverage the new `PersistedInputRDD` and `PersistedOutputRDD`.
+ ** This allows the graphRDD to avoid serialization into HDFS for reuse. Be sure to enabled persisted `SparkContext` (see documentation).
+ 
+ TinkerGraph-Gremlin Updates
+ +++++++++++++++++++++++++++
+ 
+ * The `public static String` configurations have been renamed. The old `public static` variables have been deprecated.
+ 
  Gremlin Process
  ^^^^^^^^^^^^^^^
  
@@@ -121,17 -147,49 +158,67 @@@ If these tests were referenced in an `O
  
  See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
  
++AbstractTransaction implementation changes
++++++++++++++++++++++++++++++++++++++++++++
++The `AbstractTransaction` class now requires implementing four new methods: 
++
++* `doReadWrite` that should execute the read-write consumer.
++* `doClose` that should execute the close consumer.
++* `setReadWrite` that should set the read-write consumer for the transaction.
++* `setClose` that should set the close consumer for the transaction.
++
++You can refer to `AbstractThreadLocalTransaction` and `AbstractThreadedTransaction` for examples.
++
  Graph Traversal Updates
  +++++++++++++++++++++++
  
- There were numerous changes to the `GraphTraversal` API. Nearly all changes are backwards compatible with respective "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
+ There were numerous changes to the `GraphTraversal` API. Nearly all changes are backwards compatible with respective
+ "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
+ 
+ * `GraphStep` is no longer in `sideEffect` package. Now in `map` package.
+ * Make sure mid-traversal `GraphStep` calls are folding `HasContainers` in for index-lookups.
+ * Think about copying `TinkerGraphStepStrategyTest` for your implementation so you know folding is happening correctly.
+ 
+ Element Removal
+ +++++++++++++++
+ 
+ `Element.Exceptions.elementAlreadyRemoved` has been deprecated and test enforcement for consistency have been removed.
+  Providers are free to deal with deleted elements as they see fit.
+ 
+ See link:https://issues.apache.org/jira/browse/TINKERPOP3-297[TINKERPOP3-297] for more information.
+ 
+ VendorOptimizationStrategy Rename
+ +++++++++++++++++++++++++++++++++
+ 
+ The `VendorOptimizationStrategy` has been renamed to `ProviderOptimizationStrategy`.  This renaming is consistent
+ with revised terminology for what were formerly referred to as "vendors".
+ 
+ See link:https://issues.apache.org/jira/browse/TINKERPOP3-876[TINKERPOP3-876] for more information.
+ 
+ GraphComputer Updates
+ +++++++++++++++++++++
+ 
+ `GraphComputer.configure(String key, Object value)` is now a method (with default implementation).
+ This allows the user to specify engine-specific parameters to the underlying OLAP system. These parameters are not intended
+ to be cross engine supported. Moreover, if there are not parameters that can be altered (beyond the standard `GraphComputer`
+ methods), then the provider's `GraphComputer` implementation should simply return and do nothing.
+ 
+ Driver Providers
+ ^^^^^^^^^^^^^^^^
+ 
+ Aliases Parameter
+ +++++++++++++++++
+ 
+ The "rebindings" argument to the "standard" `OpProcessor` has been renamed to "aliases". While "rebindings" is still
+ supported it is recommended that the upgrade to "aliases" be made as soon as possible as support will be removed in
+ the future.  Gremlin Server will not accept both parameters at the same time - a request must contain either one
+ parameter or the other if either is supplied.
  
- Driver Implementers
- ^^^^^^^^^^^^^^^^^^^
 -See link:https://issues.apache.org/jira/browse/TINKERPOP3-913[TINKERPOP3-913] for more information.
++See link:https://issues.apache.org/jira/browse/TINKERPOP3-913[TINKERPOP3-913] for more information.
 +
 +Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 +
 +If your driver configures the `Transaction.onReadWrite()` or `Transaction.onClose()` settings, note that these no longer apply to all future requests. 
 +If the settings are changed from a sessionless request they will only apply to that one request.
- If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 
++If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7ce67844/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
----------------------------------------------------------------------
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
index de7b6ee,56c6f36..54e7d9c
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
@@@ -35,7 -37,9 +35,6 @@@ import java.util.function.Function
   * @author Stephen Mallette (http://stephen.genoprime.com)
   */
  public abstract class AbstractTransaction implements Transaction {
-     
 -    protected Consumer<Transaction> readWriteConsumer;
 -    protected Consumer<Transaction> closeConsumer;
 -
      private Graph g;
  
      public AbstractTransaction(final Graph g) {
@@@ -73,31 -83,6 +72,30 @@@
       * {@link #addTransactionListener(Consumer)}.
       */
      protected abstract void fireOnRollback();
 +    
-     
 +    /**
 +     * Called {@link #readWrite}.  
 +     * Implementers should run their readWrite consumer here.
 +     */
 +    protected abstract void doReadWrite();
 +    
 +    /**
 +     * Called {@link #close}.  
 +     * Implementers should run their readWrite consumer here.
 +     */
 +    protected abstract void doClose();
 +    
 +    /**
 +     * Called {@link #onReadWrite}.  
 +     * Implementers should set their readWrite consumer here.
 +     */
 +    protected abstract void setReadWrite(final Consumer<Transaction> consumer);
 +    
 +    /**
 +     * Called {@link #onClose}.  
 +     * Implementers should set their close consumer here.
 +     */
 +    protected abstract void setClose(final Consumer<Transaction> consumer);
  
      /**
       * {@inheritDoc}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7ce67844/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinDriverIntegrateTest.java
----------------------------------------------------------------------


[03/16] incubator-tinkerpop git commit: removed typos

Posted by sp...@apache.org.
removed typos


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

Branch: refs/heads/master
Commit: 285bd28b523da9eacb8e84f270a0ebf906f6ca91
Parents: 5b0dd76
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Wed Oct 21 14:34:43 2015 +0200
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Wed Oct 21 14:34:43 2015 +0200

----------------------------------------------------------------------
 docs/src/upgrade-release-3.1.x-incubating.asciidoc | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/285bd28b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade-release-3.1.x-incubating.asciidoc b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
index 4dd1673..d031b2d 100644
--- a/docs/src/upgrade-release-3.1.x-incubating.asciidoc
+++ b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
@@ -39,6 +39,7 @@ Important Changes
 * Entire TinkerGraph instances can be serialized over Gryo.
 * Hadoop1 support has been dropped. Hadoop2 is now supported. Giraph 1.1.0 is now supported and Spark of Hadoop2 YARN.
 * The implementation and semantics of `GraphTraversal.group()` has changed. The previous model is deprecated and renamed to `groupV3d0()`.
+* `Transaction.onReadWrite()` and `Transaction.onClose()` are now `ThreadLocal` settings
 
 Please see the link:https://github.com/apache/incubator-tinkerpop/blob/3.1.0-incubating/CHANGELOG.asciidoc#XXXXXXXXXXXXXXXXXXXXXXXXXXXX[changelog] for a complete list of all the modifications that are part of this release.
 
@@ -57,7 +58,6 @@ to closing where a user must now explicitly call `commit()` to persist their mut
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
 
-<<<<<<< HEAD
 Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
@@ -66,7 +66,8 @@ For gremlin-server users that may be changing these settings via scripts :
 If the settings are changed from a sessionless request they will now only apply to that one request.
 If the settings are changed from an in-session request they will now only apply to all future requests made in the scope of that session. 
 
-=======
+See link:https://issues.apache.org/jira/browse/TINKERPOP3-885[TINKERPOP3-885]
+
 Gremlin Process
 ^^^^^^^^^^^^^^^
 
@@ -100,7 +101,6 @@ Hadoop-Gremlin Updates
 * Hadoop1 is no longer supported. Hadoop2 is now the only supported Hadoop version in TinkerPop.
 * The directory where application jars are stored in HDFS is now `hadoop-gremlin-x.y.z-libs`.
 ** This versioning is important so that cross-version TinkerPop use does not cause jar conflicts.
->>>>>>> master
 
 Upgrading for Providers
 ~~~~~~~~~~~~~~~~~~~~~~~
@@ -121,7 +121,6 @@ If these tests were referenced in an `OptOut`, then their names should be update
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
 
-<<<<<<< HEAD
 Driver Implementers
 ^^^^^^^^^^^^^^^^^^^
 
@@ -131,9 +130,8 @@ Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settin
 If your driver configures the `Transaction.onReadWrite()` or `Transaction.onClose()` settings, note that these no longer apply to all future requests. 
 If the settings are changed from a sessionless request they will only apply to that one request.
 If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 
-=======
+
 Graph Traversal Updates
 +++++++++++++++++++++++
 
 There were numerous changes to the `GraphTraversal` API. Nearly all changes are backwards compatible with respective "deprecated" annotations. Please review the respective updates specified in the "Graph System Users" section.
->>>>>>> master


[16/16] incubator-tinkerpop git commit: Merge remote-tracking branch 'origin/TINKERPOP3-885'

Posted by sp...@apache.org.
Merge remote-tracking branch 'origin/TINKERPOP3-885'

Conflicts:
	docs/src/upgrade-release-3.1.x-incubating.asciidoc


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

Branch: refs/heads/master
Commit: 8f2e2e5558af61676ec64b330ec2245abed19209
Parents: 82b2695 6b532f7
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Mon Nov 9 08:05:22 2015 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Mon Nov 9 08:05:22 2015 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 docs/src/the-graph.asciidoc                     |  3 +
 .../upgrade-release-3.1.x-incubating.asciidoc   | 32 +++++++-
 .../util/AbstractThreadLocalTransaction.java    | 40 +++++++++-
 .../util/AbstractThreadedTransaction.java       | 44 +++++++++-
 .../structure/util/AbstractTransaction.java     | 54 +++++--------
 .../server/GremlinDriverIntegrateTest.java      |  7 +-
 .../gremlin/structure/TransactionTest.java      | 84 ++++++++++++++++++++
 8 files changed, 223 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8f2e2e55/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --cc CHANGELOG.asciidoc
index c18129c,87bf9a3..144c018
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@@ -25,9 -25,9 +25,10 @@@ image::https://raw.githubusercontent.co
  TinkerPop 3.1.0 (NOT OFFICIALLY RELEASED YET)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
+ * `Transaction` settings for `onReadWrite` and `onClose` are now `ThreadLocal` in nature of standard transactions.
  * Optimized `BulkLoaderVertexProgram`. It now uses `EventStrategy` to monitor what the underlying `BulkLoader` implementation does (e.g. whether it creates a new vertex or returns an existing).
  * Integrated `NumberHelper` in `SumStep`, `MinStep`, `MaxStep` and `MeanStep` (local and global step variants).
 +* Gremlin Console remoting to Gremlin Server now supports a configuration option for assigning aliases.
  * `CountMatchAlgorithm`, in OLAP, now biases traversal selection towards those traversals that start at the current traverser location to reduce message passing.
  * Fixed a file stream bug in Hadoop OLTP that showed up if the streamed file was more than 2G of data.
  * Added the ability to set thread local properties in `SparkGraphComputer` when using a persistent context.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8f2e2e55/docs/src/upgrade-release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------


[12/16] incubator-tinkerpop git commit: TINKERPOP3-885 Adjustments to work from @PommeVerte from his PR at #113

Posted by sp...@apache.org.
TINKERPOP3-885 Adjustments to work from @PommeVerte from his PR at #113

Removed two tests that didn't really test threaded transactions properly.  Removed the static modifier on close/readWrite member variables which would cause a problem if the same thread was working with multiple graph instances.  Removed setReadWrite and setClose from AbstractTransaction as they were redundnant to just onReadWrite and onClose (they offered no functionality in and of themselves). Altered the nature of AbstractThreadedTransaction a bit as threaded transactions are really "manual" by virtue of their creation.  The transaction is opened when you createThreadedTransaction() and really shouldn't be re-used after close.  An new one should be created.  We don't have those semantics enforced now, but that's typically how this feature has been used in the past.


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

Branch: refs/heads/master
Commit: a806c7ec0a4fc5baaa1d684a647d0e5084f9c4cb
Parents: 1aa1b5a
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sat Nov 7 09:08:12 2015 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Sat Nov 7 09:08:12 2015 -0500

----------------------------------------------------------------------
 .../util/AbstractThreadLocalTransaction.java    |  14 +--
 .../util/AbstractThreadedTransaction.java       |  47 ++++++---
 .../structure/util/AbstractTransaction.java     |  35 +------
 .../gremlin/structure/TransactionTest.java      | 102 ++-----------------
 4 files changed, 47 insertions(+), 151 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a806c7ec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
index 3109215..485e3f2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadLocalTransaction.java
@@ -37,14 +37,14 @@ import java.util.function.Consumer;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public abstract class AbstractThreadLocalTransaction extends AbstractTransaction {
-protected static final ThreadLocal<Consumer<Transaction>> readWriteConsumerInternal = 
+    protected final ThreadLocal<Consumer<Transaction>> readWriteConsumerInternal =
         new ThreadLocal<Consumer<Transaction>>() {
             @Override protected Consumer<Transaction> initialValue() {
                 return READ_WRITE_BEHAVIOR.AUTO;
             }
         };
     
-    protected static final ThreadLocal<Consumer<Transaction>> closeConsumerInternal = 
+    protected final ThreadLocal<Consumer<Transaction>> closeConsumerInternal =
         new ThreadLocal<Consumer<Transaction>>() {
             @Override protected Consumer<Transaction> initialValue() {
                 return CLOSE_BEHAVIOR.ROLLBACK;
@@ -88,24 +88,26 @@ protected static final ThreadLocal<Consumer<Transaction>> readWriteConsumerInter
     }
     
     @Override
-    public void doReadWrite() {
+    protected void doReadWrite() {
         readWriteConsumerInternal.get().accept(this);
     }
     
     @Override
-    public void doClose() {
+    protected void doClose() {
         closeConsumerInternal.get().accept(this);
         closeConsumerInternal.remove();
         readWriteConsumerInternal.remove();
     }
     
     @Override
-    public void setReadWrite(final Consumer<Transaction> consumer) {
+    public Transaction onReadWrite(final Consumer<Transaction> consumer) {
         readWriteConsumerInternal.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+        return this;
     }
     
     @Override
-    public void setClose(final Consumer<Transaction> consumer) {
+    public Transaction onClose(final Consumer<Transaction> consumer) {
         closeConsumerInternal.set(Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull));
+        return this;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a806c7ec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
index 246734a..2fdc7df 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractThreadedTransaction.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Consumer;
+import java.util.function.Function;
 
 /**
  * A base implementation of {@link Transaction} that provides core functionality for transaction listeners using a
@@ -40,10 +41,6 @@ public abstract class AbstractThreadedTransaction extends AbstractTransaction {
 
     protected final List<Consumer<Status>> transactionListeners = new CopyOnWriteArrayList<>();
     
-    protected Consumer<Transaction> readWriteConsumerInternal = READ_WRITE_BEHAVIOR.AUTO;
-    
-    protected Consumer<Transaction> closeConsumerInternal = CLOSE_BEHAVIOR.ROLLBACK;
-    
      public AbstractThreadedTransaction(final Graph g) {
         super(g);
     }
@@ -72,24 +69,42 @@ public abstract class AbstractThreadedTransaction extends AbstractTransaction {
     public void clearTransactionListeners() {
         transactionListeners.clear();
     }
-    
+
+    /**
+     * Most implementations should do nothing with this as the tx is already open on creation.
+     */
     @Override
-    public void doReadWrite() {
-        readWriteConsumerInternal.accept(this);
+    protected void doReadWrite() {
+        // do nothing
     }
-    
+
+    /**
+     * Clears transaction listeners
+     */
     @Override
-    public void doClose() {
-        closeConsumerInternal.accept(this);
+    protected void doClose() {
+        clearTransactionListeners();
     }
-    
+
+    /**
+     * The nature of threaded transactions are such that they are always open when created and manual in nature,
+     * therefore setting this value is not required.
+     *
+     * @throws UnsupportedOperationException
+     */
     @Override
-    public void setReadWrite(final Consumer<Transaction> consumer) {
-        readWriteConsumerInternal = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull);
+    public synchronized Transaction onReadWrite(final Consumer<Transaction> consumer) {
+        throw new UnsupportedOperationException("Threaded transactions are open when created and in manual mode");
     }
-    
+
+    /**
+     * The nature of threaded transactions are such that they are always open when created and manual in nature,
+     * therefore setting this value is not required.
+     *
+     * @throws UnsupportedOperationException
+     */
     @Override
-    public void setClose(final Consumer<Transaction> consumer) {
-        closeConsumerInternal = Optional.ofNullable(consumer).orElseThrow(Transaction.Exceptions::onReadWriteBehaviorCannotBeNull);
+    public synchronized Transaction onClose(final Consumer<Transaction> consumer) {
+        throw new UnsupportedOperationException("Threaded transactions are open when created and in manual mode");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a806c7ec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
index 54e7d9c..156f754 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AbstractTransaction.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.structure.util;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
 
-import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
@@ -48,13 +47,13 @@ public abstract class AbstractTransaction implements Transaction {
     protected abstract void doOpen();
 
     /**
-     * Called with {@link #commit} after the {@link #readWriteConsumer} has been notified.  Implementers should
+     * Called with {@link #commit} after the {@link #onReadWrite(Consumer)} has been notified.  Implementers should
      * include their commit logic here.
      */
     protected abstract void doCommit() throws TransactionException;
 
     /**
-     * Called with {@link #rollback} after the {@link #readWriteConsumer} has been notified.  Implementers should
+     * Called with {@link #rollback} after the {@link #onReadWrite(Consumer)} has been notified.  Implementers should
      * include their rollback logic here.
      */
     protected abstract void doRollback() throws TransactionException;
@@ -84,18 +83,6 @@ public abstract class AbstractTransaction implements Transaction {
      * Implementers should run their readWrite consumer here.
      */
     protected abstract void doClose();
-    
-    /**
-     * Called {@link #onReadWrite}.  
-     * Implementers should set their readWrite consumer here.
-     */
-    protected abstract void setReadWrite(final Consumer<Transaction> consumer);
-    
-    /**
-     * Called {@link #onClose}.  
-     * Implementers should set their close consumer here.
-     */
-    protected abstract void setClose(final Consumer<Transaction> consumer);
 
     /**
      * {@inheritDoc}
@@ -168,24 +155,6 @@ public abstract class AbstractTransaction implements Transaction {
     }
 
     /**
-     * {@inheritDoc}
-     */
-    @Override
-    public synchronized Transaction onReadWrite(final Consumer<Transaction> consumer) {
-        setReadWrite(consumer);
-        return this;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public synchronized Transaction onClose(final Consumer<Transaction> consumer) {
-        setClose(consumer);
-        return this;
-    }
-
-    /**
      * An "internal" exception thrown by vendors when calls to {@link AbstractTransaction#doCommit} or
      * {@link AbstractTransaction#doRollback} fail.
      */

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a806c7ec/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
index eae224f..8d23fce 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java
@@ -36,8 +36,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
 import static org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS;
@@ -1047,10 +1045,10 @@ public class TransactionTest extends AbstractGremlinTest {
     
     @Test
     @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS)
-    public void shouldNotShareTransactionReadWriteConsumersAccrossThreads() throws InterruptedException {
+    public void shouldNotShareTransactionReadWriteConsumersAcrossThreads() throws InterruptedException {
         final CountDownLatch latch = new CountDownLatch(1);
         final AtomicBoolean commitFailed = new AtomicBoolean(false);
-        final AtomicBoolean commitOccured = new AtomicBoolean(false);
+        final AtomicBoolean commitOccurred = new AtomicBoolean(false);
         
         final Thread manualThread = new Thread(() -> {
             graph.tx().onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);
@@ -1074,9 +1072,9 @@ public class TransactionTest extends AbstractGremlinTest {
             latch.countDown();
             try {
                 graph.tx().commit();
-                commitOccured.set(true);
+                commitOccurred.set(true);
             } catch (Exception ex) {
-                commitOccured.set(false);
+                commitOccurred.set(false);
             }
         });
         
@@ -1091,13 +1089,13 @@ public class TransactionTest extends AbstractGremlinTest {
         );
         assertTrue(
                 "autoThread transaction readWrite should be AUTO and should commit the transaction",
-                commitOccured.get()
+                commitOccurred.get()
         );
     }
     
     @Test
     @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS)
-    public void shouldNotShareTransactionCloseConsumersAccrossThreads() throws InterruptedException {
+    public void shouldNotShareTransactionCloseConsumersAcrossThreads() throws InterruptedException {
         final CountDownLatch latch = new CountDownLatch(1);
         
         final Thread manualThread = new Thread(() -> {
@@ -1128,92 +1126,4 @@ public class TransactionTest extends AbstractGremlinTest {
                 IteratorUtils.count(graph.vertices())
         );
     }
-    
-    @Test
-    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_THREADED_TRANSACTIONS)
-    public void shouldShareTransactionReadWriteConsumersAccrossThreads() throws InterruptedException {
-        final CountDownLatch latch = new CountDownLatch(1);
-        final AtomicBoolean commitFailed = new AtomicBoolean(false);
-        final AtomicBoolean commitFailedAgain = new AtomicBoolean(false);
-        
-        final Thread manualThread = new Thread(() -> {
-            Transaction tx = graph.tx().createThreadedTx();
-            tx.onReadWrite(Transaction.READ_WRITE_BEHAVIOR.MANUAL);
-            try {
-                latch.await();
-            } catch (InterruptedException ie) {
-                throw new RuntimeException(ie);
-            }
-            
-            try{
-                tx.commit();
-                commitFailed.set(false);
-            } catch (Exception ex) {
-                commitFailed.set(true);
-            }
-        });
-        
-        manualThread.start();
-        
-        final Thread autoThread = new Thread(() -> {
-            latch.countDown();
-            Transaction tx = graph.tx().createThreadedTx();
-            try {
-                tx.commit();
-                commitFailedAgain.set(false);
-            } catch (Exception ex) {
-                commitFailedAgain.set(true);
-            }
-        });
-        
-        autoThread.start();
-        
-        manualThread.join();
-        autoThread.join();
-        
-        assertTrue(
-                "manualThread transaction readWrite should be MANUAL and should fail to commit the transaction",
-                commitFailed.get()
-        );
-        assertTrue(
-                "autoThread transaction readWrite should be AUTO and should commit the transaction",
-                commitFailedAgain.get()
-        );
-    }
-    
-    @Test
-    @FeatureRequirement(featureClass = Graph.Features.GraphFeatures.class, feature = Graph.Features.GraphFeatures.FEATURE_THREADED_TRANSACTIONS)
-    public void shouldShareTransactionCloseConsumersAccrossThreads() throws InterruptedException {
-        final CountDownLatch latch = new CountDownLatch(1);
-        
-        final Thread manualThread = new Thread(() -> {
-            Transaction tx = graph.tx().createThreadedTx();
-            tx.onClose(Transaction.CLOSE_BEHAVIOR.COMMIT);
-            try {
-                latch.await();
-            } catch (InterruptedException ie) {
-                throw new RuntimeException(ie);
-            }
-        });
-        
-        manualThread.start();
-        
-        final Thread autoThread = new Thread(() -> {
-            latch.countDown();
-            Transaction tx = graph.tx().createThreadedTx();
-            graph.addVertex();
-            tx.close();
-        });
-        
-        autoThread.start();
-        
-        manualThread.join();
-        autoThread.join();
-        
-        assertEquals(
-                "Graph should contain elements. autoThread.onClose() should be COMMIT.",
-                1,
-                IteratorUtils.count(graph.vertices())
-        );
-    }
 }


[13/16] incubator-tinkerpop git commit: Updates to upgrade docs.

Posted by sp...@apache.org.
Updates to upgrade docs.


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

Branch: refs/heads/master
Commit: 7ecd3538eaa2ab3581200e74f71ee1e1e45a4ea7
Parents: a806c7e
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sat Nov 7 09:29:07 2015 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Sat Nov 7 09:29:07 2015 -0500

----------------------------------------------------------------------
 .../upgrade-release-3.1.x-incubating.asciidoc   | 47 ++++++++++----------
 1 file changed, 23 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7ecd3538/docs/src/upgrade-release-3.1.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade-release-3.1.x-incubating.asciidoc b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
index ead97ae..bf692c0 100644
--- a/docs/src/upgrade-release-3.1.x-incubating.asciidoc
+++ b/docs/src/upgrade-release-3.1.x-incubating.asciidoc
@@ -67,13 +67,13 @@ to closing where a user must now explicitly call `commit()` to persist their mut
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
 
-Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ThreadLocal Transaction Settings
+++++++++++++++++++++++++++++++++
 
-The `Transaction.onReadWrite()` and `Transaction.onClose()` settings now need to be set for each thread (if another behavior than the default is desired).
-For gremlin-server users that may be changing these settings via scripts :
-If the settings are changed from a sessionless request they will now only apply to that one request.
-If the settings are changed from an in-session request they will now only apply to all future requests made in the scope of that session. 
+The `Transaction.onReadWrite()` and `Transaction.onClose()` settings now need to be set for each thread (if another
+behavior than the default is desired). For gremlin-server users that may be changing these settings via scripts.
+If the settings are changed for a sessionless request they will now only apply to that one request. If the settings are
+changed for an in-session request they will now only apply to all future requests made in the scope of that session.
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-885[TINKERPOP3-885]
 
@@ -140,10 +140,17 @@ Decomposition of AbstractTransaction
 The `AbstractTransaction` class has been abstracted into two different classes supporting two different modes of
 operation: `AbstractThreadLocalTransaction` and `AbstractThreadedTransaction`, where the former should be used when
 supporting `ThreadLocal` transactions and the latter for threaded transactions.  Of course, providers may still
-choose to build their own implementation on `AbstractTransaction` itself or simply implementing the `Transaction`
+choose to build their own implementation on `AbstractTransaction` itself or simply implement the `Transaction`
 interface.
 
-See link:https://issues.apache.org/jira/browse/TINKERPOP3-765[TINKERPOP3-765] for more information.
+The `AbstractTransaction` gains the following methods to potentially implement (though default implementations
+are supplied in `AbstractThreadLocalTransaction` and `AbstractThreadedTransaction`):
+
+* `doReadWrite` that should execute the read-write consumer.
+* `doClose` that should execute the close consumer.
+
+See link:https://issues.apache.org/jira/browse/TINKERPOP3-765[TINKERPOP3-765] and
+link:https://issues.apache.org/jira/browse/TINKERPOP3-885[TINKERPOP3-885] for more information.
 
 Transaction.close() Default Behavior
 ++++++++++++++++++++++++++++++++++++
@@ -158,17 +165,6 @@ If these tests were referenced in an `OptOut`, then their names should be update
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-805[TINKERPOP3-805] for more information.
 
-AbstractTransaction implementation changes
-++++++++++++++++++++++++++++++++++++++++++
-The `AbstractTransaction` class now requires implementing four new methods: 
-
-* `doReadWrite` that should execute the read-write consumer.
-* `doClose` that should execute the close consumer.
-* `setReadWrite` that should set the read-write consumer for the transaction.
-* `setClose` that should set the close consumer for the transaction.
-
-You can refer to `AbstractThreadLocalTransaction` and `AbstractThreadedTransaction` for examples.
-
 Graph Traversal Updates
 +++++++++++++++++++++++
 
@@ -216,9 +212,12 @@ parameter or the other if either is supplied.
 
 See link:https://issues.apache.org/jira/browse/TINKERPOP3-913[TINKERPOP3-913] for more information.
 
-Transaction.onReadWrite() and Transaction.onClose() are now `ThreadLocal` settings
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ThreadLocal Transaction Settings
+++++++++++++++++++++++++++++++++
+
+If a driver configures the `Transaction.onReadWrite()` or `Transaction.onClose()` settings, note that these settings no
+longer apply to all future requests. If the settings are changed for a sessionless request they will only apply to
+that one request. If the settings are changed from an in-session request they will only apply to all future requests
+made in the scope of that session.
 
-If your driver configures the `Transaction.onReadWrite()` or `Transaction.onClose()` settings, note that these no longer apply to all future requests. 
-If the settings are changed from a sessionless request they will only apply to that one request.
-If the settings are changed from an in-session request they will only apply to all future requests made in the scope of that session. 
+See link:https://issues.apache.org/jira/browse/TINKERPOP3-885[TINKERPOP3-885] for more information.
\ No newline at end of file


[05/16] incubator-tinkerpop git commit: Merge remote-tracking branch 'origin/master' into TINKERPOP3-885

Posted by sp...@apache.org.
Merge remote-tracking branch 'origin/master' into TINKERPOP3-885


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

Branch: refs/heads/master
Commit: 9881e6ecb651b3300dea1ad887d22ce1f4763b51
Parents: 5b0dd76 a1d4f19
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Oct 21 09:03:35 2015 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Oct 21 09:03:35 2015 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              | 28 ++++++++++++++++++--
 .../upgrade-release-3.0.x-incubating.asciidoc   |  4 +--
 2 files changed, 28 insertions(+), 4 deletions(-)
----------------------------------------------------------------------



[14/16] incubator-tinkerpop git commit: Update changelog.

Posted by sp...@apache.org.
Update changelog.


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

Branch: refs/heads/master
Commit: 02623c7f59df26f18c4bb4acb859b55894b5ab3f
Parents: 7ecd353
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sat Nov 7 09:30:09 2015 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Sat Nov 7 09:30:09 2015 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/02623c7f/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 010142e..87bf9a3 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
 TinkerPop 3.1.0 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* `Transaction` settings for `onReadWrite` and `onClose` are now `ThreadLocal` in nature of standard transactions.
 * Optimized `BulkLoaderVertexProgram`. It now uses `EventStrategy` to monitor what the underlying `BulkLoader` implementation does (e.g. whether it creates a new vertex or returns an existing).
 * Integrated `NumberHelper` in `SumStep`, `MinStep`, `MaxStep` and `MeanStep` (local and global step variants).
 * `CountMatchAlgorithm`, in OLAP, now biases traversal selection towards those traversals that start at the current traverser location to reduce message passing.


[10/16] incubator-tinkerpop git commit: Merge pull request #1 from PommeVerte/TP-885

Posted by sp...@apache.org.
Merge pull request #1 from PommeVerte/TP-885

moved logic to AbstractThreadLocalTransaction and added a couple of tests

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

Branch: refs/heads/master
Commit: 789d6f70c7a76f2e6fb935d3dc1a659b8c0c871b
Parents: 35e97f0 7ce6784
Author: Dylan Millikin <dy...@gmail.com>
Authored: Fri Nov 6 22:45:40 2015 +0100
Committer: Dylan Millikin <dy...@gmail.com>
Committed: Fri Nov 6 22:45:40 2015 +0100

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  44 +-
 CONTRIBUTING.asciidoc                           | 236 +-----
 RELEASE.asciidoc                                | 172 -----
 docs/src/acknowledgements.asciidoc              |  19 +-
 docs/src/conclusion.asciidoc                    |   6 +-
 docs/src/developer-administration.asciidoc      |  91 +++
 docs/src/developer-contributing.asciidoc        | 308 ++++++++
 docs/src/developer-meetings.asciidoc            |  64 ++
 docs/src/developer-release.asciidoc             | 171 +++++
 docs/src/developer.asciidoc                     |  33 +
 docs/src/gremlin-applications.asciidoc          | 721 +++++++++++++++----
 docs/src/implementations.asciidoc               | 562 +++++++++++----
 docs/src/intro.asciidoc                         | 173 ++++-
 docs/src/preface.asciidoc                       |  42 +-
 docs/src/the-graph.asciidoc                     | 245 +++++--
 docs/src/the-graphcomputer.asciidoc             | 201 +++++-
 docs/src/the-traversal.asciidoc                 | 666 ++++++++++++-----
 .../upgrade-release-3.0.x-incubating.asciidoc   |   4 +-
 .../upgrade-release-3.1.x-incubating.asciidoc   | 113 ++-
 docs/static/images/gremlin-gym.pdf              | Bin 0 -> 963978 bytes
 docs/static/images/gremlin-gym.png              | Bin 0 -> 273111 bytes
 docs/static/images/gremlin-standing-strong.png  | Bin 0 -> 30985 bytes
 .../images/keep-on-traversin-tiedye-title.png   | Bin 0 -> 943206 bytes
 docs/static/images/keep-on-traversin-tiedye.png | Bin 0 -> 581914 bytes
 docs/static/images/keep-on-traversin-title.png  | Bin 0 -> 669529 bytes
 docs/static/images/keep-on-traversin.png        | Bin 0 -> 400941 bytes
 docs/static/images/not-tinkerpop3-gremlin.png   | Bin 0 -> 186676 bytes
 docs/static/images/provider-integration.png     | Bin 372429 -> 226464 bytes
 docs/static/images/quantum-gremlin.png          | Bin 0 -> 69142 bytes
 docs/static/images/tinkerpop3.graffle           | 236 +++---
 .../process/computer/GiraphGraphComputer.java   |  16 +-
 .../computer/io/GiraphVertexInputFormat.java    |  70 --
 .../computer/io/GiraphVertexOutputFormat.java   |  65 --
 .../process/computer/io/GiraphVertexReader.java |  67 --
 .../process/computer/io/GiraphVertexWriter.java |  57 --
 .../structure/io/GiraphVertexInputFormat.java   |  70 ++
 .../structure/io/GiraphVertexOutputFormat.java  |  65 ++
 .../giraph/structure/io/GiraphVertexReader.java |  67 ++
 .../giraph/structure/io/GiraphVertexWriter.java |  57 ++
 .../GephiTraversalVisualizationStrategy.groovy  |   2 +-
 .../gremlin/process/computer/GraphComputer.java |  19 +-
 .../computer/bulkloading/BulkLoader.java        |  31 +
 .../bulkloading/BulkLoaderVertexProgram.java    | 115 ++-
 .../bulkloading/IncrementalBulkLoader.java      |  14 +-
 .../traversal/TraversalVertexProgram.java       |   4 +-
 .../gremlin/process/traversal/NumberHelper.java | 288 ++++++++
 .../gremlin/process/traversal/Operator.java     |  78 +-
 .../traversal/dsl/graph/GraphTraversal.java     |  23 +-
 .../dsl/graph/GraphTraversalSource.java         |  10 +-
 .../gremlin/process/traversal/dsl/graph/__.java |   9 +-
 .../process/traversal/lambda/LoopTraversal.java |   4 +
 .../traversal/step/branch/RepeatStep.java       |   8 +
 .../process/traversal/step/map/GraphStep.java   | 149 ++++
 .../process/traversal/step/map/MatchStep.java   |  46 +-
 .../traversal/step/map/MaxGlobalStep.java       |  14 +-
 .../traversal/step/map/MaxLocalStep.java        |   5 +-
 .../traversal/step/map/MeanGlobalStep.java      |  61 +-
 .../traversal/step/map/MeanLocalStep.java       |  11 +-
 .../traversal/step/map/MinGlobalStep.java       |  14 +-
 .../traversal/step/map/MinLocalStep.java        |   5 +-
 .../traversal/step/map/SumGlobalStep.java       |  25 +-
 .../traversal/step/map/SumLocalStep.java        |   5 +-
 .../traversal/step/sideEffect/GraphStep.java    | 101 ---
 .../step/util/TraversalComparator.java          |   5 +-
 .../strategy/decoration/ConnectiveStrategy.java |   3 +-
 .../strategy/decoration/ElementIdStrategy.java  |   2 +-
 .../strategy/decoration/PartitionStrategy.java  |   2 +-
 .../strategy/decoration/SubgraphStrategy.java   |   2 +-
 .../finalization/LazyBarrierStrategy.java       |   2 +-
 .../ComputerVerificationStrategy.java           |  39 +-
 .../process/traversal/util/TraversalHelper.java |   3 +
 .../util/AbstractThreadLocalTransaction.java    |  38 +-
 .../util/AbstractThreadedTransaction.java       |  29 +-
 .../structure/util/AbstractTransaction.java     |  50 +-
 .../traversal/OperatorExceptionTest.java        |  39 +-
 .../gremlin/process/traversal/OperatorTest.java | 100 ++-
 .../traversal/step/map/GraphStepTest.java       |  41 ++
 .../traversal/step/map/MatchStepTest.java       |  82 ++-
 .../traversal/step/map/MeanGlobalStepTest.java  |  14 +
 .../traversal/step/map/MeanLocalStepTest.java   |  14 +
 .../ElementIdStrategyTraverseTest.java          |   4 +-
 .../PartitionStrategyTraverseTest.java          |   4 +-
 .../SubgraphStrategyTraverseTest.java           |   5 +-
 .../apache/tinkerpop/gremlin/driver/Client.java |  71 +-
 .../apache/tinkerpop/gremlin/driver/Tokens.java |   6 +
 .../driver/ser/GryoMessageSerializerV1d0.java   |  13 +-
 .../gremlin/driver/AbstractResultQueueTest.java |  23 +
 .../gremlin/driver/ResultQueueTest.java         |  15 +-
 .../ser/GryoMessageSerializerV1d0Test.java      |  55 ++
 .../traversal/step/map/GroovyGraphTest.groovy   |  50 ++
 .../traversal/step/map/GroovyOrderTest.groovy   |  10 +
 .../step/sideEffect/GroovyGroupTest.groovy      |   2 +-
 .../step/sideEffect/GroovySackTest.groovy       |   4 +-
 .../process/GroovyProcessComputerSuite.java     |   2 +
 .../process/GroovyProcessStandardSuite.java     |   2 +
 ...linGroovyScriptEngineTimedInterruptTest.java |  12 +-
 .../groovy/util/DependencyGrabberTest.java      |   8 +-
 gremlin-server/pom.xml                          |  25 +
 .../tinkerpop/gremlin/server/GremlinServer.java |  53 +-
 .../tinkerpop/gremlin/server/Settings.java      |   5 +
 .../handler/HttpGremlinEndpointHandler.java     |  47 +-
 .../handler/NioGremlinBinaryRequestDecoder.java |   5 +
 .../handler/WsGremlinBinaryRequestDecoder.java  |   5 +
 .../handler/WsGremlinCloseRequestDecoder.java   |   5 +
 .../handler/WsGremlinTextRequestDecoder.java    |   5 +
 .../server/op/AbstractEvalOpProcessor.java      |   2 +-
 .../server/op/session/SessionOpProcessor.java   |   9 +-
 .../server/op/standard/StandardOpProcessor.java |  20 +-
 .../AbstractGremlinServerIntegrationTest.java   |   7 +-
 .../server/GremlinDriverIntegrateTest.java      | 101 ++-
 .../server/GremlinServerAuthIntegrateTest.java  |  35 +
 .../server/GremlinServerHttpIntegrateTest.java  |  38 +-
 .../server/GremlinServerIntegrateTest.java      | 125 ++++
 .../gremlin/process/ProcessComputerSuite.java   |   2 +
 .../gremlin/process/ProcessStandardSuite.java   |   2 +
 .../process/computer/GraphComputerTest.java     |  34 +-
 .../traversal/step/map/AddVertexTest.java       |   2 +-
 .../process/traversal/step/map/GraphTest.java   | 109 +++
 .../process/traversal/step/map/OrderTest.java   |  58 +-
 .../process/traversal/step/map/SumTest.java     |   2 +-
 .../traversal/step/sideEffect/GroupTest.java    |  22 +-
 .../traversal/step/sideEffect/SackTest.java     |  20 +-
 .../PartitionStrategyProcessTest.java           |  13 +-
 ...ComputerVerificationStrategyProcessTest.java |   3 +-
 .../gremlin/structure/TransactionTest.java      | 174 +++++
 .../conf/hadoop-grateful-gryo.properties        |   2 +-
 .../tinkerpop/gremlin/hadoop/Constants.java     |   1 -
 .../structure/hdfs/HadoopElementIterator.java   |   4 +-
 .../hadoop/structure/io/HadoopPools.java        |   2 +-
 .../hadoop/structure/io/InputOutputHelper.java  |  22 +
 .../hadoop/structure/util/HadoopHelper.java     |  50 --
 .../groovy/plugin/HadoopGremlinPluginTest.java  |   2 +-
 neo4j-gremlin/pom.xml                           |  28 +-
 .../step/sideEffect/Neo4jGraphStep.java         |  10 +-
 .../optimization/Neo4jGraphStepStrategy.java    |  13 +-
 .../gremlin/neo4j/structure/Neo4jGraph.java     |   1 +
 .../gremlin/neo4j/structure/Neo4jHelper.java    |  16 +-
 .../traversal/strategy/Neo4jStrategySuite.java  |  44 ++
 .../traversal/strategy/Neo4jStrategyTest.java   |  32 +
 .../Neo4jGraphStepStrategyTest.java             |  76 ++
 pom.xml                                         |  34 +-
 .../process/computer/SparkGraphComputer.java    | 102 ++-
 .../process/computer/io/InputFormatRDD.java     |  47 --
 .../spark/process/computer/io/InputRDD.java     |  41 --
 .../process/computer/io/OutputFormatRDD.java    |  49 --
 .../spark/process/computer/io/OutputRDD.java    |  31 -
 .../spark/structure/io/InputFormatRDD.java      |  47 ++
 .../spark/structure/io/InputOutputHelper.java   |  81 +++
 .../gremlin/spark/structure/io/InputRDD.java    |  41 ++
 .../spark/structure/io/OutputFormatRDD.java     |  49 ++
 .../gremlin/spark/structure/io/OutputRDD.java   |  31 +
 .../spark/structure/io/PersistedInputRDD.java   |  60 ++
 .../spark/structure/io/PersistedOutputRDD.java  |  41 ++
 .../process/computer/LocalPropertyTest.java     | 100 +++
 .../process/computer/io/ExampleInputRDD.java    |  47 --
 .../process/computer/io/ExampleOutputRDD.java   |  45 --
 .../process/computer/io/InputOutputRDDTest.java |  59 --
 .../spark/process/computer/io/InputRDDTest.java |  54 --
 .../process/computer/io/OutputRDDTest.java      |  62 --
 .../spark/structure/io/ExampleInputRDD.java     |  51 ++
 .../spark/structure/io/ExampleOutputRDD.java    |  50 ++
 .../spark/structure/io/InputOutputRDDTest.java  |  60 ++
 .../spark/structure/io/InputRDDTest.java        |  55 ++
 .../spark/structure/io/OutputRDDTest.java       |  63 ++
 .../io/PersistedInputOutputRDDTest.java         | 216 ++++++
 .../step/sideEffect/TinkerGraphStep.java        |  10 +-
 .../optimization/TinkerGraphStepStrategy.java   |  13 +-
 .../tinkergraph/structure/TinkerFactory.java    |   8 +-
 .../tinkergraph/structure/TinkerGraph.java      |  59 +-
 .../tinkergraph/TinkerGraphProvider.java        |  14 +-
 .../strategy/TinkerGraphStrategySuite.java      |  44 ++
 .../strategy/TinkerGraphStrategyTest.java       |  32 +
 .../TinkerGraphStepStrategyTest.java            |  33 +-
 .../structure/TinkerGraphIdManagerTest.java     |  18 +-
 .../structure/TinkerGraphPlayTest.java          |  41 +-
 .../tinkergraph/structure/TinkerGraphTest.java  |  16 +-
 176 files changed, 6974 insertions(+), 2494 deletions(-)
----------------------------------------------------------------------



[15/16] incubator-tinkerpop git commit: Update reference docs to denote the ThreadLocal nature of the transaction settings.

Posted by sp...@apache.org.
Update reference docs to denote the ThreadLocal nature of the transaction settings.


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

Branch: refs/heads/master
Commit: 6b532f78900f631b9d71d37c1b8293ec8adab71d
Parents: 02623c7
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Sat Nov 7 09:32:34 2015 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Sat Nov 7 09:32:34 2015 -0500

----------------------------------------------------------------------
 docs/src/the-graph.asciidoc | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6b532f78/docs/src/the-graph.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/the-graph.asciidoc b/docs/src/the-graph.asciidoc
index b84d08a..eceec21 100644
--- a/docs/src/the-graph.asciidoc
+++ b/docs/src/the-graph.asciidoc
@@ -225,6 +225,9 @@ this method:
 * `ROLLBACK` - automatically rollback an open transaction
 * `MANUAL` - throw an exception if a transaction is open, forcing the user to explicitly close the transaction
 
+IMPORTANT: As transactions are `ThreadLocal` in nature, so are the transaction configurations for `onReadWrite` and
+`onClose`.
+
 Once there is an understanding for how transactions are configured, most of the rest of the `Transaction` interface
 is self-explanatory. Note that <<neo4j-gremlin,Neo4j-Gremlin>> is used for the examples to follow as TinkerGraph does
 not support transactions.


[08/16] incubator-tinkerpop git commit: Merge branch 'TP-885' of https://github.com/PommeVerte/incubator-tinkerpop into TP-885

Posted by sp...@apache.org.
Merge branch 'TP-885' of https://github.com/PommeVerte/incubator-tinkerpop into TP-885

Conflicts:
	gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/TransactionTest.java


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

Branch: refs/heads/master
Commit: 956d34de836693ea0bdd552ce434493ed7d1b14c
Parents: 46f821a 3938cae
Author: Dylan Millikin <dy...@brightzone.fr>
Authored: Fri Nov 6 20:40:23 2015 +0100
Committer: Dylan Millikin <dy...@brightzone.fr>
Committed: Fri Nov 6 20:40:23 2015 +0100

----------------------------------------------------------------------

----------------------------------------------------------------------