You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2018/02/12 09:08:55 UTC

[1/5] jena git commit: promote(TxnType)

Repository: jena
Updated Branches:
  refs/heads/master cfad34201 -> 48c6dc645


promote(TxnType)


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

Branch: refs/heads/master
Commit: d8306ce261fe0bd07ede33426b9850ecd16f8b6e
Parents: 161c03e
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Feb 3 15:03:41 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Feb 9 21:26:49 2018 +0000

----------------------------------------------------------------------
 .../jena/sparql/core/DatasetGraphMap.java       |   1 +
 .../jena/sparql/core/DatasetGraphMapLink.java   |   1 +
 .../jena/sparql/core/DatasetGraphOne.java       |   1 +
 .../jena/sparql/core/DatasetGraphSink.java      |   1 +
 .../jena/sparql/core/DatasetGraphWrapper.java   |   4 +
 .../jena/sparql/core/DatasetGraphZero.java      |   1 +
 .../apache/jena/sparql/core/DatasetImpl.java    |   5 +
 .../apache/jena/sparql/core/Transactional.java  |  48 +++-
 .../jena/sparql/core/TransactionalLock.java     |   5 +
 .../sparql/core/TransactionalNotSupported.java  |   3 +
 .../core/TransactionalNotSupportedMixin.java    |  18 +-
 .../jena/sparql/core/TransactionalNull.java     |   5 +
 .../sparql/core/mem/DatasetGraphInMemory.java   |  15 +-
 .../jena/sparql/util/DyadicDatasetGraph.java    |   5 +
 .../java/org/apache/jena/system/TxnCounter.java |   9 +-
 .../jena/sparql/core/DatasetGraphSimpleMem.java | 227 +++++++++----------
 .../main/java/org/apache/jena/shared/Lock.java  |   2 +-
 .../jena/dboe/transaction/txn/Transaction.java  |   9 +
 .../transaction/txn/TransactionCoordinator.java |  44 ++--
 .../dboe/transaction/txn/TransactionalBase.java |  12 +
 .../apache/jena/tdb2/store/DatasetGraphTDB.java |  10 +
 .../jena/tdb2/store/GraphViewSwitchable.java    |  20 +-
 .../jena/rdfconnection/RDFConnectionLocal.java  |   1 +
 .../rdfconnection/RDFConnectionModular.java     |   1 +
 .../jena/rdfconnection/RDFConnectionRemote.java |   1 +
 .../apache/jena/sdb/store/DatasetGraphSDB.java  |   1 +
 .../apache/jena/tdb/store/DatasetGraphTDB.java  |   1 +
 27 files changed, 272 insertions(+), 179 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
index d25aad1..df6762c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
@@ -74,6 +74,7 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
index f429192..b3f1880 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
@@ -131,6 +131,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     //@Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
index 40aa011..7c302c2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
@@ -77,6 +77,7 @@ public class DatasetGraphOne extends DatasetGraphBaseFind {
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public void commit()                      { txn.commit(); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }
     @Override public void end()                         { txn.end(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
index 1015ee6..2799aff 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
@@ -45,6 +45,7 @@ public class DatasetGraphSink extends DatasetGraphBaseFind {
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
index 9bb5fb9..e9dfd6e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
@@ -211,6 +211,10 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
     { return getT().promote(); }
     
     @Override
+    public boolean promote(TxnType type)
+    { return getT().promote(type); }
+    
+    @Override
     public void commit() 
     { getT().commit(); }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
index 4ada686..376721e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
@@ -45,6 +45,7 @@ public class DatasetGraphZero extends DatasetGraphBaseFind {
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
index dfb8262..85bf584 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
@@ -120,6 +120,11 @@ public class DatasetImpl implements Dataset
     }
 
     @Override
+    public boolean promote(TxnType txnType) {
+        return transactional.promote(txnType);
+    }
+    
+    @Override
     public ReadWrite transactionMode() {
         return transactional.transactionMode();
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
index 271e287..ce36188 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
@@ -110,20 +110,50 @@ public interface Transactional
     public void begin(ReadWrite readWrite) ;
     
     /**
-     * Attempt to promote a transaction from "read" to "write" and the transaction
-     * start with a "promote" mode ({@code READ_PROMOTE} or {@code READ_COMMITTED_PROMOTE}).
+     * Attempt to promote a transaction from "read" to "write" when the transaction
+     * started with a "promote" mode ({@code READ_PROMOTE} or
+     * {@code READ_COMMITTED_PROMOTE}).
      * <p>
-     * Returns "true" if the transaction is in write mode after the call.
-     * The method always succeeds of the transaction is already
-     * "write".
+     * Returns "true" if the transaction is in write mode after the call. The method
+     * always succeeds of the transaction is already "write".
      * <p>
-     * This method returns true if a {@code READ_PROMOTE} or {@code READ_COMMITTED_PROMOTE} is promoted.
+     * A {@code READ_COMMITTED_PROMOTE} can always be promoted, but the call can need to
+     * wait. This method returns true if a {@code READ_PROMOTE} or
+     * {@code READ_COMMITTED_PROMOTE} is promoted.
      * <p>
-     * This method returns false if a {@code READ_PROMOTE} can't be promoted - the transaction is still valid and in "read" mode. 
+     * This method returns false if a {@code READ_PROMOTE} can't be promoted - the
+     * transaction is still valid and in "read" mode. Any further calls to
+     * {@code promote()} will also return false.
      * <p>
-     * This method throws an exception if there is an attempt to promote a "READ" transaction. 
+     * This method throws an exception if there is an attempt to promote a "READ"
+     * transaction.
      */
-    public boolean promote();
+    public default boolean promote() {
+        return promote(transactionType());
+    }
+
+    public enum Promote { ISOLATED, @Deprecated SERIALIZED, READ_COMMITTED } ; 
+    
+    /**
+     * Attempt to promote a transaction from "read" to "write" and the transaction. This
+     * method allows the form of promotion to be specified.
+     * <p>
+     * {@code READ_PROMOTE} treats the promotion as if the transaction was started
+     * with {@code READ_PROMOTE} (any other writer commiting since the transaction started
+     * blocks promotion) and {@code READ_COMMITTED_PROMOTE} treats the promotion as if the transaction was started
+     * with {@code READ_COMMITTED_PROMOTE} (intemediate writer commits become visible).
+     * <p> 
+     * Returns "true" if the transaction is in write mode after the call. The method
+     * always succeeds of the transaction is already "write".
+     * <p>
+     * This method returns true if a {@code READ_PROMOTE} or
+     * {@code READ_COMMITTED_PROMOTE} is promoted.
+     * <p>
+     * This method returns false if a {@code READ_PROMOTE} can't be promoted - the
+     * transaction is still valid and in "read" mode.
+     * <p>
+     */
+    public boolean promote(TxnType mode);
 
     /** Commit a transaction - finish the transaction and make any changes permanent (if a "write" transaction) */  
     public void commit() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
index 7086403..c4414de 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
@@ -133,6 +133,11 @@ public class TransactionalLock implements Transactional {
     }
 
     @Override
+    public boolean promote(TxnType txnType) { 
+        return false;
+    }
+
+    @Override
     public void commit() {
         endOnce() ;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
index f2ef1a0..1700fcb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
@@ -71,6 +71,9 @@ public class TransactionalNotSupported implements Transactional
     @Override public boolean promote()
     { throw new UnsupportedOperationException("Transactional.promote") ; }
     
+    @Override public boolean promote(TxnType txnType)
+    { throw new UnsupportedOperationException("Transactional.promote(TxnType)") ; }
+
     @Override
     public void commit()
     { throw new UnsupportedOperationException("Transactional.commit") ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
index 98fd2e9..66253ad 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
@@ -36,33 +36,35 @@ public interface TransactionalNotSupportedMixin extends Transactional
 
     @Override
     public default void begin(ReadWrite readWrite)
-    { throw new UnsupportedOperationException("Transactional.begin") ; }
+    { throw new UnsupportedOperationException("Transactional.begin(ReadWrite)") ; }
 
     @Override public default boolean promote()
-    { throw new UnsupportedOperationException("Transactional.promote") ; }
+    { throw new UnsupportedOperationException("Transactional.promote()") ; }
+    
+    @Override public default boolean promote(TxnType txnType)
+    { throw new UnsupportedOperationException("Transactional.promote(TxnType)") ; }
     
     @Override
     public default void commit()
-    { throw new UnsupportedOperationException("Transactional.commit") ; }
+    { throw new UnsupportedOperationException("Transactional.commit()") ; }
 
     @Override
     public default void abort()
-    { throw new UnsupportedOperationException("Transactional.abort") ; }
+    { throw new UnsupportedOperationException("Transactional.abort()") ; }
 
     @Override
     public default void end()
-    { throw new UnsupportedOperationException("Transactional.end") ; }
+    { throw new UnsupportedOperationException("Transactional.end()") ; }
 
     @Override
     public default boolean isInTransaction()
     { return false ; }
     
     @Override default public ReadWrite transactionMode()
-    { throw new UnsupportedOperationException("Transactional.transactionMode") ; }
+    { throw new UnsupportedOperationException("Transactional.transactionMode()") ; }
     
     @Override default public TxnType transactionType()
-    { throw new UnsupportedOperationException("Transactional.transactionType") ; }
-
+    { throw new UnsupportedOperationException("Transactional.transactionType()") ; }
     
     public default boolean supportsTransactions()
     { return false ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
index 7b8071a..1ab2e60 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
@@ -85,6 +85,11 @@ public class TransactionalNull implements Transactional {
     }
     
     @Override
+    public boolean promote(TxnType txnType) {
+        return promote(); 
+    }
+
+    @Override
     public void commit() {
         if ( ! inTransaction.get() )
             throw new JenaTransactionException("Not in transaction"); 

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
index 0a48161..8c965cd 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
@@ -176,17 +176,20 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
         version.remove();
         transactionLock.leaveCriticalSection();
     }
-     
+
     @Override
     public boolean promote() {
+        return promote(transactionType.get());
+    }
+    
+    @Override
+    public boolean promote(TxnType txnType) {
         if (!isInTransaction())
             throw new JenaTransactionException("Tried to promote outside a transaction!");
         if ( transactionMode().equals(ReadWrite.WRITE) )
             return true;
-
         boolean readCommitted;
-        // Initial state
-        switch(transactionType.get()) {
+        switch(txnType) {
             case WRITE :
                 return true;
             case READ :
@@ -210,8 +213,6 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
     }
     
     private void _promote(boolean readCommited) {
-        //System.err.printf("Promote: version=%d generation=%d\n", version.get() , generation.get()) ;
-        
         // Outside lock.
         if ( ! readCommited && version.get() != generation.get() )  {
             // This tests for any commited writers since this transaction started.
@@ -222,7 +223,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
         }
     
         // Blocking on other writers.
-        transactionLock.enterCriticalSection(false);
+        transactionLock.enterCriticalSection(Lock.WRITE);
         // Check again now we are inside the lock. 
         if ( ! readCommited && version.get() != generation.get() )  {
                 // Can't promote - release the lock.

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
index 439e6c8..ef68b59 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
@@ -78,6 +78,11 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
     }
 
     @Override
+    public boolean promote(TxnType txnType) {
+        // no mutation allowed
+        return false;
+    }
+    @Override
     public ReadWrite transactionMode() {
         return TxnType.convert(transactionType());
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java b/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
index 701e95a..e04a267 100644
--- a/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
+++ b/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
@@ -119,13 +119,18 @@ public class TxnCounter implements Transactional {
 
     @Override
     public boolean promote() {
+        return promote(transactionType.get());
+    }
+    
+    @Override
+    public boolean promote(TxnType txnType) {
         checkTxn();
         if ( transactionMode.get() == ReadWrite.WRITE )
             return true;
-        TxnType txnType = transactionType.get();
         if ( txnType == TxnType.READ )
             throw new JenaTransactionException("Attempt to promote a READ transsction");
         if ( txnType == TxnType.READ_COMMITTED_PROMOTE ) {
+            // READ_COMMITTED_PROMOTE
             acquireWriterLock(true);
             transactionMode.set(ReadWrite.WRITE);
             IntegerState state = new IntegerState(value.get());
@@ -146,7 +151,7 @@ public class TxnCounter implements Transactional {
         }
         return true;
     }
-    
+
     @Override
     public void commit() {
         checkTxn(); 

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
index 48ca221..1cea767 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
@@ -37,72 +37,74 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
     private MiniSet<Quad> quads = new MiniSet<>() ;
     
     /** Simple abstraction of a Set */
-    private static class MiniSet<T> implements Iterable<T>
-    {
-        final Collection<T> store ; 
-        MiniSet(Collection<T> store) { this.store = store ; }
-        
-        MiniSet() { this.store = new ArrayList<>() ; }
-        
-        void add(T t)
-        {
-            if ( !store.contains(t) ) 
-                store.add(t) ;
+    private static class MiniSet<T> implements Iterable<T> {
+        final Collection<T> store;
+
+        MiniSet(Collection<T> store) {
+            this.store = store;
+        }
+
+        MiniSet() {
+            this.store = new ArrayList<>();
         }
-        
-        void remove(T t)
-        {
-            store.remove(t) ; 
+
+        void add(T t) {
+            if ( !store.contains(t) )
+                store.add(t);
+        }
+
+        void remove(T t) {
+            store.remove(t);
         }
 
         @Override
-        public Iterator<T> iterator()
-        {
-            return store.iterator() ;
+        public Iterator<T> iterator() {
+            return store.iterator();
+        }
+
+        boolean isEmpty() {
+            return store.isEmpty();
+        }
+
+        int size() {
+            return store.size();
         }
-        
-        boolean isEmpty() { return store.isEmpty() ; }
-        
-        int size() { return store.size() ; }
     }
     
     public DatasetGraphSimpleMem() {}
-    
+
     @Override
     public boolean supportsTransactions() {
         return false;
     }
 
     @Override
-    public Iterator<Quad> findInDftGraph(Node s, Node p , Node o) 
-    {
-        List<Quad> results = new ArrayList<>() ;
+    public Iterator<Quad> findInDftGraph(Node s, Node p, Node o) {
+        List<Quad> results = new ArrayList<>();
         for ( Triple t : triples )
             if ( matches(t, s, p, o) )
                 // ?? Quad.defaultGraphNodeGenerated
-                //Quad.defaultGraphIRI
-                results.add(new Quad(Quad.defaultGraphIRI, t)) ;
-        return results.iterator() ;
+                // Quad.defaultGraphIRI
+                results.add(new Quad(Quad.defaultGraphIRI, t));
+        return results.iterator();
     }
-    
+
     @Override
-    public Iterator<Quad> findInSpecificNamedGraph(Node g, Node s, Node p , Node o)
-    {
-        List<Quad> results = new ArrayList<>() ;
+    public Iterator<Quad> findInSpecificNamedGraph(Node g, Node s, Node p, Node o) {
+        List<Quad> results = new ArrayList<>();
         for ( Quad q : quads )
             if ( matches(q, g, s, p, o) )
-                results.add(q) ;
-        return results.iterator() ;
+                results.add(q);
+        return results.iterator();
     }
-    
+
     @Override
-    public Iterator<Quad> findInAnyNamedGraphs(Node s, Node p , Node o)
-    {
-        List<Quad> results = new ArrayList<>() ;
+    public Iterator<Quad> findInAnyNamedGraphs(Node s, Node p, Node o) {
+        List<Quad> results = new ArrayList<>();
         for ( Quad q : quads )
             if ( matches(q, Node.ANY, s, p, o) )
-                results.add(q) ;
-        return results.iterator() ;
+                results.add(q);
+        return results.iterator();
     }
 
     /** Convert null to Node.ANY */
@@ -111,134 +113,123 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
     /** Convert null to some default Node */
     public static Node nullAsDft(Node x, Node dft) { return x==null ? dft : x ; }
 
-    private boolean matches(Triple t, Node s, Node p, Node o)
-    {
-        s = nullAsAny(s) ;
-        p = nullAsAny(p) ;
-        o = nullAsAny(o) ;
-        return t.matches(s,p,o) ;
+    private boolean matches(Triple t, Node s, Node p, Node o) {
+        s = nullAsAny(s);
+        p = nullAsAny(p);
+        o = nullAsAny(o);
+        return t.matches(s, p, o);
     }
 
-    private boolean matches(Quad q, Node g, Node s, Node p, Node o)
-    {
-        g = nullAsAny(g) ;
-        s = nullAsAny(s) ;
-        p = nullAsAny(p) ;
-        o = nullAsAny(o) ;
-        return q.matches(g,s,p,o) ;
+    private boolean matches(Quad q, Node g, Node s, Node p, Node o) {
+        g = nullAsAny(g);
+        s = nullAsAny(s);
+        p = nullAsAny(p);
+        o = nullAsAny(o);
+        return q.matches(g, s, p, o);
     }
 
     @Override
-    protected void addToDftGraph(Node s, Node p, Node o)
-    {
-        Triple t = new Triple(s, p, o) ;
-        triples.add(t) ;
+    protected void addToDftGraph(Node s, Node p, Node o) {
+        Triple t = new Triple(s, p, o);
+        triples.add(t);
     }
 
     @Override
-    protected void addToNamedGraph(Node g, Node s, Node p, Node o)
-    {
-        Quad q = new Quad(g, s, p, o) ;
-        quads.add(q) ;
+    protected void addToNamedGraph(Node g, Node s, Node p, Node o) {
+        Quad q = new Quad(g, s, p, o);
+        quads.add(q);
     }
 
     @Override
-    protected void deleteFromDftGraph(Node s, Node p, Node o)
-    {
-        triples.remove(new Triple(s, p, o)) ;
+    protected void deleteFromDftGraph(Node s, Node p, Node o) {
+        triples.remove(new Triple(s, p, o));
     }
 
     @Override
-    protected void deleteFromNamedGraph(Node g, Node s, Node p, Node o)
-    {
-        quads.remove(new Quad(g, s, p, o)) ;
+    protected void deleteFromNamedGraph(Node g, Node s, Node p, Node o) {
+        quads.remove(new Quad(g, s, p, o));
     }
 
-    class GraphDft extends GraphBase
-    {
+    class GraphDft extends GraphBase {
         @Override
-        public void performAdd(Triple t)
-        {
-            triples.add(t) ;
+        public void performAdd(Triple t) {
+            triples.add(t);
         }
 
         @Override
-        public void performDelete(Triple t) { triples.remove(t) ; }
+        public void performDelete(Triple t) {
+            triples.remove(t);
+        }
 
         @Override
-        protected ExtendedIterator<Triple> graphBaseFind(Triple m)
-        {
-            List<Triple> results = new ArrayList<>() ;
+        protected ExtendedIterator<Triple> graphBaseFind(Triple m) {
+            List<Triple> results = new ArrayList<>();
             for ( Triple t : triples )
                 if ( t.matches(m.getMatchSubject(), m.getMatchPredicate(), m.getMatchObject()) )
-                    results.add(t) ;
-            return WrappedIterator.create(results.iterator()) ;
+                    results.add(t);
+            return WrappedIterator.create(results.iterator());
         }
     }
-    
-    class GraphNamed extends GraphBase
-    {
-        private final Node graphName ;
 
-        GraphNamed(Node gname) { this.graphName = gname ; }
-        
+    class GraphNamed extends GraphBase {
+        private final Node graphName;
+
+        GraphNamed(Node gname) {
+            this.graphName = gname;
+        }
+
         @Override
-        public void performAdd(Triple t)
-        {
-            Quad q = new Quad(graphName, t) ;
-            quads.add(q) ;
+        public void performAdd(Triple t) {
+            Quad q = new Quad(graphName, t);
+            quads.add(q);
         }
 
         @Override
-        public void performDelete(Triple t) { Quad q = new Quad(graphName, t) ; quads.remove(q) ; }
+        public void performDelete(Triple t) {
+            Quad q = new Quad(graphName, t);
+            quads.remove(q);
+        }
 
         @Override
-        protected ExtendedIterator<Triple> graphBaseFind(Triple m)
-        {
-            List<Triple> results = new ArrayList<>() ;
-            
-            Iterator<Quad> iter = findNG(graphName, m.getMatchSubject(), m.getMatchPredicate(), m.getMatchObject()) ;
+        protected ExtendedIterator<Triple> graphBaseFind(Triple m) {
+            List<Triple> results = new ArrayList<>();
+
+            Iterator<Quad> iter = findNG(graphName, m.getMatchSubject(), m.getMatchPredicate(), m.getMatchObject());
             for ( ; iter.hasNext() ; )
-                results.add(iter.next().asTriple()) ;
-            return WrappedIterator.create(results.iterator()) ;
+                results.add(iter.next().asTriple());
+            return WrappedIterator.create(results.iterator());
         }
     }
-    
+
     @Override
-    public Graph getDefaultGraph()
-    {
-        return new GraphDft() ;
+    public Graph getDefaultGraph() {
+        return new GraphDft();
     }
 
     @Override
-    public Graph getGraph(Node graphNode)
-    {
-        return new GraphNamed(graphNode) ;
+    public Graph getGraph(Node graphNode) {
+        return new GraphNamed(graphNode);
     }
 
     @Override
-    public boolean containsGraph(Node graphNode)
-    {
-        return graphNodes().contains(graphNode) ;
+    public boolean containsGraph(Node graphNode) {
+        return graphNodes().contains(graphNode);
     }
 
     @Override
-    public Iterator<Node> listGraphNodes()
-    {
-        return graphNodes().iterator() ;
+    public Iterator<Node> listGraphNodes() {
+        return graphNodes().iterator();
     }
-    
-    private Set<Node> graphNodes()
-    {
-        Set<Node> x = new HashSet<>() ;
+
+    private Set<Node> graphNodes() {
+        Set<Node> x = new HashSet<>();
         for ( Quad q : quads )
-            x.add(q.getGraph()) ;
-        return x ;
+            x.add(q.getGraph());
+        return x;
     }
 
     @Override
-    public void close()
-    {}
+    public void close() {}
 
     @Override
     public boolean supportsTransactionAbort() {

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-core/src/main/java/org/apache/jena/shared/Lock.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/shared/Lock.java b/jena-core/src/main/java/org/apache/jena/shared/Lock.java
index 35f1421..40aa245 100644
--- a/jena-core/src/main/java/org/apache/jena/shared/Lock.java
+++ b/jena-core/src/main/java/org/apache/jena/shared/Lock.java
@@ -84,7 +84,7 @@ public interface Lock
      *  The application must call leaveCriticialSection.
      *  @see #leaveCriticalSection
      *
-     * @param readLockRequested true implies a read lock,false implies write lock.
+     * @param readLockRequested true implies a read lock, false implies write lock.
      */
     
     public void enterCriticalSection(boolean readLockRequested) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
index 6bac45c..7144fda 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
@@ -116,6 +116,15 @@ public class Transaction implements TransactionInfo {
         return true ;
     }
     
+    public boolean promote(boolean readCommitted) {
+        checkState(ACTIVE);
+        boolean b = txnMgr.promoteTxn(this, readCommitted) ;
+        if ( !b )
+            return false ;
+        mode = ReadWrite.WRITE;
+        return true ;
+    }
+    
     /*package*/ void promoteComponents() {
         // Call back from the Transaction coordinator during promote.
         components.forEach((c) -> {

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
index 7c63bbf..81d3100 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
@@ -571,8 +571,8 @@ public class TransactionCoordinator {
     /** Whether to wait for writers when trying to promote */
     private static final boolean promotionWaitForWriters = true;
 
-    /** Attempt to promote a transaction from READ to WRITE.
-     * Return true for a No-op for a transaction already a writer.
+    /** Attempt to promote a transaction from READ mode to WRITE mode based on its declared start type.
+     * Return true if the transaction is already a writer.
      */
     /*package*/ boolean promoteTxn(Transaction transaction) {
         if ( transaction.getMode() == ReadWrite.WRITE )
@@ -591,23 +591,29 @@ public class TransactionCoordinator {
         // If this test fails outside the lock it will fail inside.
         // If it passes, we have to test again in case there is an active writer.
         
-        //boolean readCommittedPromotion = transaction.getTxnType() == TxnType.READ_COMMITTED_PROMOTE;
-        
-        // Once we have acquireWriterLock, we are single writer.
-        // We may have to discard writer status because eocne we can make the defintite
-        // decision on promotion, we find we can't promote after all.
-        
+        boolean readCommittedPromotion = transaction.getTxnType() == TxnType.READ_COMMITTED_PROMOTE;
+        return promoteTxn$(transaction, readCommittedPromotion);
+    }
+    
+    /** Attempt to promote a transaction from READ mode to WRITE mode based.
+     *  Whether intevening commits are seen is determined by the boolean flag.
+     * Return true if the transaction is already a writer.
+     */
+    /*package*/ boolean promoteTxn(Transaction transaction, boolean readCommittedPromotion) {
+        if ( transaction.getMode() == ReadWrite.WRITE )
+            return true ;
+        // XXX Not sure what the right choice is.
+        if ( transaction.getTxnType() == TxnType.READ )
+            throw new TransactionException("promote: can't promote a READ transaction") ;
+        return promoteTxn$(transaction, readCommittedPromotion);
+    }
+    
+    private boolean promoteTxn$(Transaction transaction, boolean readCommittedPromotion) {
         // == Read committed path.
         if ( transaction.getTxnType() == TxnType.READ_COMMITTED_PROMOTE ) {
-            /*
-             * acquireWriterLock(true) ;
-             * synchronized(coordinatorLock) {
-             * begin$ ==>
-             *    reset transaction.
-             *    promote components
-             *    reset dataVersion
-             */
-            acquireWriterLock(true) ;
+            if ( ! promotionWaitForWriters() )
+                return false;
+            // Now single writer.
             synchronized(coordinatorLock) {
                 try { 
                     transaction.promoteComponents() ;
@@ -632,7 +638,7 @@ public class TransactionCoordinator {
             return false;
 
         // Take writer lock.
-        if ( ! waitForWriters() )
+        if ( ! promotionWaitForWriters() )
             // Failed to become a writer.
             return false;
         
@@ -674,7 +680,7 @@ public class TransactionCoordinator {
         return true;
     }
     
-    private boolean waitForWriters() {
+    private boolean promotionWaitForWriters() {
         if ( promotionWaitForWriters )
             return acquireWriterLock(true) ;
         else

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
index 25807aa..5dd6e86 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
@@ -20,6 +20,7 @@ package org.apache.jena.dboe.transaction.txn;
 
 import java.util.Objects ;
 
+import org.apache.jena.atlas.lib.InternalErrorException;
 import org.apache.jena.atlas.lib.Lib;
 import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.query.ReadWrite ;
@@ -117,6 +118,17 @@ public class TransactionalBase implements TransactionalSystem {
     }
 
     @Override
+    public final boolean promote(TxnType txnType) {
+        checkActive() ;
+        if ( txnType != TxnType.READ_COMMITTED_PROMOTE && 
+             txnType != TxnType.READ_PROMOTE )
+           throw new InternalErrorException("Transaction type is not "+TxnType.READ_PROMOTE+ " nor "+TxnType.READ_COMMITTED_PROMOTE);
+        boolean readCommitted = (txnType == TxnType.READ_COMMITTED_PROMOTE) ;
+        Transaction txn = getValidTransaction() ;
+        return txn.promote(readCommitted) ;
+    }
+
+    @Override
     public final void commit() {
         checkRunning() ;
         TransactionalSystem.super.commit() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
index 5a0e7f7..5acec81 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
@@ -445,6 +445,16 @@ public class DatasetGraphTDB extends DatasetGraphTriplesQuads
     }
 
     @Override
+    public boolean promote(TxnType txnType) {
+        if ( txnMonitor != null ) txnMonitor.startPromote();
+        try { 
+            return txnSystem.promote(txnType) ;
+        } finally { 
+            if ( txnMonitor != null ) txnMonitor.finishPromote();
+        }
+    }
+
+    @Override
     public void commit() {
         if ( txnMonitor != null ) txnMonitor.startCommit();
         txnSystem.commit();

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
index c82af4f..cd5f561 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
@@ -20,7 +20,6 @@ package org.apache.jena.tdb2.store;
 
 import java.util.Map ;
 
-import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.shared.PrefixMapping ;
 import org.apache.jena.shared.impl.PrefixMappingImpl ;
@@ -71,9 +70,9 @@ public class GraphViewSwitchable extends GraphView {
         return getx() ;
     }
 
-    // TDB2 specific.
-    // Does not cope with blank nodes.
-    // A PrefixMapping sending operations via the switchable.
+    // DatasetPrefixStorage specific with getting the DatasetPrefixStorage
+    // done at the point the operation happens.
+    // Long term: Function to get DatasetPrefixStorage
     // Long term, rework as PrefixMapping over PrefixMap over DatasetPrefixStorage
     private PrefixMapping prefixMapping(Node graphName) {
         return new PrefixMappingImplTDB2(graphName); 
@@ -93,19 +92,11 @@ public class GraphViewSwitchable extends GraphView {
                 gn = "";
         }                    
 
-        DatasetPrefixStorage dps() {
+        private DatasetPrefixStorage dps() {
             return ((DatasetGraphTDB)(getx().get())).getPrefixes();
         }
 
-        Graph graph() {
-            DatasetGraphTDB dsg = (DatasetGraphTDB)getx().get();
-            if ( gn == null )
-                return dsg.getDefaultGraph();
-            else
-                return dsg.getGraph(graphName);
-        }
-
-        PrefixMapping prefixMapping() {
+        private PrefixMapping prefixMapping() {
             if ( gn == null )
                 return dps().getPrefixMapping();
             else
@@ -134,7 +125,6 @@ public class GraphViewSwitchable extends GraphView {
         @Override
         public Map<String, String> getNsPrefixMap() {
             return prefixMapping().getNsPrefixMap();
-            //return graph().getPrefixMapping().getNsPrefixMap();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
----------------------------------------------------------------------
diff --git a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
index f2d64ae..5c6e42f 100644
--- a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
+++ b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
@@ -296,6 +296,7 @@ public class RDFConnectionLocal implements RDFConnection {
     @Override public void begin(TxnType txnType)        { dataset.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { dataset.begin(mode); }
     @Override public boolean promote()                  { return dataset.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return dataset.promote(txnType); }
     @Override public void commit()                      { dataset.commit(); }
     @Override public void abort()                       { dataset.abort(); }
     @Override public boolean isInTransaction()          { return dataset.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
----------------------------------------------------------------------
diff --git a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
index 97bd3b5..b6f215e 100644
--- a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
+++ b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
@@ -38,6 +38,7 @@ public class RDFConnectionModular implements RDFConnection {
     @Override public void begin(TxnType txnType)        { transactional.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { transactional.begin(mode); }
     @Override public boolean promote()                  { return transactional.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return transactional.promote(txnType); }
     @Override public void commit()                      { transactional.commit(); }
     @Override public void abort()                       { transactional.abort(); }
     @Override public boolean isInTransaction()          { return transactional.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
----------------------------------------------------------------------
diff --git a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
index 3666bc4..4960484 100644
--- a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
+++ b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
@@ -422,6 +422,7 @@ public class RDFConnectionRemote implements RDFConnection {
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
----------------------------------------------------------------------
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
index 7c02665..dda35e9 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
@@ -118,6 +118,7 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/d8306ce2/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java b/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
index d4390dc..13f8c18 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
@@ -261,6 +261,7 @@ public class DatasetGraphTDB extends DatasetGraphTriplesQuads
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public boolean promote()                  { return txn.promote(); }
+    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }


[2/5] jena git commit: promote(Promote mode)

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB1.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB1.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB1.java
deleted file mode 100644
index 828bcab..0000000
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB1.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.tdb2.solver;
-
-import java.util.function.Predicate;
-
-import org.apache.jena.atlas.lib.tuple.Tuple ;
-import org.apache.jena.atlas.logging.Log ;
-import org.apache.jena.graph.Graph ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.sparql.ARQInternalErrorException ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.algebra.op.* ;
-import org.apache.jena.sparql.algebra.optimize.TransformFilterPlacement ;
-import org.apache.jena.sparql.core.BasicPattern ;
-import org.apache.jena.sparql.core.Quad ;
-import org.apache.jena.sparql.core.Substitute ;
-import org.apache.jena.sparql.core.Var ;
-import org.apache.jena.sparql.engine.ExecutionContext ;
-import org.apache.jena.sparql.engine.QueryIterator ;
-import org.apache.jena.sparql.engine.iterator.QueryIterPeek ;
-import org.apache.jena.sparql.engine.main.OpExecutor ;
-import org.apache.jena.sparql.engine.main.OpExecutorFactory ;
-import org.apache.jena.sparql.engine.main.QC ;
-import org.apache.jena.sparql.engine.main.iterator.QueryIterGraph ;
-import org.apache.jena.sparql.engine.optimizer.reorder.ReorderProc ;
-import org.apache.jena.sparql.engine.optimizer.reorder.ReorderTransformation ;
-import org.apache.jena.sparql.expr.ExprList ;
-import org.apache.jena.sparql.mgt.Explain ;
-import org.apache.jena.tdb2.store.DatasetGraphTDB;
-import org.apache.jena.tdb2.store.GraphTDB;
-import org.apache.jena.tdb2.store.NodeId;
-import org.slf4j.Logger ;
-import org.slf4j.LoggerFactory ;
-
-/** TDB executor for algebra expressions.  It is the standard ARQ executor
- *  except for basic graph patterns and filtered basic graph patterns (currently).  
- * 
- * See also: StageGeneratorDirectTDB, a non-reordering 
- */
-public class OpExecutorTDB1 extends OpExecutor
-{
-    private static final Logger log = LoggerFactory.getLogger(OpExecutorTDB1.class) ;
-    
-    public final static OpExecutorFactory OpExecFactoryTDB = new OpExecutorFactory()
-    {
-        @Override
-        public OpExecutor create(ExecutionContext execCxt)
-        { return new OpExecutorTDB1(execCxt) ; }
-    } ;
-    
-    private final boolean isForTDB ;
-    
-    // A new compile object is created for each op compilation.
-    // So the execCxt is changing as we go through the query-compile-execute process  
-    public OpExecutorTDB1(ExecutionContext execCxt)
-    {
-        super(execCxt) ;
-        // NB. The dataset may be a TDB one, or a general one.
-        // Any merged union graph magic (for a TDB dataset was handled
-        // in QueryEngineTDB).
-        
-        isForTDB = (execCxt.getActiveGraph() instanceof GraphTDB) ;
-    }
-
-    @Override
-    protected QueryIterator exec(Op op, QueryIterator input) {
-        if ( level < 0 )
-            // Print only at top level (and we're called before level++) 
-            Explain.explain("TDB", op, super.execCxt.getContext()) ;
-        return super.exec(op, input) ;
-    } 
-    
-    // Retrieving nodes isn't so bad because they will be needed anyway.
-    // And if their duplicates, likely to be cached.
-    // Need to work with SolverLib which wraps the NodeId bindgins with a converter. 
-    
-    @Override
-    protected QueryIterator execute(OpDistinct opDistinct, QueryIterator input)
-    {
-        return super.execute(opDistinct, input) ;
-    }
-    
-    @Override
-    protected QueryIterator execute(OpReduced opReduced, QueryIterator input)
-    {
-        return super.execute(opReduced, input) ;
-    }
-    
-    @Override
-    protected QueryIterator execute(OpFilter opFilter, QueryIterator input)
-    {
-        if ( ! isForTDB )
-            return super.execute(opFilter, input) ;
-        
-        // If the filter does not apply to the input??
-        // Where does ARQ catch this?
-        
-        // (filter (bgp ...))
-        if ( OpBGP.isBGP(opFilter.getSubOp()) )
-        {
-            // Still may be a TDB graph in a non-TDB dataset (e.g. a named model)
-            GraphTDB graph = (GraphTDB)execCxt.getActiveGraph() ;
-            OpBGP opBGP = (OpBGP)opFilter.getSubOp() ;
-            return executeBGP(graph, opBGP, input, opFilter.getExprs(), execCxt) ;
-        }
-        
-        // (filter (quadpattern ...))
-        if ( opFilter.getSubOp() instanceof OpQuadPattern )
-        {
-            OpQuadPattern quadPattern = (OpQuadPattern)opFilter.getSubOp() ;
-            DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
-            return optimizeExecuteQuads(ds, input,
-                                        quadPattern.getGraphNode(), quadPattern.getBasicPattern(),
-                                        opFilter.getExprs(), execCxt) ;
-        }
-    
-        // (filter (anything else))
-        return super.execute(opFilter, input) ;
-        }
-
-    // ---- Triple patterns
-    
-    @Override
-    protected QueryIterator execute(OpBGP opBGP, QueryIterator input)
-    {
-        if ( ! isForTDB )
-            return super.execute(opBGP, input) ;
-        
-        GraphTDB graph = (GraphTDB)execCxt.getActiveGraph() ;
-        return executeBGP(graph, opBGP, input, null, execCxt) ;
-       
-    }
-
-    @Override
-    protected QueryIterator execute(OpQuadPattern quadPattern, QueryIterator input)
-    {
-        if ( ! isForTDB )
-            return super.execute(quadPattern, input) ;
-            
-    //        DatasetGraph dg = execCxt.getDataset() ;
-    //        if ( ! ( dg instanceof DatasetGraphTDB ) )
-    //            throw new InternalErrorException("Not a TDB backed dataset in quad pattern execution") ;
-        
-        DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
-        BasicPattern bgp = quadPattern.getBasicPattern() ;
-        Node gn = quadPattern.getGraphNode() ;
-        return optimizeExecuteQuads(ds, input, gn, bgp, null, execCxt) ;
-    }
-
-    @Override
-    protected QueryIterator execute(OpGraph opGraph, QueryIterator input)
-    {
-        // Path evaluation or dataset sets which do not go straight to the DatasetGraphTDB  
-        return new QueryIterGraph(input, opGraph, execCxt) ;
-    }
-
-    /** Execute a BGP (and filters) on a TDB graph, which may be in default storage or it may be a named graph */ 
-    private static QueryIterator executeBGP(GraphTDB graph, OpBGP opBGP, QueryIterator input, ExprList exprs, 
-                                            ExecutionContext execCxt)
-    {
-        // Is it the real default graph (normal route or explicitly named)?
-        if ( ! isDefaultGraphStorage(graph.getGraphName()))
-        {
-            // Not default storage - it's a named graph in storage. 
-            DatasetGraphTDB ds = graph.getDSG() ;
-            return optimizeExecuteQuads(ds, input, graph.getGraphName(), opBGP.getPattern(), exprs, execCxt) ;
-        }
-        
-        // Execute a BGP on the real default graph
-        return optimizeExecuteTriples(graph, input, opBGP.getPattern(), exprs, execCxt) ;
-    }
-
-    /** Execute, with optimization, a basic graph pattern on the default graph storage */
-    private static QueryIterator optimizeExecuteTriples(GraphTDB graph, QueryIterator input,
-                                                        BasicPattern pattern, ExprList exprs,
-                                                        ExecutionContext execCxt)
-    {
-        if ( ! input.hasNext() )
-            return input ;
-    
-        // -- Input
-        // Must pass this iterator into the next stage.
-        if ( pattern.size() >= 2 )
-        {
-            // Must be 2 or triples to reorder. 
-            ReorderTransformation transform = graph.getDSG().getReorderTransform() ;
-            if ( transform != null )
-            {
-                QueryIterPeek peek = QueryIterPeek.create(input, execCxt) ;
-                input = peek ; // Must pass on
-                pattern = reorder(pattern, peek, transform) ;
-            }
-        }
-        // -- Filter placement
-            
-        Op op = null ;
-        if ( exprs != null )
-            op = TransformFilterPlacement.transform(exprs, pattern) ;
-        else
-            op = new OpBGP(pattern) ;
-        
-        return plainExecute(op, input, execCxt) ;
-    }
-
-    /** Execute, with optimization, a quad pattern */
-    private static QueryIterator optimizeExecuteQuads(DatasetGraphTDB ds, 
-                                                      QueryIterator input, 
-                                                      Node gn, BasicPattern bgp,
-                                                      ExprList exprs, ExecutionContext execCxt)
-    {
-        if ( ! input.hasNext() )
-            return input ;
-
-        // ---- Graph names with special meaning. 
-
-        gn = decideGraphNode(gn, execCxt) ;
-        if ( gn == null )
-            return optimizeExecuteTriples(ds.getDefaultGraphTDB(), input, bgp, exprs, execCxt) ;
-        
-        // ---- Execute quads+filters
-        if ( bgp.size() >= 2 )
-        {
-            ReorderTransformation transform = ds.getReorderTransform() ;
-    
-            if ( transform != null )
-            {
-                QueryIterPeek peek = QueryIterPeek.create(input, execCxt) ;
-                input = peek ; // Original input now invalid.
-                bgp = reorder(bgp, peek, transform) ;
-            }
-        }
-        // -- Filter placement
-        Op op = null ;
-        if ( exprs != null )
-            op = TransformFilterPlacement.transform(exprs, gn, bgp) ;
-        else
-            op = new OpQuadPattern(gn, bgp) ;
-
-        return plainExecute(op, input, execCxt) ;
-    }
-
-    /** Execute without modification of the op - does <b>not</b> apply special graph name translations */ 
-    private static QueryIterator plainExecute(Op op, QueryIterator input, ExecutionContext execCxt)
-    {
-        // -- Execute
-        // Switch to a non-reordering executor
-        // The Op may be a sequence due to TransformFilterPlacement
-        // so we need to do a full execution step, not go straight to the SolverLib.
-        
-        ExecutionContext ec2 = new ExecutionContext(execCxt) ;
-        ec2.setExecutor(plainFactory) ;
-
-        // Solve without going through this executor again.
-        // There would be issues of nested patterns but this is only a
-        // (filter (bgp...)) or (filter (quadpattern ...)) or sequences of these.
-        // so there are no nested patterns to reorder.
-        return QC.execute(op, input, ec2) ;
-    }
-
-    private static BasicPattern reorder(BasicPattern pattern, QueryIterPeek peek, ReorderTransformation transform)
-    {
-        if ( transform != null )
-        {
-            // This works by getting one result from the peek iterator,
-            // and creating the more gounded BGP. The tranform is used to
-            // determine the best order and the transformation is returned. This
-            // transform is applied to the unsubstituted pattern (which will be
-            // substituted as part of evaluation.
-            
-            if ( ! peek.hasNext() )
-                throw new ARQInternalErrorException("Peek iterator is already empty") ;
- 
-            BasicPattern pattern2 = Substitute.substitute(pattern, peek.peek() ) ;
-            // Calculate the reordering based on the substituted pattern.
-            ReorderProc proc = transform.reorderIndexes(pattern2) ;
-            // Then reorder original patten
-            pattern = proc.reorder(pattern) ;
-        }
-        return pattern ;
-    }
-    
-    /** Handle special graph node names.  
-     * Returns null for default graph in storage (use the triple table).
-     * Returns Node.ANY for the union graph
-     */
-    public static Node decideGraphNode(Node gn, ExecutionContext execCxt)
-    {
-     // ---- Graph names with special meaning. 
-    
-        // Graph names with special meaning:
-        //   Quad.defaultGraphIRI -- the IRI used in GRAPH <> to mean the default graph.
-        //   Quad.defaultGraphNodeGenerated -- the internal marker node used for the quad form of queries.
-        //   Quad.unionGraph -- the IRI used in GRAPH <> to mean the union of named graphs
-    
-        if ( isDefaultGraphStorage(gn) ) 
-        {
-            // Storage concrete, default graph. 
-            // Either outside GRAPH (no implicit union)
-            // or using the "name" of the default graph
-            return null ;
-        }
-
-        // Not default storage graph.
-        // ---- Union (RDF Merge) of named graphs
-
-        if ( Quad.isUnionGraph(gn) ) 
-            return Node.ANY ;
-        boolean doingUnion = false ;
-        
-        return gn ;
-    }
-
-    // Is this a query against the real default graph in the storage (in a 3-tuple table). 
-    private static boolean isDefaultGraphStorage(Node gn)
-    {
-        if ( gn == null )
-            return true ;
-        
-        // Is it the implicit name for default graph.
-        if ( Quad.isDefaultGraph(gn) )
-            // Not accessing the union of named graphs as the default graph
-            // and pattern is directed to the default graph.
-            return true ;
-    
-        return false ;
-    }
-    
-    @Override
-    protected QueryIterator execute(OpDatasetNames dsNames, QueryIterator input)
-    { 
-        DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
-        Predicate<Tuple<NodeId>> filter = QC2.getFilter(execCxt.getContext()) ;
-        Node gn = dsNames.getGraphNode() ;
-        if ( Var.isVar(gn) )
-            return SolverLib.graphNames(ds, dsNames.getGraphNode(), input, filter, execCxt) ;
-        else
-            return SolverLib.testForGraphName(ds, dsNames.getGraphNode(), input, filter, execCxt) ;
-    }
-
-    // ---- OpExecute factories and plain executor.
-    
-    private static OpExecutorFactory plainFactory = new OpExecutorPlainFactoryTDB() ;
-    private static class OpExecutorPlainFactoryTDB implements OpExecutorFactory
-    {
-        @Override
-        public OpExecutor create(ExecutionContext execCxt)
-        {
-            return new OpExecutorPlainTDB(execCxt) ;
-        }
-    }
-
-    /** An op executor that simply executes a BGP or QuadPattern without any reordering */ 
-    private static class OpExecutorPlainTDB extends OpExecutor
-    {
-        Predicate<Tuple<NodeId>> filter = null ;
-        
-        public OpExecutorPlainTDB(ExecutionContext execCxt)
-        {
-            super(execCxt) ;
-            filter = QC2.getFilter(execCxt.getContext()) ;
-        }
-        
-        @Override
-        public QueryIterator execute(OpBGP opBGP, QueryIterator input)
-        {
-            Graph g = execCxt.getActiveGraph() ;
-            
-            if ( g instanceof GraphTDB )
-            {
-                BasicPattern bgp = opBGP.getPattern() ;
-                Explain.explain("Execute", bgp, execCxt.getContext()) ;
-                // Triple-backed (but may be named as explicit default graph).
-                //return SolverLib.execute((GraphTDB)g, bgp, input, filter, execCxt) ;
-                GraphTDB gtdb = (GraphTDB)g ;
-                Node gn = decideGraphNode(gtdb.getGraphName(), execCxt) ;
-                return SolverLib.execute(gtdb.getDSG(), gn, bgp, input, filter, execCxt) ;
-            }
-            Log.warn(this, "Non-GraphTDB passed to OpExecutorPlainTDB") ;
-            return super.execute(opBGP, input) ;
-        }
-        
-        @Override
-        public QueryIterator execute(OpQuadPattern opQuadPattern, QueryIterator input)
-        {
-            Node gn = opQuadPattern.getGraphNode() ;
-            gn = decideGraphNode(gn, execCxt) ;
-            
-            if ( execCxt.getDataset() instanceof DatasetGraphTDB )
-            {
-                DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
-                Explain.explain("Execute", opQuadPattern.getPattern(), execCxt.getContext()) ;
-                BasicPattern bgp = opQuadPattern.getBasicPattern() ;
-                return SolverLib.execute(ds, gn, bgp, input, filter, execCxt) ;
-            }
-            // Maybe a TDB named graph inside a non-TDB dataset.
-            Graph g = execCxt.getActiveGraph() ;
-            if ( g instanceof GraphTDB )
-            {
-                // Triples graph from TDB (which is the default graph of the dataset),
-                // used a named graph in a composite dataset.
-                BasicPattern bgp = opQuadPattern.getBasicPattern() ;
-                Explain.explain("Execute", bgp, execCxt.getContext()) ;
-                // Don't pass in G -- gn may be different.
-                return SolverLib.execute(((GraphTDB)g).getDSG(), gn, bgp, input, filter, execCxt) ;
-            }
-            Log.warn(this, "Non-DatasetGraphTDB passed to OpExecutorPlainTDB") ;
-            return super.execute(opQuadPattern, input) ;
-        }
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB2.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB2.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB2.java
new file mode 100644
index 0000000..aa0f5df
--- /dev/null
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/OpExecutorTDB2.java
@@ -0,0 +1,428 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.tdb2.solver;
+
+import java.util.function.Predicate;
+
+import org.apache.jena.atlas.lib.tuple.Tuple ;
+import org.apache.jena.atlas.logging.Log ;
+import org.apache.jena.graph.Graph ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.sparql.ARQInternalErrorException ;
+import org.apache.jena.sparql.algebra.Op ;
+import org.apache.jena.sparql.algebra.op.* ;
+import org.apache.jena.sparql.algebra.optimize.TransformFilterPlacement ;
+import org.apache.jena.sparql.core.BasicPattern ;
+import org.apache.jena.sparql.core.Quad ;
+import org.apache.jena.sparql.core.Substitute ;
+import org.apache.jena.sparql.core.Var ;
+import org.apache.jena.sparql.engine.ExecutionContext ;
+import org.apache.jena.sparql.engine.QueryIterator ;
+import org.apache.jena.sparql.engine.iterator.QueryIterPeek ;
+import org.apache.jena.sparql.engine.main.OpExecutor ;
+import org.apache.jena.sparql.engine.main.OpExecutorFactory ;
+import org.apache.jena.sparql.engine.main.QC ;
+import org.apache.jena.sparql.engine.main.iterator.QueryIterGraph ;
+import org.apache.jena.sparql.engine.optimizer.reorder.ReorderProc ;
+import org.apache.jena.sparql.engine.optimizer.reorder.ReorderTransformation ;
+import org.apache.jena.sparql.expr.ExprList ;
+import org.apache.jena.sparql.mgt.Explain ;
+import org.apache.jena.tdb2.store.DatasetGraphTDB;
+import org.apache.jena.tdb2.store.GraphTDB;
+import org.apache.jena.tdb2.store.NodeId;
+import org.slf4j.Logger ;
+import org.slf4j.LoggerFactory ;
+
+/** TDB executor for algebra expressions.  It is the standard ARQ executor
+ *  except for basic graph patterns and filtered basic graph patterns (currently).  
+ * 
+ * See also: StageGeneratorDirectTDB, a non-reordering 
+ */
+public class OpExecutorTDB2 extends OpExecutor
+{
+    private static final Logger log = LoggerFactory.getLogger(OpExecutorTDB2.class) ;
+    
+    public final static OpExecutorFactory OpExecFactoryTDB = new OpExecutorFactory()
+    {
+        @Override
+        public OpExecutor create(ExecutionContext execCxt)
+        { return new OpExecutorTDB2(execCxt) ; }
+    } ;
+    
+    private final boolean isForTDB ;
+    
+    // A new compile object is created for each op compilation.
+    // So the execCxt is changing as we go through the query-compile-execute process  
+    public OpExecutorTDB2(ExecutionContext execCxt)
+    {
+        super(execCxt) ;
+        // NB. The dataset may be a TDB one, or a general one.
+        // Any merged union graph magic (for a TDB dataset was handled
+        // in QueryEngineTDB).
+        
+        isForTDB = (execCxt.getActiveGraph() instanceof GraphTDB) ;
+    }
+
+    @Override
+    protected QueryIterator exec(Op op, QueryIterator input) {
+        if ( level < 0 )
+            // Print only at top level (and we're called before level++) 
+            Explain.explain("TDB", op, super.execCxt.getContext()) ;
+        return super.exec(op, input) ;
+    } 
+    
+    // Retrieving nodes isn't so bad because they will be needed anyway.
+    // And if their duplicates, likely to be cached.
+    // Need to work with SolverLib which wraps the NodeId bindgins with a converter. 
+    
+    @Override
+    protected QueryIterator execute(OpDistinct opDistinct, QueryIterator input)
+    {
+        return super.execute(opDistinct, input) ;
+    }
+    
+    @Override
+    protected QueryIterator execute(OpReduced opReduced, QueryIterator input)
+    {
+        return super.execute(opReduced, input) ;
+    }
+    
+    @Override
+    protected QueryIterator execute(OpFilter opFilter, QueryIterator input)
+    {
+        if ( ! isForTDB )
+            return super.execute(opFilter, input) ;
+        
+        // If the filter does not apply to the input??
+        // Where does ARQ catch this?
+        
+        // (filter (bgp ...))
+        if ( OpBGP.isBGP(opFilter.getSubOp()) )
+        {
+            // Still may be a TDB graph in a non-TDB dataset (e.g. a named model)
+            GraphTDB graph = (GraphTDB)execCxt.getActiveGraph() ;
+            OpBGP opBGP = (OpBGP)opFilter.getSubOp() ;
+            return executeBGP(graph, opBGP, input, opFilter.getExprs(), execCxt) ;
+        }
+        
+        // (filter (quadpattern ...))
+        if ( opFilter.getSubOp() instanceof OpQuadPattern )
+        {
+            OpQuadPattern quadPattern = (OpQuadPattern)opFilter.getSubOp() ;
+            DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
+            return optimizeExecuteQuads(ds, input,
+                                        quadPattern.getGraphNode(), quadPattern.getBasicPattern(),
+                                        opFilter.getExprs(), execCxt) ;
+        }
+    
+        // (filter (anything else))
+        return super.execute(opFilter, input) ;
+        }
+
+    // ---- Triple patterns
+    
+    @Override
+    protected QueryIterator execute(OpBGP opBGP, QueryIterator input)
+    {
+        if ( ! isForTDB )
+            return super.execute(opBGP, input) ;
+        
+        GraphTDB graph = (GraphTDB)execCxt.getActiveGraph() ;
+        return executeBGP(graph, opBGP, input, null, execCxt) ;
+       
+    }
+
+    @Override
+    protected QueryIterator execute(OpQuadPattern quadPattern, QueryIterator input)
+    {
+        if ( ! isForTDB )
+            return super.execute(quadPattern, input) ;
+            
+    //        DatasetGraph dg = execCxt.getDataset() ;
+    //        if ( ! ( dg instanceof DatasetGraphTDB ) )
+    //            throw new InternalErrorException("Not a TDB backed dataset in quad pattern execution") ;
+        
+        DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
+        BasicPattern bgp = quadPattern.getBasicPattern() ;
+        Node gn = quadPattern.getGraphNode() ;
+        return optimizeExecuteQuads(ds, input, gn, bgp, null, execCxt) ;
+    }
+
+    @Override
+    protected QueryIterator execute(OpGraph opGraph, QueryIterator input)
+    {
+        // Path evaluation or dataset sets which do not go straight to the DatasetGraphTDB  
+        return new QueryIterGraph(input, opGraph, execCxt) ;
+    }
+
+    /** Execute a BGP (and filters) on a TDB graph, which may be in default storage or it may be a named graph */ 
+    private static QueryIterator executeBGP(GraphTDB graph, OpBGP opBGP, QueryIterator input, ExprList exprs, 
+                                            ExecutionContext execCxt)
+    {
+        // Is it the real default graph (normal route or explicitly named)?
+        if ( ! isDefaultGraphStorage(graph.getGraphName()))
+        {
+            // Not default storage - it's a named graph in storage. 
+            DatasetGraphTDB ds = graph.getDSG() ;
+            return optimizeExecuteQuads(ds, input, graph.getGraphName(), opBGP.getPattern(), exprs, execCxt) ;
+        }
+        
+        // Execute a BGP on the real default graph
+        return optimizeExecuteTriples(graph, input, opBGP.getPattern(), exprs, execCxt) ;
+    }
+
+    /** Execute, with optimization, a basic graph pattern on the default graph storage */
+    private static QueryIterator optimizeExecuteTriples(GraphTDB graph, QueryIterator input,
+                                                        BasicPattern pattern, ExprList exprs,
+                                                        ExecutionContext execCxt)
+    {
+        if ( ! input.hasNext() )
+            return input ;
+    
+        // -- Input
+        // Must pass this iterator into the next stage.
+        if ( pattern.size() >= 2 )
+        {
+            // Must be 2 or triples to reorder. 
+            ReorderTransformation transform = graph.getDSG().getReorderTransform() ;
+            if ( transform != null )
+            {
+                QueryIterPeek peek = QueryIterPeek.create(input, execCxt) ;
+                input = peek ; // Must pass on
+                pattern = reorder(pattern, peek, transform) ;
+            }
+        }
+        // -- Filter placement
+            
+        Op op = null ;
+        if ( exprs != null )
+            op = TransformFilterPlacement.transform(exprs, pattern) ;
+        else
+            op = new OpBGP(pattern) ;
+        
+        return plainExecute(op, input, execCxt) ;
+    }
+
+    /** Execute, with optimization, a quad pattern */
+    private static QueryIterator optimizeExecuteQuads(DatasetGraphTDB ds, 
+                                                      QueryIterator input, 
+                                                      Node gn, BasicPattern bgp,
+                                                      ExprList exprs, ExecutionContext execCxt)
+    {
+        if ( ! input.hasNext() )
+            return input ;
+
+        // ---- Graph names with special meaning. 
+
+        gn = decideGraphNode(gn, execCxt) ;
+        if ( gn == null )
+            return optimizeExecuteTriples(ds.getDefaultGraphTDB(), input, bgp, exprs, execCxt) ;
+        
+        // ---- Execute quads+filters
+        if ( bgp.size() >= 2 )
+        {
+            ReorderTransformation transform = ds.getReorderTransform() ;
+    
+            if ( transform != null )
+            {
+                QueryIterPeek peek = QueryIterPeek.create(input, execCxt) ;
+                input = peek ; // Original input now invalid.
+                bgp = reorder(bgp, peek, transform) ;
+            }
+        }
+        // -- Filter placement
+        Op op = null ;
+        if ( exprs != null )
+            op = TransformFilterPlacement.transform(exprs, gn, bgp) ;
+        else
+            op = new OpQuadPattern(gn, bgp) ;
+
+        return plainExecute(op, input, execCxt) ;
+    }
+
+    /** Execute without modification of the op - does <b>not</b> apply special graph name translations */ 
+    private static QueryIterator plainExecute(Op op, QueryIterator input, ExecutionContext execCxt)
+    {
+        // -- Execute
+        // Switch to a non-reordering executor
+        // The Op may be a sequence due to TransformFilterPlacement
+        // so we need to do a full execution step, not go straight to the SolverLib.
+        
+        ExecutionContext ec2 = new ExecutionContext(execCxt) ;
+        ec2.setExecutor(plainFactory) ;
+
+        // Solve without going through this executor again.
+        // There would be issues of nested patterns but this is only a
+        // (filter (bgp...)) or (filter (quadpattern ...)) or sequences of these.
+        // so there are no nested patterns to reorder.
+        return QC.execute(op, input, ec2) ;
+    }
+
+    private static BasicPattern reorder(BasicPattern pattern, QueryIterPeek peek, ReorderTransformation transform)
+    {
+        if ( transform != null )
+        {
+            // This works by getting one result from the peek iterator,
+            // and creating the more gounded BGP. The tranform is used to
+            // determine the best order and the transformation is returned. This
+            // transform is applied to the unsubstituted pattern (which will be
+            // substituted as part of evaluation.
+            
+            if ( ! peek.hasNext() )
+                throw new ARQInternalErrorException("Peek iterator is already empty") ;
+ 
+            BasicPattern pattern2 = Substitute.substitute(pattern, peek.peek() ) ;
+            // Calculate the reordering based on the substituted pattern.
+            ReorderProc proc = transform.reorderIndexes(pattern2) ;
+            // Then reorder original patten
+            pattern = proc.reorder(pattern) ;
+        }
+        return pattern ;
+    }
+    
+    /** Handle special graph node names.  
+     * Returns null for default graph in storage (use the triple table).
+     * Returns Node.ANY for the union graph
+     */
+    public static Node decideGraphNode(Node gn, ExecutionContext execCxt)
+    {
+     // ---- Graph names with special meaning. 
+    
+        // Graph names with special meaning:
+        //   Quad.defaultGraphIRI -- the IRI used in GRAPH <> to mean the default graph.
+        //   Quad.defaultGraphNodeGenerated -- the internal marker node used for the quad form of queries.
+        //   Quad.unionGraph -- the IRI used in GRAPH <> to mean the union of named graphs
+    
+        if ( isDefaultGraphStorage(gn) ) 
+        {
+            // Storage concrete, default graph. 
+            // Either outside GRAPH (no implicit union)
+            // or using the "name" of the default graph
+            return null ;
+        }
+
+        // Not default storage graph.
+        // ---- Union (RDF Merge) of named graphs
+
+        if ( Quad.isUnionGraph(gn) ) 
+            return Node.ANY ;
+        boolean doingUnion = false ;
+        
+        return gn ;
+    }
+
+    // Is this a query against the real default graph in the storage (in a 3-tuple table). 
+    private static boolean isDefaultGraphStorage(Node gn)
+    {
+        if ( gn == null )
+            return true ;
+        
+        // Is it the implicit name for default graph.
+        if ( Quad.isDefaultGraph(gn) )
+            // Not accessing the union of named graphs as the default graph
+            // and pattern is directed to the default graph.
+            return true ;
+    
+        return false ;
+    }
+    
+    @Override
+    protected QueryIterator execute(OpDatasetNames dsNames, QueryIterator input)
+    { 
+        DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
+        Predicate<Tuple<NodeId>> filter = QC2.getFilter(execCxt.getContext()) ;
+        Node gn = dsNames.getGraphNode() ;
+        if ( Var.isVar(gn) )
+            return SolverLib.graphNames(ds, dsNames.getGraphNode(), input, filter, execCxt) ;
+        else
+            return SolverLib.testForGraphName(ds, dsNames.getGraphNode(), input, filter, execCxt) ;
+    }
+
+    // ---- OpExecute factories and plain executor.
+    
+    private static OpExecutorFactory plainFactory = new OpExecutorPlainFactoryTDB() ;
+    private static class OpExecutorPlainFactoryTDB implements OpExecutorFactory
+    {
+        @Override
+        public OpExecutor create(ExecutionContext execCxt)
+        {
+            return new OpExecutorPlainTDB(execCxt) ;
+        }
+    }
+
+    /** An op executor that simply executes a BGP or QuadPattern without any reordering */ 
+    private static class OpExecutorPlainTDB extends OpExecutor
+    {
+        Predicate<Tuple<NodeId>> filter = null ;
+        
+        public OpExecutorPlainTDB(ExecutionContext execCxt)
+        {
+            super(execCxt) ;
+            filter = QC2.getFilter(execCxt.getContext()) ;
+        }
+        
+        @Override
+        public QueryIterator execute(OpBGP opBGP, QueryIterator input)
+        {
+            Graph g = execCxt.getActiveGraph() ;
+            
+            if ( g instanceof GraphTDB )
+            {
+                BasicPattern bgp = opBGP.getPattern() ;
+                Explain.explain("Execute", bgp, execCxt.getContext()) ;
+                // Triple-backed (but may be named as explicit default graph).
+                //return SolverLib.execute((GraphTDB)g, bgp, input, filter, execCxt) ;
+                GraphTDB gtdb = (GraphTDB)g ;
+                Node gn = decideGraphNode(gtdb.getGraphName(), execCxt) ;
+                return SolverLib.execute(gtdb.getDSG(), gn, bgp, input, filter, execCxt) ;
+            }
+            Log.warn(this, "Non-GraphTDB passed to OpExecutorPlainTDB") ;
+            return super.execute(opBGP, input) ;
+        }
+        
+        @Override
+        public QueryIterator execute(OpQuadPattern opQuadPattern, QueryIterator input)
+        {
+            Node gn = opQuadPattern.getGraphNode() ;
+            gn = decideGraphNode(gn, execCxt) ;
+            
+            if ( execCxt.getDataset() instanceof DatasetGraphTDB )
+            {
+                DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
+                Explain.explain("Execute", opQuadPattern.getPattern(), execCxt.getContext()) ;
+                BasicPattern bgp = opQuadPattern.getBasicPattern() ;
+                return SolverLib.execute(ds, gn, bgp, input, filter, execCxt) ;
+            }
+            // Maybe a TDB named graph inside a non-TDB dataset.
+            Graph g = execCxt.getActiveGraph() ;
+            if ( g instanceof GraphTDB )
+            {
+                // Triples graph from TDB (which is the default graph of the dataset),
+                // used a named graph in a composite dataset.
+                BasicPattern bgp = opQuadPattern.getBasicPattern() ;
+                Explain.explain("Execute", bgp, execCxt.getContext()) ;
+                // Don't pass in G -- gn may be different.
+                return SolverLib.execute(((GraphTDB)g).getDSG(), gn, bgp, input, filter, execCxt) ;
+            }
+            Log.warn(this, "Non-DatasetGraphTDB passed to OpExecutorPlainTDB") ;
+            return super.execute(opQuadPattern, input) ;
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
index a9a2fc0..60b654a 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
@@ -30,10 +30,11 @@ import org.apache.jena.graph.Node;
 import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.shared.impl.PrefixMappingImpl;
 import org.apache.jena.sparql.core.DatasetGraph ;
+import org.apache.jena.sparql.core.DatasetGraphWrapper;
 import org.apache.jena.sparql.core.DatasetPrefixStorage ;
 
 final
-public class DatasetGraphSwitchable extends DatasetGraphWrapperTxn /* Until ARQ catches up with promote */ 
+public class DatasetGraphSwitchable extends DatasetGraphWrapper 
 {
     // QueryEngineFactoryWrapper has a QueryEngineFactory that is always loaded that
     // executes on the unwrapped DSG (recursively). Unwrapping is via getBase, calling

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
index 5acec81..42690b2 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
@@ -174,10 +174,9 @@ public class DatasetGraphTDB extends DatasetGraphTriplesQuads
         Transaction txn = txnSystem.getThreadTransaction() ;
         if ( txn == null )
             throw new TransactionException("Not in a transaction") ;
-            
         if ( txn.isWriteTxn() )
             return ;
-        boolean b = txn.promote() ;
+        boolean b = promote() ;
         if ( !b )
             throw new TransactionException("Can't write") ;
     }
@@ -445,7 +444,7 @@ public class DatasetGraphTDB extends DatasetGraphTriplesQuads
     }
 
     @Override
-    public boolean promote(TxnType txnType) {
+    public boolean promote(Promote txnType) {
         if ( txnMonitor != null ) txnMonitor.startPromote();
         try { 
             return txnSystem.promote(txnType) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphWrapperTxn.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphWrapperTxn.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphWrapperTxn.java
deleted file mode 100644
index 8022165..0000000
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphWrapperTxn.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.tdb2.store;
-
-import org.apache.jena.sparql.core.DatasetGraphWrapper ;
-
-public class DatasetGraphWrapperTxn extends DatasetGraphWrapper implements DatasetGraphTxn {
-
-    public DatasetGraphWrapperTxn(DatasetGraphTxn dsg) {
-        super(dsg) ;
-    }
-
-    @Override
-    public boolean promote() {
-        return ((DatasetGraphTxn)get()).promote() ;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
index 16149df..2c2258f 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
@@ -28,6 +28,7 @@ import org.apache.jena.riot.Lang ;
 import org.apache.jena.riot.RDFDataMgr ;
 import org.apache.jena.sparql.core.Quad ;
 import org.apache.jena.sparql.sse.SSE ;
+import org.apache.jena.system.JenaSystem;
 import org.apache.jena.tdb2.TDB2;
 import org.apache.jena.tdb2.junit.TL;
 import org.junit.After ;
@@ -37,6 +38,11 @@ import org.junit.Test ;
 /** Tests of datasets, prefixes, special URIs etc (see also {@link org.apache.jena.sparql.graph.GraphsTests} */
 public class TestDatasetTDB
 {
+    static {
+        JenaSystem.DEBUG_INIT = true ; 
+        JenaSystem.init();
+    }
+    
     private Dataset dataset ;
     
     @Before public void before() {
@@ -170,6 +176,7 @@ public class TestDatasetTDB
     
     @Test public void special3()
     {
+        JenaSystem.init();
         Dataset ds = dataset() ;
 
         load1(ds.getDefaultModel()) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
----------------------------------------------------------------------
diff --git a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
index 5c6e42f..362a4be 100644
--- a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
+++ b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionLocal.java
@@ -295,8 +295,7 @@ public class RDFConnectionLocal implements RDFConnection {
     @Override public void begin()                       { dataset.begin(); }
     @Override public void begin(TxnType txnType)        { dataset.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { dataset.begin(mode); }
-    @Override public boolean promote()                  { return dataset.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return dataset.promote(txnType); }
+    @Override public boolean promote(Promote promote)   { return dataset.promote(promote); }
     @Override public void commit()                      { dataset.commit(); }
     @Override public void abort()                       { dataset.abort(); }
     @Override public boolean isInTransaction()          { return dataset.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
----------------------------------------------------------------------
diff --git a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
index b6f215e..0cd85cc 100644
--- a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
+++ b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionModular.java
@@ -37,8 +37,7 @@ public class RDFConnectionModular implements RDFConnection {
     @Override public void begin()                       { transactional.begin(); }
     @Override public void begin(TxnType txnType)        { transactional.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { transactional.begin(mode); }
-    @Override public boolean promote()                  { return transactional.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return transactional.promote(txnType); }
+    @Override public boolean promote(Promote promote)   { return transactional.promote(promote); }
     @Override public void commit()                      { transactional.commit(); }
     @Override public void abort()                       { transactional.abort(); }
     @Override public boolean isInTransaction()          { return transactional.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
----------------------------------------------------------------------
diff --git a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
index 4960484..371945e 100644
--- a/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
+++ b/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java
@@ -421,8 +421,7 @@ public class RDFConnectionRemote implements RDFConnection {
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote promote)   { return txn.promote(promote); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
----------------------------------------------------------------------
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
index dda35e9..f85a159 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
@@ -117,8 +117,7 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java b/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
index 13f8c18..f960e99 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/store/DatasetGraphTDB.java
@@ -260,8 +260,7 @@ public class DatasetGraphTDB extends DatasetGraphTriplesQuads
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/DatasetGraphTransaction.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/DatasetGraphTransaction.java b/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/DatasetGraphTransaction.java
index 5b77607..7eedb4e 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/DatasetGraphTransaction.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/DatasetGraphTransaction.java
@@ -93,19 +93,28 @@ import org.apache.jena.tdb.store.GraphTxnTDB ;
             DatasetGraphTxn dsgTxn = dsgtxn.get() ;
             if ( dsgTxn.getTransaction().isRead() ) {
                 TxnType txnType = dsgTxn.getTransaction().getTxnType();
+                Promote mode;
                 switch(txnType) {
                     case READ : 
                         throw new JenaTransactionException("Attempt to update in a read transaction"); 
                     case WRITE :
                         // Impossible. We're in read-mode.
                         throw new TDBException("Internal inconsistency: read-mode write transaction");
-                    case READ_COMMITTED_PROMOTE :
                     case READ_PROMOTE : 
+                        mode = Promote.ISOLATED;
+                        break;
+                    case READ_COMMITTED_PROMOTE :
+                        mode = Promote.READ_COMMITTED;
+                        break;
+                    default:
+                        throw new TDBException("Internal inconsistency: null transaction type");
                 }
                 // Promotion.
                 TransactionManager txnMgr = dsgTxn.getTransaction().getTxnMgr() ;
-                DatasetGraphTxn dsgTxn2 = txnMgr.promote(dsgTxn, txnType) ;
+                DatasetGraphTxn dsgTxn2 = txnMgr.promote(dsgTxn, txnType, mode) ;
                 if ( dsgTxn2 == null )
+                    // We were asked for a write operation and can't promote.
+                    // Returning false makes no sense.
                     throw new JenaTransactionException("Can't promote "+txnType+"- dataset has been written to");
                 dsgtxn.set(dsgTxn2);
             }
@@ -206,12 +215,12 @@ import org.apache.jena.tdb.store.GraphTxnTDB ;
     }
 
     @Override
-    protected boolean _promote() {
+    protected boolean _promote(Promote promoteMode) {
         // Promotion (TDB1) is a reset of the DatasetGraphTxn.
         checkNotClosed() ;
         DatasetGraphTxn dsgTxn = dsgtxn.get();
         Transaction transaction = dsgTxn.getTransaction();
-        DatasetGraphTxn dsgTxn2 = transaction.getTxnMgr().promote(dsgTxn, transaction.getTxnType());
+        DatasetGraphTxn dsgTxn2 = transaction.getTxnMgr().promote(dsgTxn, transaction.getTxnType(), promoteMode);
         if ( dsgTxn2 == null )
             return false;
         dsgtxn.set(dsgTxn2) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java b/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
index e9c4797..448c99c 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
@@ -24,7 +24,10 @@ import static org.apache.jena.tdb.transaction.TransactionManager.TxnPoint.BEGIN
 import static org.apache.jena.tdb.transaction.TransactionManager.TxnPoint.CLOSE ;
 
 import java.io.File ;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.BlockingQueue ;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.LinkedBlockingDeque ;
@@ -39,6 +42,7 @@ import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.shared.Lock ;
+import org.apache.jena.sparql.core.Transactional.Promote;
 import org.apache.jena.tdb.store.DatasetGraphTDB ;
 import org.apache.jena.tdb.sys.SystemTDB ;
 import org.slf4j.Logger ;
@@ -375,24 +379,24 @@ public class TransactionManager
      * <p>
      * Return null for "no promote" due to intermediate commits.  
      */
-    /*package*/ DatasetGraphTxn promote(DatasetGraphTxn dsgtxn, TxnType txnType) throws TDBTransactionException {
+    /*package*/ DatasetGraphTxn promote(DatasetGraphTxn dsgtxn, TxnType originalTxnType, Promote promoteType) throws TDBTransactionException {
         Transaction txn = dsgtxn.getTransaction() ;
         if ( txn.getState() != TxnState.ACTIVE )
             throw new TDBTransactionException("promote: transaction is not active") ;
         if ( txn.getTxnMode() == ReadWrite.WRITE )
             return dsgtxn ;
-        if ( txn.getTxnType() == TxnType.READ ) {
-            txn.abort();
-            throw new TDBTransactionException("promote: transaction is a READ transaction") ;
-        }
+        if ( txn.getTxnType() == TxnType.READ )
+            return null;    // Did no promote.
+            //txn.abort();
+            //throw new TDBTransactionException("promote: transaction is a READ transaction") ;
         
         // Read commit - pick up whatever is current at the point setup.
         // Can also promote - may need to wait for active writers. 
         // Go through begin for the writers lock. 
-        if ( txnType == TxnType.READ_COMMITTED_PROMOTE ) {
+        if ( promoteType == Promote.READ_COMMITTED ) {
             acquireWriterLock(true);
             // No need to sync - we just queue as a writer.
-            return promoteExec$(dsgtxn, txnType);
+            return promoteExec$(dsgtxn, originalTxnType);
         }
         
         // First check, without the writer lock. Fast fail.
@@ -414,7 +418,7 @@ public class TransactionManager
         // can commit/abort.  Otherwise, we have deadlock.
         acquireWriterLock(true) ;
         // Do the synchronized stuff.
-        return promoteSync$(dsgtxn, txnType) ; 
+        return promoteSync$(dsgtxn, originalTxnType) ; 
     }
     
     synchronized

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 2ccd2f8..8b8df56 100644
--- a/pom.xml
+++ b/pom.xml
@@ -735,6 +735,7 @@
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.7.0</version>
           <configuration>
+            <showDeprecation>false</showDeprecation>
             <encoding>UTF-8</encoding>
             <debug>true</debug>
             <debuglevel>source,lines,vars</debuglevel>


[3/5] jena git commit: promote(Promote mode)

Posted by an...@apache.org.
promote(Promote mode)


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

Branch: refs/heads/master
Commit: 5f99f5f3bb1a0e34d71048d1cec97f6b81bdbb64
Parents: d8306ce
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Feb 6 12:36:52 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Feb 9 21:52:42 2018 +0000

----------------------------------------------------------------------
 .../java/org/apache/jena/query/TxnType.java     |   7 +
 .../jena/sparql/core/DatasetGraphMap.java       |   3 +-
 .../jena/sparql/core/DatasetGraphMapLink.java   |   3 +-
 .../jena/sparql/core/DatasetGraphOne.java       |   3 +-
 .../jena/sparql/core/DatasetGraphSink.java      |   3 +-
 .../sparql/core/DatasetGraphTrackActive.java    |   6 +-
 .../jena/sparql/core/DatasetGraphWithLock.java  |   2 +-
 .../jena/sparql/core/DatasetGraphWrapper.java   |   2 +-
 .../jena/sparql/core/DatasetGraphZero.java      |   3 +-
 .../apache/jena/sparql/core/DatasetImpl.java    |   7 +-
 .../apache/jena/sparql/core/Transactional.java  |  41 +-
 .../jena/sparql/core/TransactionalLock.java     |   8 +-
 .../sparql/core/TransactionalNotSupported.java  |   6 +-
 .../core/TransactionalNotSupportedMixin.java    |   7 +-
 .../jena/sparql/core/TransactionalNull.java     |   8 +-
 .../sparql/core/mem/DatasetGraphInMemory.java   |  27 +-
 .../engine/QueryEngineFactoryWrapper.java       |   8 +-
 .../jena/sparql/util/DyadicDatasetGraph.java    |  35 +-
 .../java/org/apache/jena/system/TxnCounter.java |  11 +-
 .../org/apache/jena/sparql/ARQTestSuite.java    |   5 +-
 .../jena/sparql/graph/TestGraphUnionRead.java   | 149 +++---
 .../AbstractTestTransactionLifecycle.java       | 523 +++++++++++--------
 .../sparql/util/TestDyadicDatasetGraph.java     |  66 ++-
 .../java/org/apache/jena/system/JenaSystem.java |   2 +-
 .../jena/dboe/transaction/txn/Transaction.java  |  18 +-
 .../transaction/txn/TransactionCoordinator.java |  50 +-
 .../dboe/transaction/txn/TransactionalBase.java |  28 +-
 .../transaction/TestTransactionLifecycle.java   |   5 +-
 .../transaction/TestTransactionLifecycle2.java  |  15 +-
 .../jena/tdb2/setup/AbstractTDBBuilder.java     |   4 +-
 .../apache/jena/tdb2/solver/OpExecutorTDB1.java | 428 ---------------
 .../apache/jena/tdb2/solver/OpExecutorTDB2.java | 428 +++++++++++++++
 .../jena/tdb2/store/DatasetGraphSwitchable.java |   3 +-
 .../apache/jena/tdb2/store/DatasetGraphTDB.java |   5 +-
 .../jena/tdb2/store/DatasetGraphWrapperTxn.java |  34 --
 .../apache/jena/tdb2/store/TestDatasetTDB.java  |   7 +
 .../jena/rdfconnection/RDFConnectionLocal.java  |   3 +-
 .../rdfconnection/RDFConnectionModular.java     |   3 +-
 .../jena/rdfconnection/RDFConnectionRemote.java |   3 +-
 .../apache/jena/sdb/store/DatasetGraphSDB.java  |   3 +-
 .../apache/jena/tdb/store/DatasetGraphTDB.java  |   3 +-
 .../transaction/DatasetGraphTransaction.java    |  17 +-
 .../tdb/transaction/TransactionManager.java     |  22 +-
 pom.xml                                         |   1 +
 44 files changed, 1029 insertions(+), 986 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/query/TxnType.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/TxnType.java b/jena-arq/src/main/java/org/apache/jena/query/TxnType.java
index 56c841a..5367a74 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/TxnType.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/TxnType.java
@@ -21,6 +21,7 @@ package org.apache.jena.query;
 import java.util.Objects;
 
 import org.apache.jena.sparql.JenaTransactionException;
+import org.apache.jena.sparql.core.Transactional;
 
 public enum TxnType {
     /** Transaction mode:
@@ -74,4 +75,10 @@ public enum TxnType {
         return (txnType == TxnType.WRITE) ? ReadWrite.WRITE : ReadWrite.READ;
     }
 
+    /** Convert a {@code TxnType} mode to {@link ReadWrite} : "promote" not supported.  */
+    public static TxnType promote(Transactional.Promote promoteMode) {
+        Objects.requireNonNull(promoteMode);
+        return (promoteMode == Transactional.Promote.ISOLATED) ? READ_PROMOTE : READ_COMMITTED_PROMOTE;
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
index df6762c..c01f250 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
@@ -73,8 +73,7 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
index b3f1880..90efd0e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
@@ -130,8 +130,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote txnType)   { return txn.promote(txnType); }
     //@Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
index 7c302c2..89d76cb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
@@ -76,8 +76,7 @@ public class DatasetGraphOne extends DatasetGraphBaseFind {
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
     @Override public void commit()                      { txn.commit(); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote txnType)   { return txn.promote(txnType); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }
     @Override public void end()                         { txn.end(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
index 2799aff..90cda52 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
@@ -44,8 +44,7 @@ public class DatasetGraphSink extends DatasetGraphBaseFind {
     private TransactionalNull txn                       = TransactionalNull.create();
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
index ef15ea1..ec323d4 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphTrackActive.java
@@ -48,9 +48,9 @@ public abstract class DatasetGraphTrackActive extends DatasetGraphWrapper
     }
 
     @Override
-    public final boolean promote() {
+    public final boolean promote(Promote promoteMode) {
         checkActive();
-        return _promote();
+        return _promote(promoteMode);
     }
 
     @Override
@@ -74,7 +74,7 @@ public abstract class DatasetGraphTrackActive extends DatasetGraphWrapper
     @Override
     public abstract boolean isInTransaction() ;
     protected abstract void _begin(TxnType txnType);
-    protected abstract boolean _promote() ;
+    protected abstract boolean _promote(Promote promoteMode) ;
     protected abstract void _commit() ;
     protected abstract void _abort() ;
     protected abstract void _end() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
index 815414e..ff79e97 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
@@ -106,7 +106,7 @@ public class DatasetGraphWithLock extends DatasetGraphTrackActive implements Syn
     }
 
     @Override
-    protected boolean _promote() {
+    protected boolean _promote(Promote promoteMode) {
         throw new JenaTransactionException("promote not supported");
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
index e9dfd6e..426faef 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
@@ -211,7 +211,7 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
     { return getT().promote(); }
     
     @Override
-    public boolean promote(TxnType type)
+    public boolean promote(Promote type)
     { return getT().promote(type); }
     
     @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
index 376721e..388d850 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
@@ -44,8 +44,7 @@ public class DatasetGraphZero extends DatasetGraphBaseFind {
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
-    @Override public boolean promote(TxnType txnType)   { return txn.promote(txnType); }
+    @Override public boolean promote(Promote txnType)   { return txn.promote(txnType); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
index 85bf584..dc6a7f2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
@@ -115,12 +115,7 @@ public class DatasetImpl implements Dataset
     }
 
     @Override
-    public boolean promote() {
-        return transactional.promote();
-    }
-
-    @Override
-    public boolean promote(TxnType txnType) {
+    public boolean promote(Promote txnType) {
         return transactional.promote(txnType);
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
index ce36188..899f503 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/Transactional.java
@@ -117,8 +117,10 @@ public interface Transactional
      * Returns "true" if the transaction is in write mode after the call. The method
      * always succeeds of the transaction is already "write".
      * <p>
-     * A {@code READ_COMMITTED_PROMOTE} can always be promoted, but the call can need to
-     * wait. This method returns true if a {@code READ_PROMOTE} or
+     * A {@code READ_COMMITTED_PROMOTE} can always be promoted, but the call may need to
+     * wait.
+     * <p>
+     * This method returns true if a {@code READ_PROMOTE} or
      * {@code READ_COMMITTED_PROMOTE} is promoted.
      * <p>
      * This method returns false if a {@code READ_PROMOTE} can't be promoted - the
@@ -129,16 +131,28 @@ public interface Transactional
      * transaction.
      */
     public default boolean promote() {
-        return promote(transactionType());
+        if ( transactionMode() == ReadWrite.WRITE )
+            return true;
+        TxnType txnType = transactionType();
+        if ( txnType == null )
+            throw new JenaTransactionException("txnType");
+        switch(txnType) {
+            case WRITE :                  return true;
+            case READ :                   return false;
+            case READ_PROMOTE :           return promote(Promote.ISOLATED);
+            case READ_COMMITTED_PROMOTE : return promote(Promote.READ_COMMITTED);
+        }
+        throw new JenaTransactionException("Can't determine promote '"+txnType+"'transaction");
     }
 
-    public enum Promote { ISOLATED, @Deprecated SERIALIZED, READ_COMMITTED } ; 
+    public enum Promote { ISOLATED, READ_COMMITTED } ; 
     
     /**
-     * Attempt to promote a transaction from "read" to "write" and the transaction. This
-     * method allows the form of promotion to be specified.
+     * Attempt to promote a transaction from "read" mode to "write" and the transaction. This
+     * method allows the form of promotion to be specified. The transaction must not have been started
+     * with {@code READ}, which is read-only. 
      * <p>
-     * {@code READ_PROMOTE} treats the promotion as if the transaction was started
+     * An argument of {@code READ_PROMOTE} treats the promotion as if the transaction was started
      * with {@code READ_PROMOTE} (any other writer commiting since the transaction started
      * blocks promotion) and {@code READ_COMMITTED_PROMOTE} treats the promotion as if the transaction was started
      * with {@code READ_COMMITTED_PROMOTE} (intemediate writer commits become visible).
@@ -152,8 +166,10 @@ public interface Transactional
      * This method returns false if a {@code READ_PROMOTE} can't be promoted - the
      * transaction is still valid and in "read" mode.
      * <p>
+     * This method throws an exception if there is an attempt to promote a {@code READ}
+     * transaction.
      */
-    public boolean promote(TxnType mode);
+    public boolean promote(Promote mode);
 
     /** Commit a transaction - finish the transaction and make any changes permanent (if a "write" transaction) */  
     public void commit() ;
@@ -164,12 +180,15 @@ public interface Transactional
     /** Finish the transaction - if a write transaction and commit() has not been called, then abort */  
     public void end() ;
 
-    /** Return the current mode of the transaction - "read" or "write" */ 
+    /** Return the current mode of the transaction - "read" or "write".
+     * If the caller is not in a transaction, this method returns null. 
+     */ 
     public ReadWrite transactionMode();
 
-    /** Return the transaction type used in {@code begin(TxnType)}. */ 
+    /** Return the transaction type used in {@code begin(TxnType)}. 
+     * If the caller is not in a transaction, this method returns null. 
+     */ 
     public TxnType transactionType();
-    //public default TxnType transactionType() { throw new JenaTransactionException("Not implemented"); }
 
     /** Say whether inside a transaction. */ 
     public boolean isInTransaction() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
index c4414de..3db630e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
@@ -54,7 +54,6 @@ public class TransactionalLock implements Transactional {
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }
@@ -128,12 +127,7 @@ public class TransactionalLock implements Transactional {
     // Lock propmotion required (Ok for mutex) 
     
     @Override
-    public boolean promote() { 
-        return false;
-    }
-
-    @Override
-    public boolean promote(TxnType txnType) { 
+    public boolean promote(Promote txnType) { 
         return false;
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
index 1700fcb..e482ed5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
@@ -42,7 +42,6 @@ public class TransactionalNotSupported implements Transactional
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }
@@ -68,11 +67,8 @@ public class TransactionalNotSupported implements Transactional
     public void begin(ReadWrite readWrite)
     { throw new UnsupportedOperationException("Transactional.begin(ReadWrite)") ; }
 
-    @Override public boolean promote()
+    @Override public boolean promote(Promote txnType)
     { throw new UnsupportedOperationException("Transactional.promote") ; }
-    
-    @Override public boolean promote(TxnType txnType)
-    { throw new UnsupportedOperationException("Transactional.promote(TxnType)") ; }
 
     @Override
     public void commit()

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
index 66253ad..894d965 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupportedMixin.java
@@ -38,11 +38,8 @@ public interface TransactionalNotSupportedMixin extends Transactional
     public default void begin(ReadWrite readWrite)
     { throw new UnsupportedOperationException("Transactional.begin(ReadWrite)") ; }
 
-    @Override public default boolean promote()
-    { throw new UnsupportedOperationException("Transactional.promote()") ; }
-    
-    @Override public default boolean promote(TxnType txnType)
-    { throw new UnsupportedOperationException("Transactional.promote(TxnType)") ; }
+    @Override public default boolean promote(Promote txnType)
+    { throw new UnsupportedOperationException("Transactional.promote") ; }
     
     @Override
     public default void commit()

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
index 1ab2e60..89dee0f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNull.java
@@ -32,7 +32,6 @@ public class TransactionalNull implements Transactional {
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
     @Override public void begin(ReadWrite mode)         { txn.begin(mode); }
-    @Override public boolean promote()                  { return txn.promote(); }
     @Override public void commit()                      { txn.commit(); }
     @Override public void abort()                       { txn.abort(); }
     @Override public boolean isInTransaction()          { return txn.isInTransaction(); }
@@ -77,17 +76,12 @@ public class TransactionalNull implements Transactional {
     }
 
     @Override
-    public boolean promote() {
+    public boolean promote(Promote txnType) {
         if ( ! inTransaction.get() )
             throw new JenaTransactionException("Not in transaction"); 
         txnMode.set(ReadWrite.WRITE);
         return true;
     }
-    
-    @Override
-    public boolean promote(TxnType txnType) {
-        return promote(); 
-    }
 
     @Override
     public void commit() {

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
index 8c965cd..e7823b9 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
@@ -178,31 +178,16 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
     }
 
     @Override
-    public boolean promote() {
-        return promote(transactionType.get());
-    }
-    
-    @Override
-    public boolean promote(TxnType txnType) {
+    public boolean promote(Promote promoteMode) {
         if (!isInTransaction())
             throw new JenaTransactionException("Tried to promote outside a transaction!");
         if ( transactionMode().equals(ReadWrite.WRITE) )
             return true;
-        boolean readCommitted;
-        switch(txnType) {
-            case WRITE :
-                return true;
-            case READ :
-                throw new JenaTransactionException("Tried to promote READ transaction");
-            case READ_COMMITTED_PROMOTE :
-                readCommitted = true;
-            case READ_PROMOTE :
-                readCommitted = false;
-                // Maybe!
-                break;
-            default:
-                throw new NullPointerException();
-        }
+        
+        if ( transactionType() == TxnType.READ )
+            return false;
+        
+        boolean readCommitted = (promoteMode == Promote.READ_COMMITTED);
         
         try {
             _promote(readCommitted);

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineFactoryWrapper.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineFactoryWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineFactoryWrapper.java
index 004688d..2f00eee 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineFactoryWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineFactoryWrapper.java
@@ -36,7 +36,7 @@ public class QueryEngineFactoryWrapper implements QueryEngineFactory
     
     @Override
     public boolean accept(Query query, DatasetGraph dsg, Context context) {
-        if ( !(  dsg instanceof DatasetGraphWrapper ) )
+        if ( !( dsg instanceof DatasetGraphWrapper ) )
             return false ;    
         DatasetGraph dsg2 = ((DatasetGraphWrapper)dsg).getWrapped() ;
         return QueryEngineRegistry.findFactory(query, dsg2, context).accept(query, dsg2, context) ;
@@ -44,7 +44,7 @@ public class QueryEngineFactoryWrapper implements QueryEngineFactory
 
     @Override
     public Plan create(Query query, DatasetGraph dsg, Binding inputBinding, Context context) {
-        if ( !(  dsg instanceof DatasetGraphWrapper ) )
+        if ( ! ( dsg instanceof DatasetGraphWrapper ) )
             return null ;    
         DatasetGraph dsg2 = ((DatasetGraphWrapper)dsg).getWrapped() ;
         return QueryEngineRegistry.findFactory(query, dsg2, context).create(query, dsg2, inputBinding, context) ;
@@ -52,7 +52,7 @@ public class QueryEngineFactoryWrapper implements QueryEngineFactory
 
     @Override
     public boolean accept(Op op, DatasetGraph dsg, Context context) {
-        if ( !(  dsg instanceof DatasetGraphWrapper ) )
+        if ( ! ( dsg instanceof DatasetGraphWrapper ) )
             return false ;    
         DatasetGraph dsg2 = ((DatasetGraphWrapper)dsg).getWrapped() ;
         return QueryEngineRegistry.findFactory(op, dsg2, context).accept(op, dsg2, context) ;
@@ -60,7 +60,7 @@ public class QueryEngineFactoryWrapper implements QueryEngineFactory
 
     @Override
     public Plan create(Op op, DatasetGraph dsg, Binding inputBinding, Context context) {
-        if ( !(  dsg instanceof DatasetGraphWrapper ) )
+        if ( ! ( dsg instanceof DatasetGraphWrapper ) )
             return null ;    
         DatasetGraph dsg2 = ((DatasetGraphWrapper)dsg).getWrapped() ;
         return QueryEngineRegistry.findFactory(op, dsg2, context).create(op, dsg2, inputBinding, context) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
index ef68b59..66e2e30 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
@@ -28,6 +28,7 @@ import static org.apache.jena.sparql.core.Quad.defaultGraphIRI;
 import static org.apache.jena.sparql.util.graph.GraphUtils.triples2quads;
 
 import java.util.Iterator;
+import java.util.Objects;
 
 import org.apache.jena.atlas.lib.PairOfSameType;
 import org.apache.jena.graph.Graph;
@@ -36,6 +37,7 @@ import org.apache.jena.graph.compose.MultiUnion;
 import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.shared.Lock;
+import org.apache.jena.sparql.JenaTransactionException;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.core.Quad;
 
@@ -57,43 +59,50 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
 
     @Override
     public void commit() {
-        throwNoMutationAllowed();
+        forEach(DatasetGraph::commit);
     }
 
     @Override
+    public void begin() {
+        begin(TxnType.READ);
+    }
+
+    
+    @Override
     public void begin(TxnType type) {
         switch (type) {
         case READ:
             forEach(dsg -> dsg.begin(type));
             break;
         default:
-            throwNoMutationAllowed();
+            throw new JenaTransactionException("Only READ transactions supported");
         }
     }
 
     @Override
-    public boolean promote() {
-        // no mutation allowed
-        return false;
-    }
-
-    @Override
-    public boolean promote(TxnType txnType) {
+    public boolean promote(Promote txnType) {
         // no mutation allowed
         return false;
     }
+    
     @Override
     public ReadWrite transactionMode() {
+        if ( ! isInTransaction() )
+            return null; 
         return TxnType.convert(transactionType());
     }
 
     @Override
     public TxnType transactionType() {
-        return both(dsg -> dsg.transactionType() == READ) ? READ : null;
+        if ( ! isInTransaction() )
+            return null;
+        // no mutation allowed
+        return READ ;
     }
 
     @Override
     public synchronized void begin(ReadWrite readWrite) {
+        Objects.requireNonNull(readWrite);
         begin(TxnType.convert(readWrite));
     }
 
@@ -109,7 +118,11 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
 
     @Override
     public boolean isInTransaction() {
-        return either(DatasetGraph::isInTransaction);
+        if ( both(DatasetGraph::isInTransaction) )
+            return true;
+        if ( !either(DatasetGraph::isInTransaction) )
+            return false;
+        throw new JenaTransactionException("One datset in a transaction and one not");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java b/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
index e04a267..086c70a 100644
--- a/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
+++ b/jena-arq/src/main/java/org/apache/jena/system/TxnCounter.java
@@ -118,18 +118,13 @@ public class TxnCounter implements Transactional {
     }
 
     @Override
-    public boolean promote() {
-        return promote(transactionType.get());
-    }
-    
-    @Override
-    public boolean promote(TxnType txnType) {
+    public boolean promote(Promote promoteMode) {
         checkTxn();
         if ( transactionMode.get() == ReadWrite.WRITE )
             return true;
-        if ( txnType == TxnType.READ )
+        if ( transactionType.get() == TxnType.READ )
             throw new JenaTransactionException("Attempt to promote a READ transsction");
-        if ( txnType == TxnType.READ_COMMITTED_PROMOTE ) {
+        if ( promoteMode == Promote.READ_COMMITTED ) {
             // READ_COMMITTED_PROMOTE
             acquireWriterLock(true);
             transactionMode.set(ReadWrite.WRITE);

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/test/java/org/apache/jena/sparql/ARQTestSuite.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/ARQTestSuite.java b/jena-arq/src/test/java/org/apache/jena/sparql/ARQTestSuite.java
index 23f3e66..29d243c 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/ARQTestSuite.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/ARQTestSuite.java
@@ -43,7 +43,10 @@ public class ARQTestSuite extends TestSuite
 
     // Log4j for testing.
     public static final String log4jPropertiesResourceName = "log4j-testing.properties" ;
-    static { System.getProperty("log4j.configuration", log4jPropertiesResourceName) ; }
+    static { 
+        System.getProperty("log4j.configuration", log4jPropertiesResourceName) ;
+        JenaSystem.init();
+    }
     
     static public TestSuite suite()
     {

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java b/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
index ecd37c0..bf3c454 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
@@ -18,21 +18,21 @@
 
 package org.apache.jena.sparql.graph;
 
-import java.util.Arrays ;
-import java.util.List ;
+import java.util.Arrays;
+import java.util.List;
 
-import org.apache.jena.atlas.iterator.Iter ;
-import org.apache.jena.atlas.junit.BaseTest ;
-import org.apache.jena.atlas.lib.StrUtils ;
-import org.apache.jena.graph.Graph ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.NodeFactory ;
-import org.apache.jena.sparql.core.DatasetGraph ;
-import org.apache.jena.sparql.graph.GraphUnionRead ;
-import org.apache.jena.sparql.sse.Item ;
-import org.apache.jena.sparql.sse.SSE ;
-import org.apache.jena.sparql.sse.builders.BuilderGraph ;
-import org.junit.Test ;
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.atlas.junit.BaseTest;
+import org.apache.jena.atlas.lib.StrUtils;
+import org.apache.jena.graph.Graph;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.graph.GraphUnionRead;
+import org.apache.jena.sparql.sse.Item;
+import org.apache.jena.sparql.sse.SSE;
+import org.apache.jena.sparql.sse.builders.BuilderGraph;
+import org.junit.Test;
 
 public class TestGraphUnionRead extends BaseTest
 {
@@ -53,80 +53,79 @@ public class TestGraphUnionRead extends BaseTest
       " (graph <http://example/g3>",
       "   (triple <http://example/s> <http://example/p> 'g3')",
       "   (triple <http://example/s> <http://example/p> <http://example/o>)",
-      " ))") ;
-    private static DatasetGraph dsg = null ;
+      " ))");
+    private static DatasetGraph dsg = null;
     static {
-        Item item = SSE.parse(dataStr) ;
-        dsg = BuilderGraph.buildDataset(item) ;
+        Item item = SSE.parse(dataStr);
+        dsg = BuilderGraph.buildDataset(item);
     }
-    private static Node gn1 = SSE.parseNode("<http://example/g1>") ;
-    private static Node gn2 = SSE.parseNode("<http://example/g2>") ;
-    private static Node gn3 = SSE.parseNode("<http://example/g3>") ;
-    private static Node gn9 = SSE.parseNode("<http://example/g9>") ;
+    private static Node gn1 = SSE.parseNode("<http://example/g1>");
+    private static Node gn2 = SSE.parseNode("<http://example/g2>");
+    private static Node gn3 = SSE.parseNode("<http://example/g3>");
+    private static Node gn9 = SSE.parseNode("<http://example/g9>");
     
-    @Test public void gr_union_01()
-    {
-        List<Node> gnodes = list(gn1, gn2) ;
-        Graph g = new GraphUnionRead(dsg, gnodes) ;
-        long x = Iter.count(g.find(null, null, null)) ;
-        assertEquals(3, x) ;
+    @Test
+    public void gr_union_01() {
+        List<Node> gnodes = list(gn1, gn2);
+        Graph g = new GraphUnionRead(dsg, gnodes);
+        long x = Iter.count(g.find(null, null, null));
+        assertEquals(3, x);
     }
-    
-    @Test public void gr_union_02()
-    {
-        List<Node> gnodes = list(gn1, gn2) ;
-        Graph g = new GraphUnionRead(dsg, gnodes) ;
-        Node s = NodeFactory.createURI("http://example/s") ; 
-        long x = Iter.count(g.find(s, null, null)) ;
-        assertEquals(3, x) ;
+
+    @Test
+    public void gr_union_02() {
+        List<Node> gnodes = list(gn1, gn2);
+        Graph g = new GraphUnionRead(dsg, gnodes);
+        Node s = NodeFactory.createURI("http://example/s");
+        long x = Iter.count(g.find(s, null, null));
+        assertEquals(3, x);
     }
 
-    @Test public void gr_union_03()
-    {
-        List<Node> gnodes = list(gn1, gn2, gn9) ;
-        Graph g = new GraphUnionRead(dsg, gnodes) ;
-        Node o = NodeFactory.createLiteral("g2") ; 
-        long x = Iter.count(g.find(null, null, o)) ;
-        assertEquals(1, x) ;
+    @Test
+    public void gr_union_03() {
+        List<Node> gnodes = list(gn1, gn2, gn9);
+        Graph g = new GraphUnionRead(dsg, gnodes);
+        Node o = NodeFactory.createLiteral("g2");
+        long x = Iter.count(g.find(null, null, o));
+        assertEquals(1, x);
     }
-    
-    @Test public void gr_union_04()
-    {
-        List<Node> gnodes = list(gn9) ;
-        Graph g = new GraphUnionRead(dsg, gnodes) ;
-        long x = Iter.count(g.find(null, null, null)) ;
-        assertEquals(0, x) ;
+
+    @Test
+    public void gr_union_04() {
+        List<Node> gnodes = list(gn9);
+        Graph g = new GraphUnionRead(dsg, gnodes);
+        long x = Iter.count(g.find(null, null, null));
+        assertEquals(0, x);
     }
 
-    @Test public void gr_union_05()
-    {
-        List<Node> gnodes = list() ;
-        Graph g = new GraphUnionRead(dsg, gnodes) ;
-        long x = Iter.count(g.find(null, null, null)) ;
-        assertEquals(0, x) ;
+    @Test
+    public void gr_union_05() {
+        List<Node> gnodes = list();
+        Graph g = new GraphUnionRead(dsg, gnodes);
+        long x = Iter.count(g.find(null, null, null));
+        assertEquals(0, x);
     }
-    
-    @Test public void gr_union_06()
-    {
-        List<Node> gnodes = list(gn1, gn1) ;
-        Graph g = new GraphUnionRead(dsg, gnodes) ;
-        long x = Iter.count(g.find(null, null, null)) ;
-        assertEquals(2, x) ;
+
+    @Test
+    public void gr_union_06() {
+        List<Node> gnodes = list(gn1, gn1);
+        Graph g = new GraphUnionRead(dsg, gnodes);
+        long x = Iter.count(g.find(null, null, null));
+        assertEquals(2, x);
     }
 
-    @Test public void gr_union_of_one_1()
-    {
-        List<Node> gnodes = list(gn2) ;
-        Graph g = new GraphUnionRead(dsg, gnodes) ;
-        long x1 = Iter.count(g.find(null, null, null)) ;
-        assertEquals(2, x1) ;
-        Node o = NodeFactory.createLiteral("g2") ; 
-        long x2 = Iter.count(g.find(null, null, o)) ;
-        assertEquals(1, x2) ;
+    @Test
+    public void gr_union_of_one_1() {
+        List<Node> gnodes = list(gn2);
+        Graph g = new GraphUnionRead(dsg, gnodes);
+        long x1 = Iter.count(g.find(null, null, null));
+        assertEquals(2, x1);
+        Node o = NodeFactory.createLiteral("g2");
+        long x2 = Iter.count(g.find(null, null, o));
+        assertEquals(1, x2);
     }
 
-    static <T> List<T> list(@SuppressWarnings("unchecked") T...x)
-    {
-        return Arrays.asList(x) ;
+    static List<Node> list(Node...x) {
+        return Arrays.asList(x);
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransactionLifecycle.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransactionLifecycle.java b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransactionLifecycle.java
index ec80425..f593b7c 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransactionLifecycle.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/AbstractTestTransactionLifecycle.java
@@ -18,145 +18,143 @@
 
 package org.apache.jena.sparql.transaction;
 
-import static org.apache.jena.query.TxnType.READ ;
-import static org.apache.jena.query.TxnType.WRITE ;
 import static org.junit.Assume.assumeTrue;
 
-import java.util.ArrayList ;
-import java.util.List ;
-import java.util.concurrent.* ;
-import java.util.concurrent.atomic.AtomicLong ;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.jena.atlas.junit.BaseTest ;
-import org.apache.jena.atlas.lib.Lib ;
-import org.apache.jena.query.Dataset ;
-import org.apache.jena.query.ReadWrite ;
+import org.apache.jena.atlas.junit.BaseTest;
+import org.apache.jena.atlas.lib.Lib;
+import org.apache.jena.query.Dataset;
+import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
-import org.apache.jena.shared.JenaException;
-import org.apache.jena.sparql.JenaTransactionException ;
-import org.junit.Test ;
+import org.apache.jena.sparql.JenaTransactionException;
+import org.apache.jena.sparql.core.Transactional.Promote;
+import org.junit.Test;
 
 /**
  * Dataset transaction lifecycle. 
  */
 public abstract class AbstractTestTransactionLifecycle extends BaseTest
 {
-    protected abstract Dataset create() ;
+    protected abstract Dataset create();
     
-    protected boolean supportsAbort()   { return true ; } 
-    protected boolean supportsPromote() { return true ; }
+    protected boolean supportsAbort()   { return true; } 
+    protected boolean supportsPromote() { return true; }
 
     @Test
     public void transaction_00() {
-        Dataset ds = create() ;
-        assertTrue(ds.supportsTransactions()) ;
+        Dataset ds = create();
+        assertTrue(ds.supportsTransactions());
     }
 
     @Test
     public void transaction_r01() {
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.end() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(TxnType.READ);
+        assertTrue(ds.isInTransaction());
+        ds.end();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_r02() {
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.commit() ;
-        assertFalse(ds.isInTransaction()) ;
-        ds.end() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(TxnType.READ);
+        assertTrue(ds.isInTransaction());
+        ds.commit();
+        assertFalse(ds.isInTransaction());
+        ds.end();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_r03() {
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.abort() ;
-        assertFalse(ds.isInTransaction()) ;
-        ds.end() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(TxnType.READ);
+        assertTrue(ds.isInTransaction());
+        ds.abort();
+        assertFalse(ds.isInTransaction());
+        ds.end();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_r04() {
-        Dataset ds = create() ;
-        ds.begin(ReadWrite.READ) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.end() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(ReadWrite.READ);
+        assertTrue(ds.isInTransaction());
+        ds.end();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_w01() {
-        Dataset ds = create() ;
-        ds.begin(TxnType.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.commit() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(TxnType.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.commit();
+        assertFalse(ds.isInTransaction());
     }
     
     @Test
     public void transaction_w02() {
-        Dataset ds = create() ;
-        ds.begin(ReadWrite.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.commit() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(ReadWrite.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.commit();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_w03() {
-        assumeTrue(supportsAbort()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.abort() ;
-        assertFalse(ds.isInTransaction()) ;
+        assumeTrue(supportsAbort());
+        Dataset ds = create();
+        ds.begin(TxnType.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.abort();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_w04() {
-        Dataset ds = create() ;
-        ds.begin(TxnType.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.commit() ;
-        assertFalse(ds.isInTransaction()) ;
-        ds.end() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(TxnType.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.commit();
+        assertFalse(ds.isInTransaction());
+        ds.end();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_w05() {
-        assumeTrue(supportsAbort()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.abort() ;
-        assertFalse(ds.isInTransaction()) ;
-        ds.end() ;
-        assertFalse(ds.isInTransaction()) ;
+        assumeTrue(supportsAbort());
+        Dataset ds = create();
+        ds.begin(TxnType.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.abort();
+        assertFalse(ds.isInTransaction());
+        ds.end();
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_w06() {
-        assumeTrue(supportsAbort()) ;
+        assumeTrue(supportsAbort());
         // .end is not necessary
-        Dataset ds = create() ;
-        ds.begin(TxnType.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.abort() ;
-        assertFalse(ds.isInTransaction()) ;
+        Dataset ds = create();
+        ds.begin(TxnType.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.abort();
+        assertFalse(ds.isInTransaction());
 
-        ds.begin(TxnType.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.abort() ;
-        assertFalse(ds.isInTransaction()) ;
+        ds.begin(TxnType.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.abort();
+        assertFalse(ds.isInTransaction());
     }
 
 //    TxnType.READ_PROMOTE
@@ -164,11 +162,11 @@ public abstract class AbstractTestTransactionLifecycle extends BaseTest
     
     @Test
     public void transaction_p01() {
-        assumeTrue(supportsPromote()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ_PROMOTE) ;
+        assumeTrue(supportsPromote());
+        Dataset ds = create();
+        ds.begin(TxnType.READ_PROMOTE);
         assertEquals(TxnType.READ_PROMOTE, ds.transactionType());
-        assertTrue(ds.isInTransaction()) ;
+        assertTrue(ds.isInTransaction());
         assertEquals(ReadWrite.READ, ds.transactionMode());
         ds.promote();
         assertEquals(ReadWrite.WRITE, ds.transactionMode());
@@ -178,14 +176,14 @@ public abstract class AbstractTestTransactionLifecycle extends BaseTest
     
     @Test
     public void transaction_p02() {
-        assumeTrue(supportsPromote()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ_COMMITTED_PROMOTE) ;
+        assumeTrue(supportsPromote());
+        Dataset ds = create();
+        ds.begin(TxnType.READ_COMMITTED_PROMOTE);
         assertEquals(TxnType.READ_COMMITTED_PROMOTE, ds.transactionType());
-        assertTrue(ds.isInTransaction()) ;
+        assertTrue(ds.isInTransaction());
         assertEquals(ReadWrite.READ, ds.transactionMode());
         boolean b = ds.promote();
-        assertTrue(b) ;
+        assertTrue(b);
         assertEquals(ReadWrite.WRITE, ds.transactionMode());
         ds.commit();
         ds.end();
@@ -193,72 +191,151 @@ public abstract class AbstractTestTransactionLifecycle extends BaseTest
     
     @Test
     public void transaction_p03() {
-        assumeTrue(supportsPromote()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ_PROMOTE) ;
-        assertTrue(ds.isInTransaction()) ;
+        assumeTrue(supportsPromote());
+        Dataset ds = create();
+        ds.begin(TxnType.READ_PROMOTE);
+        assertTrue(ds.isInTransaction());
         assertEquals(ReadWrite.READ, ds.transactionMode());
         boolean b = ds.promote();
-        assertTrue(b) ;
+        assertTrue(b);
         assertEquals(ReadWrite.WRITE, ds.transactionMode());
         ds.abort();
         ds.end();
-        assertFalse(ds.isInTransaction()) ;
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_p04() {
-        assumeTrue(supportsPromote()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ_COMMITTED_PROMOTE) ;
-        assertTrue(ds.isInTransaction()) ;
+        assumeTrue(supportsPromote());
+        Dataset ds = create();
+        ds.begin(TxnType.READ_COMMITTED_PROMOTE);
+        assertTrue(ds.isInTransaction());
         assertEquals(ReadWrite.READ, ds.transactionMode());
         boolean b = ds.promote();
-        assertTrue(b) ;
+        assertTrue(b);
         assertEquals(ReadWrite.WRITE, ds.transactionMode());
         ds.abort();
         ds.end();
-        assertFalse(ds.isInTransaction()) ;
+        assertFalse(ds.isInTransaction());
     }
 
     @Test
     public void transaction_p05() {
-        assumeTrue(supportsPromote()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ_COMMITTED_PROMOTE) ;
-        assertTrue(ds.isInTransaction()) ;
+        assumeTrue(supportsPromote());
+        Dataset ds = create();
+        ds.begin(TxnType.READ_COMMITTED_PROMOTE);
+        assertTrue(ds.isInTransaction());
         boolean b1 = ds.promote();
-        assertTrue(b1) ;
+        assertTrue(b1);
         boolean b2 = ds.promote();
-        assertTrue(b2) ;
+        assertTrue(b2);
         ds.commit();
         ds.end();
     }
     
+    @Test
+    public void transaction_p06_err() {
+        assumeTrue(supportsPromote());
+        Dataset ds = create();
+        ds.begin(TxnType.READ);
+        assertTrue(ds.isInTransaction());
+        boolean b1 = ds.promote();
+        assertFalse(b1);
+        boolean b2 = ds.promote();
+        assertFalse(b2);
+        ds.end();
+    }
+
+    
     // JENA-1469
     @Test
-    public void transaction_p06() {
+    public void transaction_p10() {
         transaction_promote_write(TxnType.READ_COMMITTED_PROMOTE);
     }
 
     @Test
-    public void transaction_p07() {
+    public void transaction_p11() {
         transaction_promote_write(TxnType.READ_PROMOTE);
     }
 
-    @Test(expected=JenaException.class)
-    public void transaction_err_read_promote() {
-        assumeTrue(supportsPromote()) ;
-        Dataset ds = create() ;
-        ds.begin(TxnType.READ) ;
-        boolean b = ds.promote();   // Illgeal.
-        assertFalse(b) ;
+    // XXX Refactor the above code.
+    
+    // promotion tyope specified
+    private void testPromote(TxnType txnType , Promote promoteMode, boolean succeeds) {
+        Dataset ds = create();
+        ds.begin(txnType);
+        assertTrue(ds.isInTransaction());
+        boolean b1 = ds.promote(promoteMode);
+        assertEquals(succeeds, b1);
+        boolean b2 = ds.promote(promoteMode);
+        assertEquals("Try same promote again", b1, b2);
+        ds.commit();
+        ds.end();
+        
+    }
+    
+    @Test
+    public void transaction_promote_write_isolated() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.WRITE, Promote.ISOLATED, true);
+    }
+    
+    @Test
+    public void transaction_promote_write_readCommitted() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.WRITE, Promote.READ_COMMITTED, true);
+    }
+        
+    @Test
+    public void transaction_promote_read_isolated() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.READ, Promote.ISOLATED, false);
+    }
+    
+    @Test
+    public void transaction_promote_read_readCommitted() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.READ, Promote.READ_COMMITTED, false);
+    }
+        
+    @Test
+    public void transaction_promote_readPromote_isolated() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.READ_PROMOTE, Promote.ISOLATED, true);
+    }
+    
+    @Test
+    public void transaction_promote_readPromote_committed() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.READ_PROMOTE, Promote.READ_COMMITTED, true);
+    }
+        
+    @Test
+    public void transaction_promote_readCommitted_isolated() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.READ_COMMITTED_PROMOTE, Promote.ISOLATED, true);
+    }
+    
+    @Test
+    public void transaction_promote_readCommitted_readCommitted() {
+        assumeTrue(supportsPromote());
+        testPromote(TxnType.READ_COMMITTED_PROMOTE, Promote.READ_COMMITTED, true);
+    }
+        
+    
+    @Test
+    public void transaction_read_promote() {
+        assumeTrue(supportsPromote());
+        Dataset ds = create();
+        ds.begin(TxnType.READ);
+        boolean b = ds.promote();   // Fails
+        assertFalse(b);
         ds.commit();
         ds.end();
     }
 
     private void transaction_promote_write(TxnType txnType) {
-        Dataset ds = create() ;
+        Dataset ds = create();
         ds.begin(txnType);
         ds.promote();
         ds.commit();
@@ -271,33 +348,33 @@ public abstract class AbstractTestTransactionLifecycle extends BaseTest
     // Patterns.
     @Test
     public void transaction_pattern_01() {
-        Dataset ds = create() ;
-        read1(ds) ;
-        read1(ds) ;
+        Dataset ds = create();
+        read1(ds);
+        read1(ds);
     }
 
     @Test
     public void transaction_pattern_02() {
-        Dataset ds = create() ;
-        read2(ds) ;
-        read2(ds) ;
+        Dataset ds = create();
+        read2(ds);
+        read2(ds);
     }
 
     @Test
     public void transaction_pattern_03() {
-        Dataset ds = create() ;
-        write(ds) ;
-        write(ds) ;
+        Dataset ds = create();
+        write(ds);
+        write(ds);
     }
 
     @Test
     public void transaction_pattern_04() {
-        Dataset ds = create() ;
-        write(ds) ;
-        read2(ds) ;
-        read2(ds) ;
-        write(ds) ;
-        read2(ds) ;
+        Dataset ds = create();
+        write(ds);
+        read2(ds);
+        read2(ds);
+        write(ds);
+        read2(ds);
     }
     
     // Cycle misalignment.
@@ -307,177 +384,177 @@ public abstract class AbstractTestTransactionLifecycle extends BaseTest
     
     @Test(expected=JenaTransactionException.class)
     public void transaction_err_nontxn_commit_1() { 
-        Dataset ds = create() ;
-        ds.commit() ;
+        Dataset ds = create();
+        ds.commit();
     }    
     
     @Test(expected=JenaTransactionException.class)
     public void transaction_err_nontxn_commit_2() { 
-        Dataset ds = create() ;
-        ds.begin(READ) ;
-        ds.end() ;
-        ds.commit() ;
+        Dataset ds = create();
+        ds.begin(TxnType.READ);
+        ds.end();
+        ds.commit();
     }    
     
     @Test(expected=JenaTransactionException.class)
     public void transaction_err_nontxn_commit_3() { 
-        Dataset ds = create() ;
-        ds.begin(WRITE) ;
-        ds.end() ;
-        ds.commit() ;
+        Dataset ds = create();
+        ds.begin(TxnType.WRITE);
+        ds.end();
+        ds.commit();
     }    
 
     @Test(expected=JenaTransactionException.class)
     public void transaction_err_nontxn_abort_1() { 
-        Dataset ds = create() ;
-        ds.abort() ;
+        Dataset ds = create();
+        ds.abort();
     }    
 
     @Test(expected=JenaTransactionException.class)
     public void transaction_err_nontxn_abort_2() { 
-        Dataset ds = create() ;
-        ds.begin(READ) ;
-        ds.end() ;
-        ds.abort() ;
+        Dataset ds = create();
+        ds.begin(TxnType.READ);
+        ds.end();
+        ds.abort();
     }    
 
     @Test(expected=JenaTransactionException.class)
     public void transaction_err_nontxn_abort_3() { 
-        Dataset ds = create() ;
-        ds.begin(WRITE) ;
-        ds.end() ;
-        ds.abort() ;
+        Dataset ds = create();
+        ds.begin(TxnType.WRITE);
+        ds.end();
+        ds.abort();
     }    
     
     @Test
-    public void transaction_err_01()    { testBeginBegin(WRITE, WRITE) ; }
+    public void transaction_err_01()    { testBeginBegin(TxnType.WRITE, TxnType.WRITE); }
 
     @Test
-    public void transaction_err_02()    { testBeginBegin(WRITE, READ) ; }
+    public void transaction_err_02()    { testBeginBegin(TxnType.WRITE, TxnType.READ); }
 
     @Test
-    public void transaction_err_03()    { testBeginBegin(READ, READ) ; }
+    public void transaction_err_03()    { testBeginBegin(TxnType.READ, TxnType.READ); }
 
     @Test
-    public void transaction_err_04()    { testBeginBegin(READ, WRITE) ; }
+    public void transaction_err_04()    { testBeginBegin(TxnType.READ, TxnType.WRITE); }
 
     @Test 
-    public void transaction_err_05()    { testCommitCommit(READ) ; }
+    public void transaction_err_05()    { testCommitCommit(TxnType.READ); }
 
     @Test 
-    public void transaction_err_06()    { testCommitCommit(WRITE) ; }
+    public void transaction_err_06()    { testCommitCommit(TxnType.WRITE); }
 
     @Test 
-    public void transaction_err_07()    { testCommitAbort(READ) ; }
+    public void transaction_err_07()    { testCommitAbort(TxnType.READ); }
 
     @Test 
-    public void transaction_err_08()    { testCommitAbort(WRITE) ; }
+    public void transaction_err_08()    { testCommitAbort(TxnType.WRITE); }
 
     @Test 
-    public void transaction_err_09()    { testAbortAbort(READ) ; }
+    public void transaction_err_09()    { testAbortAbort(TxnType.READ); }
 
     @Test 
-    public void transaction_err_10()    { testAbortAbort(WRITE) ; }
+    public void transaction_err_10()    { testAbortAbort(TxnType.WRITE); }
 
     @Test 
-    public void transaction_err_11()    { testAbortCommit(READ) ; }
+    public void transaction_err_11()    { testAbortCommit(TxnType.READ); }
 
     @Test 
-    public void transaction_err_12()    { testAbortCommit(WRITE) ; }
+    public void transaction_err_12()    { testAbortCommit(TxnType.WRITE); }
 
     private void read1(Dataset ds) {
-        ds.begin(TxnType.READ) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.commit() ;
-        assertFalse(ds.isInTransaction()) ;
-        ds.end() ;
+        ds.begin(TxnType.READ);
+        assertTrue(ds.isInTransaction());
+        ds.commit();
+        assertFalse(ds.isInTransaction());
+        ds.end();
     }
 
     private void read2(Dataset ds) {
-        ds.begin(TxnType.READ) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.end() ;
-        assertFalse(ds.isInTransaction()) ;
+        ds.begin(TxnType.READ);
+        assertTrue(ds.isInTransaction());
+        ds.end();
+        assertFalse(ds.isInTransaction());
     }
 
     private void write(Dataset ds) {
-        ds.begin(TxnType.WRITE) ;
-        assertTrue(ds.isInTransaction()) ;
-        ds.commit() ;
-        assertFalse(ds.isInTransaction()) ;
-        ds.end() ;
+        ds.begin(TxnType.WRITE);
+        assertTrue(ds.isInTransaction());
+        ds.commit();
+        assertFalse(ds.isInTransaction());
+        ds.end();
     }
 
     private static void safeEnd(Dataset ds) {
-        try { ds.end() ; } catch (JenaTransactionException ex) {}
+        try { ds.end(); } catch (JenaTransactionException ex) {}
     }
     
     // Error conditions that should be detected.
 
     private void testBeginBegin(TxnType txnType1, TxnType txnType2) {
-        Dataset ds = create() ;
-        ds.begin(txnType1) ;
+        Dataset ds = create();
+        ds.begin(txnType1);
         try {
-            ds.begin(txnType2) ;
-            fail("Expected transaction exception - begin-begin (" + txnType1 + ", " + txnType2 + ")") ;
+            ds.begin(txnType2);
+            fail("Expected transaction exception - begin-begin (" + txnType1 + ", " + txnType2 + ")");
         }
         catch (JenaTransactionException ex) {
-            safeEnd(ds) ;
+            safeEnd(ds);
         }
     }
     
     private void testCommitCommit(TxnType txnType) {
-        Dataset ds = create() ;
-        ds.begin(txnType) ;
-        ds.commit() ;
+        Dataset ds = create();
+        ds.begin(txnType);
+        ds.commit();
         try {
-            ds.commit() ;
-            fail("Expected transaction exception - commit-commit(" + txnType + ")") ;
+            ds.commit();
+            fail("Expected transaction exception - commit-commit(" + txnType + ")");
         }
         catch (JenaTransactionException ex) {
-            safeEnd(ds) ;
+            safeEnd(ds);
         }
     }
 
     private void testCommitAbort(TxnType txnType) {
-        assumeTrue(supportsAbort()) ;
-        Dataset ds = create() ;
-        ds.begin(txnType) ;
-        ds.commit() ;
+        assumeTrue(supportsAbort());
+        Dataset ds = create();
+        ds.begin(txnType);
+        ds.commit();
         try {
-            ds.abort() ;
-            fail("Expected transaction exception - commit-abort(" + txnType + ")") ;
+            ds.abort();
+            fail("Expected transaction exception - commit-abort(" + txnType + ")");
         }
         catch (JenaTransactionException ex) {
-            safeEnd(ds) ;
+            safeEnd(ds);
         }
     }
 
     private void testAbortAbort(TxnType txnType) {
-        assumeTrue(supportsAbort()) ;
-        Dataset ds = create() ;
-        ds.begin(txnType) ;
-        ds.abort() ;
+        assumeTrue(supportsAbort());
+        Dataset ds = create();
+        ds.begin(txnType);
+        ds.abort();
         try {
-            ds.abort() ;
-            fail("Expected transaction exception - abort-abort(" + txnType + ")") ;
+            ds.abort();
+            fail("Expected transaction exception - abort-abort(" + txnType + ")");
         }
         catch (JenaTransactionException ex) {
-            ds.end() ;
+            ds.end();
         }
     }
 
     private void testAbortCommit(TxnType txnType) {
-        assumeTrue(supportsAbort()) ;
-        Dataset ds = create() ;
-        ds.begin(txnType) ;
-        ds.abort() ;
+        assumeTrue(supportsAbort());
+        Dataset ds = create();
+        ds.begin(txnType);
+        ds.abort();
         try {
-            ds.commit() ;
-            fail("Expected transaction exception - abort-commit(" + txnType + ")") ;
+            ds.commit();
+            fail("Expected transaction exception - abort-commit(" + txnType + ")");
         }
         catch (JenaTransactionException ex) {
-            safeEnd(ds) ;
+            safeEnd(ds);
         }
     }
 
@@ -485,20 +562,20 @@ public abstract class AbstractTestTransactionLifecycle extends BaseTest
     @Test
     public synchronized void transaction_concurrency_writer() throws InterruptedException, ExecutionException, TimeoutException {
         ExecutorService executor = Executors.newFixedThreadPool(2);
-        AtomicLong counter = new AtomicLong(0) ;
+        AtomicLong counter = new AtomicLong(0);
         try {
-            final Dataset ds = create() ;
+            final Dataset ds = create();
 
             Callable<Boolean> callable = new Callable<Boolean>() {
 
                 @Override
                 public Boolean call() {
                     ds.begin(TxnType.WRITE);
-                    long x = counter.incrementAndGet() ;
+                    long x = counter.incrementAndGet();
                     // Hold the lock for a short while.
                     // The W threads will take the sleep serially.
-                    Lib.sleep(500) ;
-                    long x1 = counter.get() ;
+                    Lib.sleep(500);
+                    long x1 = counter.get();
                     assertEquals("Two writers in the transaction", x, x1);
                     ds.commit();
                     return true;
@@ -519,18 +596,18 @@ public abstract class AbstractTestTransactionLifecycle extends BaseTest
     @Test
     public synchronized void transaction_concurrency_reader() throws InterruptedException, ExecutionException, TimeoutException {
         ExecutorService executor = Executors.newCachedThreadPool();
-        AtomicLong counter = new AtomicLong(0) ;
+        AtomicLong counter = new AtomicLong(0);
         
         try {
-            final Dataset ds = create() ;
+            final Dataset ds = create();
 
             Callable<Boolean> callable = new Callable<Boolean>() {
                 @Override
                 public Boolean call() {
                     ds.begin(TxnType.READ);
-                    long x = counter.incrementAndGet() ;
+                    long x = counter.incrementAndGet();
                     // Hold the lock for a few seconds - these should be in parallel.
-                    Lib.sleep(1000) ;
+                    Lib.sleep(1000);
                     ds.commit();
                     return true;
                 }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-arq/src/test/java/org/apache/jena/sparql/util/TestDyadicDatasetGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/util/TestDyadicDatasetGraph.java b/jena-arq/src/test/java/org/apache/jena/sparql/util/TestDyadicDatasetGraph.java
index 0113c46..ea83c75 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/util/TestDyadicDatasetGraph.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/util/TestDyadicDatasetGraph.java
@@ -25,6 +25,7 @@ import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
 import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
+import org.apache.jena.sparql.JenaTransactionException;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.core.DatasetGraphZero;
 import org.junit.Test;
@@ -126,52 +127,75 @@ public abstract class TestDyadicDatasetGraph extends BaseTest {
         emptyDsg().getGraph(graphName).remove(null, null, null);
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    // Read lifecycle.
+    @Test
+    public void txnRead1() {
+        final DatasetGraph dsg = emptyDsg();
+        assertFalse(dsg.isInTransaction());
+        dsg.begin(ReadWrite.READ);
+        assertTrue(dsg.isInTransaction());
+        dsg.commit();
+        dsg.end();
+    }
+    
+    @Test
+    public void txnRead2() {
+        final DatasetGraph dsg = emptyDsg();
+        assertFalse(dsg.isInTransaction());
+        dsg.begin(ReadWrite.READ);
+        assertTrue(dsg.isInTransaction());
+        dsg.end();
+    }
+    
+    @Test
+    public void txnRead3() {
+        final DatasetGraph dsg = emptyDsg();
+        assertFalse(dsg.isInTransaction());
+        dsg.begin();
+        assertTrue(dsg.isInTransaction());
+        assertEquals(ReadWrite.READ, dsg.transactionMode());
+        assertEquals(TxnType.READ, dsg.transactionType());
+        dsg.end();
+    }
+    
+    @Test(expected = JenaTransactionException.class)
     public void noWriting1() {
         emptyDsg().begin(ReadWrite.WRITE);
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    @Test(expected = JenaTransactionException.class)
     public void noWriting2() {
         emptyDsg().begin(TxnType.WRITE);
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    @Test(expected = JenaTransactionException.class)
     public void noWriting3() {
         emptyDsg().begin(TxnType.READ_PROMOTE);
     }
 
-    @Test(expected = UnsupportedOperationException.class)
+    @Test(expected = JenaTransactionException.class)
     public void noWriting4() {
         emptyDsg().begin(TxnType.READ_COMMITTED_PROMOTE);
     }
     
     @Test
     public void noPromoting() {
-        assertFalse(emptyDsg().promote());
-    }
-
-    @Test(expected = UnsupportedOperationException.class)
-    public void noCommitting() {
         final DatasetGraph dsg = emptyDsg();
-        assertFalse(dsg.isInTransaction());
+        // Dynadic datasets are read-only.
         dsg.begin(ReadWrite.READ);
-        assertTrue(dsg.isInTransaction());
-        dsg.commit();
+        boolean b = dsg.promote();
+        assertFalse(b);
     }
-    
+
     @Test
     public void testTransactionTypeAndMode() {
         final DatasetGraph dsg = emptyDsg();
         assertFalse(dsg.isInTransaction());
-        try {
-            dsg.begin(TxnType.READ);
-            assertTrue(dsg.isInTransaction());
-            assertEquals(TxnType.READ, dsg.transactionType());
-            assertEquals(ReadWrite.READ, dsg.transactionMode());
-        } finally {
-            dsg.end();
-        }
+        dsg.begin(TxnType.READ);
+        assertTrue(dsg.isInTransaction());
+        assertEquals(TxnType.READ, dsg.transactionType());
+        assertEquals(ReadWrite.READ, dsg.transactionMode());
+        dsg.end();
         assertFalse(dsg.isInTransaction());
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-core/src/main/java/org/apache/jena/system/JenaSystem.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/system/JenaSystem.java b/jena-core/src/main/java/org/apache/jena/system/JenaSystem.java
index e7c59b1..18b2188 100644
--- a/jena-core/src/main/java/org/apache/jena/system/JenaSystem.java
+++ b/jena-core/src/main/java/org/apache/jena/system/JenaSystem.java
@@ -76,7 +76,7 @@ public class JenaSystem {
         // The same thread will not stop at the lock.
         // Set initialized to true before a recursive call is possible
         // handles this.  The recursive call will see initialized true and
-        // and returnn on the first test.
+        // and return on the first test.
 
         // Net effect:
         // After a top level call of JenaSystem.init() returns, tjena has

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
index 7144fda..97eac5a 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
@@ -107,17 +107,20 @@ public class Transaction implements TransactionInfo {
         setState(ACTIVE) ;
     }
     
+    private boolean promoteReadCommitted() {
+        if ( txnType == TxnType.READ_COMMITTED_PROMOTE ) return true;
+        if ( txnType == TxnType.READ_PROMOTE ) return false;
+        return false;
+    }
+    
     public boolean promote() {
-        checkState(ACTIVE);
-        boolean b = txnMgr.promoteTxn(this) ;
-        if ( !b )
-            return false ;
-        mode = ReadWrite.WRITE;
-        return true ;
+        return promote(promoteReadCommitted());
     }
     
     public boolean promote(boolean readCommitted) {
         checkState(ACTIVE);
+        if ( txnType == TxnType.READ )
+            return false;
         boolean b = txnMgr.promoteTxn(this, readCommitted) ;
         if ( !b )
             return false ;
@@ -137,8 +140,7 @@ public class Transaction implements TransactionInfo {
     public void notifyUpdate() {
         checkState(ACTIVE) ;
         if ( mode == ReadWrite.READ ) {
-            System.err.println("notifyUpdate - promote needed") ;
-            promote() ;
+            promote(promoteReadCommitted()) ;
             mode = ReadWrite.WRITE ;
         }
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
index 81d3100..e4431cb 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionCoordinator.java
@@ -28,7 +28,6 @@ import java.util.concurrent.atomic.AtomicLong ;
 import java.util.concurrent.locks.ReadWriteLock ;
 import java.util.concurrent.locks.ReentrantReadWriteLock ;
 
-import org.apache.jena.atlas.lib.InternalErrorException;
 import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.dboe.base.file.Location;
 import org.apache.jena.dboe.sys.Sys;
@@ -275,14 +274,13 @@ public class TransactionCoordinator {
             throw new TransactionException("TransactionCoordinator has already been started") ;
     }
 
-    // Are we up and ruuning?
+    // Is this TransactionCoordinator up and running?
     private void checkActive() {
         if ( ! coordinatorStarted )
             throw new TransactionException("TransactionCoordinator has not been started") ;
         checkNotShutdown();
     }
 
-    // Check not wrapped up
     private void checkNotShutdown() {
         if ( coordinatorLock == null )
             throw new TransactionException("TransactionCoordinator has been shutdown") ;
@@ -382,7 +380,6 @@ public class TransactionCoordinator {
      * 
      * @see #tryBlockWriters()
      * @see #enableWriters()
-     * 
      */
     public void blockWriters() {
         acquireWriterLock(true) ;
@@ -396,7 +393,7 @@ public class TransactionCoordinator {
      *  
      * @see #blockWriters()
      * @see #enableWriters()
-
+     *
      * @return true if the operation succeeded and writers are blocked 
      */
     public boolean tryBlockWriters() {
@@ -559,42 +556,6 @@ public class TransactionCoordinator {
         return cg ;
     }
 
-//    /** Is promotion of transactions enabled? */ 
-//    /*private*/public/*for development*/ static boolean promotion               = true ;
-//    
-//    /** Control of whether a transaction promotion can see any commits that
-//     *  happened between this transaction starting and it promoting.
-//     *  A form of "ReadCommitted".   
-//     */
-//    /*private*/public/*for development*/ static boolean readCommittedPromotion  = false ;
-    
-    /** Whether to wait for writers when trying to promote */
-    private static final boolean promotionWaitForWriters = true;
-
-    /** Attempt to promote a transaction from READ mode to WRITE mode based on its declared start type.
-     * Return true if the transaction is already a writer.
-     */
-    /*package*/ boolean promoteTxn(Transaction transaction) {
-        if ( transaction.getMode() == ReadWrite.WRITE )
-            return true ;
-        if ( transaction.getTxnType() == TxnType.READ )
-            throw new TransactionException("promote: can't promote a READ transaction") ;
-        
-        if ( transaction.getTxnType() != TxnType.READ_COMMITTED_PROMOTE && 
-             transaction.getTxnType() != TxnType.READ_PROMOTE )
-            throw new InternalErrorException("Transaction type is "+transaction.getTxnType());
-        
-        // Has there been an writer active since the transaction started?
-        // Do a test outside the lock - only dataVaersion can change and that increases.
-        // If "read commited transactions" not allowed, the data has changed in a way we
-        // do no twish to expose.
-        // If this test fails outside the lock it will fail inside.
-        // If it passes, we have to test again in case there is an active writer.
-        
-        boolean readCommittedPromotion = transaction.getTxnType() == TxnType.READ_COMMITTED_PROMOTE;
-        return promoteTxn$(transaction, readCommittedPromotion);
-    }
-    
     /** Attempt to promote a transaction from READ mode to WRITE mode based.
      *  Whether intevening commits are seen is determined by the boolean flag.
      * Return true if the transaction is already a writer.
@@ -602,7 +563,8 @@ public class TransactionCoordinator {
     /*package*/ boolean promoteTxn(Transaction transaction, boolean readCommittedPromotion) {
         if ( transaction.getMode() == ReadWrite.WRITE )
             return true ;
-        // XXX Not sure what the right choice is.
+        // While this code allows promotion of TxnType.READ, this ability is usually rejected
+        // by the transaction system around it. e.g. TransactionalBase.
         if ( transaction.getTxnType() == TxnType.READ )
             throw new TransactionException("promote: can't promote a READ transaction") ;
         return promoteTxn$(transaction, readCommittedPromotion);
@@ -680,6 +642,9 @@ public class TransactionCoordinator {
         return true;
     }
     
+    /** Whether to wait for writers when trying to promote */
+    private static final boolean promotionWaitForWriters = true;
+
     private boolean promotionWaitForWriters() {
         if ( promotionWaitForWriters )
             return acquireWriterLock(true) ;
@@ -841,4 +806,3 @@ public class TransactionCoordinator {
 
     public long countFinished()     { return countFinished.get() ; }
 }
-

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
index 5dd6e86..1f1266f 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/TransactionalBase.java
@@ -20,7 +20,6 @@ package org.apache.jena.dboe.transaction.txn;
 
 import java.util.Objects ;
 
-import org.apache.jena.atlas.lib.InternalErrorException;
 import org.apache.jena.atlas.lib.Lib;
 import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.query.ReadWrite ;
@@ -95,12 +94,12 @@ public class TransactionalBase implements TransactionalSystem {
         if ( trackAttachDetach )
             Log.info(this,  "<< attach");
     } 
-    
-  @Override
-  public final void begin(ReadWrite readWrite) { 
-      begin(TxnType.convert(readWrite));
-  }
-    
+
+    @Override
+    public final void begin(ReadWrite readWrite) { 
+        begin(TxnType.convert(readWrite));
+    }
+
     @Override
     public final void begin(TxnType txnType) {
         Objects.nonNull(txnType) ;
@@ -109,21 +108,18 @@ public class TransactionalBase implements TransactionalSystem {
         Transaction transaction = txnMgr.begin(txnType) ;
         theTxn.set(transaction) ;
     }
-    
+
     @Override
     public final boolean promote() {
-        checkActive() ;
-        Transaction txn = getValidTransaction() ;
-        return txn.promote() ;
+        checkActive();
+        return TransactionalSystem.super.promote();
     }
 
+    
     @Override
-    public final boolean promote(TxnType txnType) {
+    public final boolean promote(Promote promoteMode) {
         checkActive() ;
-        if ( txnType != TxnType.READ_COMMITTED_PROMOTE && 
-             txnType != TxnType.READ_PROMOTE )
-           throw new InternalErrorException("Transaction type is not "+TxnType.READ_PROMOTE+ " nor "+TxnType.READ_COMMITTED_PROMOTE);
-        boolean readCommitted = (txnType == TxnType.READ_COMMITTED_PROMOTE) ;
+        boolean readCommitted = (promoteMode == Promote.READ_COMMITTED);
         Transaction txn = getValidTransaction() ;
         return txn.promote(readCommitted) ;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle.java b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle.java
index 72230a0..85baebd 100644
--- a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle.java
+++ b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle.java
@@ -234,9 +234,8 @@ public class TestTransactionLifecycle extends AbstractTestTxn {
     
     @Test public void txn_read_promote_commit() {
         unit.begin(TxnType.READ);
-        try { unit.promote(); fail(); }
-        // Exception is correct - it is illegal to call promote in a TxnType.READ 
-        catch (TransactionException ex) { /* Expected : can continue */ }
+        boolean b = unit.promote();
+        assertFalse(b);
         unit.end() ;
         checkClear() ;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle2.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle2.java b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle2.java
index 4fe50a2..94c38f1 100644
--- a/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle2.java
+++ b/jena-db/jena-dboe-transaction/src/test/java/org/apache/jena/dboe/transaction/TestTransactionLifecycle2.java
@@ -191,18 +191,25 @@ public class TestTransactionLifecycle2 {
         checkClear() ;
     }
     
-    @Test(expected=TransactionException.class)
+    @Test
     public void txn_promote_3() {
         Transaction txn1 = txnMgr.begin(TxnType.READ) ;
         boolean b = txn1.promote() ;
-        assertTrue(b) ;
+        assertFalse(b) ;
         b = txn1.promote() ;
-        assertTrue(b) ;
-        // Exception - now a writer
+        assertFalse(b) ;
+        // Not a writer
         txn1.end() ;
         checkClear() ;
     }
 
+    @Test(expected=TransactionException.class)
+    public void txn_promote_4() {
+        Transaction txn1 = txnMgr.begin(TxnType.READ) ;
+        txn1.end() ;
+        txn1.promote();
+    }
+
     //Not a @Test
     public void txn_promote_deadlock() {
         Transaction txn1 = txnMgr.begin(TxnType.READ) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/5f99f5f3/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/setup/AbstractTDBBuilder.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/setup/AbstractTDBBuilder.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/setup/AbstractTDBBuilder.java
index eb78123..6bcb2f5 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/setup/AbstractTDBBuilder.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/setup/AbstractTDBBuilder.java
@@ -36,7 +36,7 @@ import org.apache.jena.dboe.transaction.txn.journal.Journal;
 import org.apache.jena.sparql.engine.main.QC;
 import org.apache.jena.sparql.engine.optimizer.reorder.ReorderLib;
 import org.apache.jena.tdb2.TDBException;
-import org.apache.jena.tdb2.solver.OpExecutorTDB1;
+import org.apache.jena.tdb2.solver.OpExecutorTDB2;
 import org.apache.jena.tdb2.store.*;
 import org.apache.jena.tdb2.store.nodetable.NodeTable;
 import org.apache.jena.tdb2.store.nodetable.NodeTableCache;
@@ -103,7 +103,7 @@ public abstract class AbstractTDBBuilder {
         DatasetGraphTxn dsg = new DatasetGraphTDB(trans, 
                                                   tripleTable, quadTable, prefixes, 
                                                   ReorderLib.fixed(), location, params);
-        QC.setFactory(dsg.getContext(), OpExecutorTDB1.OpExecFactoryTDB);
+        QC.setFactory(dsg.getContext(), OpExecutorTDB2.OpExecFactoryTDB);
         txnCoord.start();
         return dsg;
     }


[5/5] jena git commit: JENA-1483: Merge commit 'refs/pull/355/head' of https://github.com/apache/jena

Posted by an...@apache.org.
JENA-1483: Merge commit 'refs/pull/355/head' of https://github.com/apache/jena

This closes #355.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/48c6dc64
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/48c6dc64
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/48c6dc64

Branch: refs/heads/master
Commit: 48c6dc64539c4af3427017a656993f5e034728e4
Parents: cfad342 e44ca81
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Feb 12 08:52:15 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Feb 12 08:52:15 2018 +0000

----------------------------------------------------------------------
 .../java/org/apache/jena/query/TxnType.java     |   7 +
 .../jena/sparql/core/DatasetGraphMap.java       |   2 +-
 .../jena/sparql/core/DatasetGraphMapLink.java   |   2 +-
 .../jena/sparql/core/DatasetGraphOne.java       |   2 +-
 .../jena/sparql/core/DatasetGraphSink.java      |   2 +-
 .../sparql/core/DatasetGraphTrackActive.java    |   6 +-
 .../jena/sparql/core/DatasetGraphWithLock.java  |   2 +-
 .../jena/sparql/core/DatasetGraphWrapper.java   |   4 +
 .../jena/sparql/core/DatasetGraphZero.java      |   2 +-
 .../apache/jena/sparql/core/DatasetImpl.java    |   6 +-
 .../apache/jena/sparql/core/Transactional.java  |  73 ++-
 .../jena/sparql/core/TransactionalLock.java     |   3 +-
 .../sparql/core/TransactionalNotSupported.java  |   5 +-
 .../core/TransactionalNotSupportedMixin.java    |  15 +-
 .../jena/sparql/core/TransactionalNull.java     |   5 +-
 .../sparql/core/mem/DatasetGraphInMemory.java   |  30 +-
 .../engine/QueryEngineFactoryWrapper.java       |   8 +-
 .../sparql/util/DifferenceDatasetGraph.java     |   2 +-
 .../jena/sparql/util/DyadicDatasetGraph.java    |  30 +-
 .../java/org/apache/jena/system/TxnCounter.java |  10 +-
 .../org/apache/jena/sparql/ARQTestSuite.java    |   5 +-
 .../jena/sparql/core/DatasetGraphSimpleMem.java | 227 ++++----
 .../jena/sparql/graph/TestGraphUnionRead.java   | 149 +++---
 .../AbstractTestTransactionLifecycle.java       | 523 +++++++++++--------
 .../sparql/util/TestDyadicDatasetGraph.java     |  66 ++-
 .../main/java/org/apache/jena/shared/Lock.java  |   2 +-
 .../java/org/apache/jena/system/JenaSystem.java |   2 +-
 .../jena/dboe/transaction/txn/Transaction.java  |  17 +-
 .../transaction/txn/TransactionCoordinator.java |  70 +--
 .../dboe/transaction/txn/TransactionalBase.java |  24 +-
 .../transaction/TestTransactionLifecycle.java   |   5 +-
 .../transaction/TestTransactionLifecycle2.java  |  15 +-
 .../jena/tdb2/setup/AbstractTDBBuilder.java     |   4 +-
 .../apache/jena/tdb2/solver/OpExecutorTDB1.java | 428 ---------------
 .../apache/jena/tdb2/solver/OpExecutorTDB2.java | 428 +++++++++++++++
 .../jena/tdb2/store/DatasetGraphSwitchable.java |   3 +-
 .../apache/jena/tdb2/store/DatasetGraphTDB.java |  13 +-
 .../jena/tdb2/store/DatasetGraphWrapperTxn.java |  34 --
 .../jena/tdb2/store/GraphViewSwitchable.java    |  20 +-
 .../apache/jena/tdb2/store/TestDatasetTDB.java  |   7 +
 .../jena/rdfconnection/RDFConnectionLocal.java  |   2 +-
 .../rdfconnection/RDFConnectionModular.java     |   2 +-
 .../jena/rdfconnection/RDFConnectionRemote.java |   2 +-
 .../apache/jena/sdb/store/DatasetGraphSDB.java  |   2 +-
 .../apache/jena/tdb/store/DatasetGraphTDB.java  |   2 +-
 .../transaction/DatasetGraphTransaction.java    |  17 +-
 .../tdb/transaction/TransactionManager.java     |  22 +-
 pom.xml                                         |   1 +
 48 files changed, 1222 insertions(+), 1086 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/48c6dc64/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
----------------------------------------------------------------------
diff --cc jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
index 3ee9228,dc6a7f2..7e115e8
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetImpl.java
@@@ -125,14 -115,12 +125,14 @@@ public class DatasetImpl implements Dat
      }
  
      @Override
-     public boolean promote() {
+     public boolean promote(Promote txnType) {
 +        checkTransactional();
-         return transactional.promote();
+         return transactional.promote(txnType);
      }
 -    
 +
      @Override
      public ReadWrite transactionMode() {
 +        checkTransactional();
          return transactional.transactionMode();
      }
  
@@@ -170,7 -168,7 +170,7 @@@
          if ( ! supportsTransactions() )
              throw new UnsupportedOperationException("Transactions not supported") ;
      }
--    
++
      @Override
      public DatasetGraph asDatasetGraph() { return dsg ; }
  

http://git-wip-us.apache.org/repos/asf/jena/blob/48c6dc64/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
----------------------------------------------------------------------


[4/5] jena git commit: JENA-1478: Fix for contains(g,s,p,o)

Posted by an...@apache.org.
JENA-1478: Fix for contains(g,s,p,o)


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

Branch: refs/heads/master
Commit: e44ca811387b457b9bf1227ca87f07c6ac6fecf2
Parents: 5f99f5f
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Feb 9 21:54:24 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Feb 9 21:54:24 2018 +0000

----------------------------------------------------------------------
 .../java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/e44ca811/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
index 6dbdfad..db165e5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
@@ -61,7 +61,7 @@ public class DifferenceDatasetGraph extends DyadicDatasetGraph {
 
 	@Override
 	public boolean contains(Node g, Node s, Node p, Node o) {
-	    return both(dsg -> dsg.contains(g, s, p, o));
+	    return getLeft().contains(g, s, p, o) && ! getRight().contains(g, s, p, o);
 	}
 
 	@Override