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 2016/09/09 15:00:28 UTC

[2/4] jena git commit: JENA-1231: Modernize executeInTransaction.

JENA-1231: Modernize executeInTransaction.

Use execute/calculate style naming in Txn.


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

Branch: refs/heads/master
Commit: 976625b9bf81dd9158e2921c1cf0f09f0f6b2e4f
Parents: 9d5f675
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Sep 8 16:38:02 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Sep 9 12:23:39 2016 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/jena/system/Txn.java   |  8 +--
 .../java/org/apache/jena/system/TestTxn.java    | 52 ++++++++++----------
 .../apache/jena/system/TestTxnLifecycle.java    | 24 ++++-----
 .../org/apache/jena/system/TestTxnThread.java   |  4 +-
 .../apache/jena/graph/TransactionHandler.java   | 43 +++++++++++-----
 .../jena/graph/impl/TransactionHandlerBase.java | 51 ++++++++++++++-----
 .../java/org/apache/jena/rdf/model/Model.java   | 26 +++++++---
 .../apache/jena/rdf/model/impl/ModelCom.java    | 17 +++++++
 .../graph/TransactionHandlerContractTest.java   | 52 ++++++++++++++------
 .../jena/graph/test/AbstractTestGraph.java      | 18 +++----
 .../jena/rdf/model/test/AbstractTestModel.java  | 15 +++---
 .../apache/jena/rdf/model/test/TestModel.java   | 19 ++-----
 .../org/apache/jena/fuseki/cmd/FusekiCmd.java   |  2 +-
 .../fuseki/embedded/TestEmbeddedFuseki.java     |  4 +-
 .../jena/sdb/graph/TransactionHandlerSDB.java   | 26 ++--------
 .../org/apache/jena/sdb/sql/SDBConnection.java  | 13 ++++-
 .../jena/tdb/transaction/TestTransControl.java  | 20 ++++----
 .../jena/tdb/transaction/TestTransPromote.java  |  4 +-
 18 files changed, 235 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-arq/src/main/java/org/apache/jena/system/Txn.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/system/Txn.java b/jena-arq/src/main/java/org/apache/jena/system/Txn.java
index 5db5e6c..4aa3527 100644
--- a/jena-arq/src/main/java/org/apache/jena/system/Txn.java
+++ b/jena-arq/src/main/java/org/apache/jena/system/Txn.java
@@ -34,7 +34,7 @@ import org.apache.jena.sparql.core.Transactional ;
 
 public class Txn {
     /** Execute the Runnable in a read transaction. */
-    public static <T extends Transactional> void execRead(T txn, Runnable r) {
+    public static <T extends Transactional> void executeRead(T txn, Runnable r) {
         boolean b = txn.isInTransaction() ;
         if ( !b )
             txn.begin(ReadWrite.READ) ;
@@ -48,7 +48,7 @@ public class Txn {
     }
     
     /** Execute and return a value in a read transaction */
-    public static <T extends Transactional, X> X execReadRtn(T txn, Supplier<X> r) {
+    public static <T extends Transactional, X> X calculateRead(T txn, Supplier<X> r) {
         boolean b = txn.isInTransaction() ;
         if ( !b )
             txn.begin(ReadWrite.READ) ;
@@ -64,7 +64,7 @@ public class Txn {
     }
 
     /** Execute the Runnable in a write transaction */
-    public static <T extends Transactional> void execWrite(T txn, Runnable r) {
+    public static <T extends Transactional> void executeWrite(T txn, Runnable r) {
         boolean b = txn.isInTransaction() ;
         if ( !b )
             txn.begin(ReadWrite.WRITE) ;
@@ -82,7 +82,7 @@ public class Txn {
     }
 
     /** Execute and return a value in a write transaction. */
-    public static <T extends Transactional, X> X execWriteRtn(Transactional txn, Supplier<X> r) {
+    public static <T extends Transactional, X> X calculateWrite(Transactional txn, Supplier<X> r) {
         boolean b = txn.isInTransaction() ;
         if ( !b )
             txn.begin(ReadWrite.WRITE) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java b/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
index d9a9546..2ef2718 100644
--- a/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
+++ b/jena-arq/src/test/java/org/apache/jena/system/TestTxn.java
@@ -31,14 +31,14 @@ public class TestTxn {
     @Test public void txn_basic_01() {
         long v1 = counter.get() ;
         assertEquals(0, v1) ;
-        Txn.execRead(counter, () -> {
+        Txn.executeRead(counter, () -> {
             assertEquals(0, counter.get()) ;
         }) ;
     }
 
     @Test public void txn_basic_02() {
         long x = 
-            Txn.execReadRtn(counter, () -> {
+            Txn.calculateRead(counter, () -> {
                 assertEquals("In R, value()", 0, counter.value()) ;
                 assertEquals("In R, get()", 0, counter.get()) ;
                 return counter.get() ;
@@ -47,9 +47,9 @@ public class TestTxn {
     }
 
     @Test public void txn_basic_03() {
-        Txn.execWrite(counter, counter::inc) ;
+        Txn.executeWrite(counter, counter::inc) ;
         long x = 
-            Txn.execReadRtn(counter, () -> {
+            Txn.calculateRead(counter, () -> {
                 assertEquals("In R, value()", 1, counter.value()) ;
                 assertEquals("In R, get()", 1, counter.get()) ;
                 return counter.get() ;
@@ -59,7 +59,7 @@ public class TestTxn {
 
     @Test public void txn_basic_05() {
         long x = 
-            Txn.execWriteRtn(counter, () -> {
+            Txn.calculateWrite(counter, () -> {
                 counter.inc() ;
                 assertEquals("In W, value()", 0, counter.value()) ;
                 assertEquals("In W, get()",1, counter.get()) ;
@@ -70,7 +70,7 @@ public class TestTxn {
 
     @Test public void txn_write_01() {
         long x = 
-            Txn.execWriteRtn(counter, () -> {
+            Txn.calculateWrite(counter, () -> {
                 counter.inc() ;
                 assertEquals("In W, value()", 0, counter.value()) ;
                 assertEquals("In W, get()",1, counter.get()) ;
@@ -83,7 +83,7 @@ public class TestTxn {
 
     @Test public void txn_write_02() {
         long x = 
-            Txn.execWriteRtn(counter, () -> {
+            Txn.calculateWrite(counter, () -> {
                 counter.inc() ;
                 assertEquals("In W, value()", 0, counter.value()) ;
                 assertEquals("In W, get()",1, counter.get()) ;
@@ -95,7 +95,7 @@ public class TestTxn {
     }
     
     @Test public void txn_write_03() {
-        Txn.execWrite(counter, () -> {
+        Txn.executeWrite(counter, () -> {
             counter.inc() ;
             assertEquals("In W, value()", 0, counter.value()) ;
             assertEquals("In W, get()",1, counter.get()) ;
@@ -105,7 +105,7 @@ public class TestTxn {
     }
 
     @Test public void txn_write_04() {
-        Txn.execWrite(counter, () -> {
+        Txn.executeWrite(counter, () -> {
             counter.inc() ;
             assertEquals("In W, value()", 0, counter.value()) ;
             assertEquals("In W, get()",1, counter.get()) ;
@@ -117,7 +117,7 @@ public class TestTxn {
     @Test public void txn_rw_1() {
         assertEquals(0, counter.get()) ;
         
-        Txn.execWrite(counter, () -> {
+        Txn.executeWrite(counter, () -> {
             counter.inc() ;
             assertEquals("In W, value()", 0, counter.value()) ;
             assertEquals("In W, get()",1, counter.get()) ;
@@ -126,19 +126,19 @@ public class TestTxn {
         assertEquals("Direct value()", 1, counter.value()) ;
         assertEquals("Direct get()", 1, counter.get()) ;
 
-        Txn.execRead(counter, () -> {
+        Txn.executeRead(counter, () -> {
             assertEquals("In R, value()", 1, counter.value()) ;
             assertEquals("In R, get()", 1, counter.get()) ;
         }) ;
     }
     
     @Test public void txn_rw_2() {
-        Txn.execRead(counter, () -> {
+        Txn.executeRead(counter, () -> {
             assertEquals("In R, value()", 0, counter.value()) ;
             assertEquals("In R, get()", 0, counter.get()) ;
         }) ;
 
-        Txn.execWrite(counter, () -> {
+        Txn.executeWrite(counter, () -> {
             counter.inc() ;
             assertEquals("In W, value()", 0, counter.value()) ;
             assertEquals("In W, get()",1, counter.get()) ;
@@ -147,20 +147,20 @@ public class TestTxn {
         assertEquals("Direct value()", 1, counter.get()) ;
         assertEquals("Direct get()", 1, counter.get()) ;
 
-        Txn.execRead(counter, () -> {
+        Txn.executeRead(counter, () -> {
             assertEquals("In R, value()", 1, counter.value()) ;
             assertEquals("In R, get()", 1, counter.get()) ;
         }) ;
     }
     
     @Test public void txn_continue_1() {
-        Txn.execWrite(counter, ()->counter.set(91)) ;
+        Txn.executeWrite(counter, ()->counter.set(91)) ;
         
-        Txn.execWrite(counter, ()-> {
+        Txn.executeWrite(counter, ()-> {
             assertEquals("In txn, value()", 91, counter.value()) ;
             assertEquals("In txn, read()", 91, counter.read()) ;
             counter.inc(); 
-            Txn.execWrite(counter, ()->{
+            Txn.executeWrite(counter, ()->{
                 assertEquals("In txn, value()", 91, counter.value()) ;
                 assertEquals("In txn, get()", 92, counter.read()) ;
                 }) ;
@@ -169,13 +169,13 @@ public class TestTxn {
     }
     
     @Test public void txn_continue_2() {
-        Txn.execWrite(counter, ()->counter.set(91)) ;
+        Txn.executeWrite(counter, ()->counter.set(91)) ;
         
-        Txn.execWrite(counter, ()-> {
+        Txn.executeWrite(counter, ()-> {
             assertEquals("In txn, value()", 91, counter.value()) ;
             assertEquals("In txn, read()", 91, counter.read()) ;
             counter.inc(); 
-            Txn.execWrite(counter, ()->{
+            Txn.executeWrite(counter, ()->{
                 assertEquals("In txn, value()", 91, counter.value()) ;
                 assertEquals("In txn, get()", 92, counter.read()) ;
                 counter.inc();
@@ -189,9 +189,9 @@ public class TestTxn {
     
     @Test(expected=ExceptionFromTest.class)
     public void txn_exception_01() {
-        Txn.execWrite(counter, counter::inc) ;
+        Txn.executeWrite(counter, counter::inc) ;
         
-        Txn.execWrite(counter, () -> {
+        Txn.executeWrite(counter, () -> {
             counter.inc() ;
             assertEquals("In W, value()", 1, counter.value()) ;
             assertEquals("In W, get()",2, counter.get()) ;
@@ -201,10 +201,10 @@ public class TestTxn {
     
     @Test
     public void txn_exception_02() {
-        Txn.execWrite(counter, ()->counter.set(8)) ;
+        Txn.executeWrite(counter, ()->counter.set(8)) ;
     
         try {
-            Txn.execWrite(counter, () -> {
+            Txn.executeWrite(counter, () -> {
                 counter.inc();
                 assertEquals("In W, value()", 8, counter.value());
                 assertEquals("In W, get()", 9, counter.get());
@@ -217,10 +217,10 @@ public class TestTxn {
 
     @Test
     public void txn_exception_03() {
-        Txn.execWrite(counter, ()->counter.set(9)) ;
+        Txn.executeWrite(counter, ()->counter.set(9)) ;
     
         try {
-            Txn.execRead(counter, () -> {
+            Txn.executeRead(counter, () -> {
                 assertEquals("In W, value()", 9, counter.value());
                 assertEquals("In W, get()", 9, counter.get());
                 throw new ExceptionFromTest();

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java b/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
index 3cfa82b..8be8ae9 100644
--- a/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
+++ b/jena-arq/src/test/java/org/apache/jena/system/TestTxnLifecycle.java
@@ -37,53 +37,53 @@ public class TestTxnLifecycle {
     private Transactional trans = TransactionalLock.createMRSW() ;
  
     @Test public void txn_lifecycle_01() {
-        Txn.execRead(trans, ()->{}) ;
+        Txn.executeRead(trans, ()->{}) ;
     }
     
     @Test public void txn_lifecycle_02() {
-        Txn.execWrite(trans, ()->{}) ;
+        Txn.executeWrite(trans, ()->{}) ;
     }
 
     @Test public void txn_lifecycle_03() {
-        int x = Txn.execReadRtn(trans, ()->4) ;
+        int x = Txn.calculateRead(trans, ()->4) ;
         assertEquals(4,x) ;
     }
 
     @Test public void txn_lifecycle_04() {
-        int x = Txn.execWriteRtn(trans, ()->5) ;
+        int x = Txn.calculateWrite(trans, ()->5) ;
         assertEquals(5,x) ;
     }
     
     @Test public void txn_lifecycle_05() {
-        int x = Txn.execWriteRtn(trans, ()-> {
+        int x = Txn.calculateWrite(trans, ()-> {
             // Continues outer transaction.
-            return Txn.execWriteRtn(trans, ()->56) ;
+            return Txn.calculateWrite(trans, ()->56) ;
         });
         assertEquals(56,x) ;
     }
     
     @Test(expected=ExceptionFromTest.class)
     public void txn_lifecycle_06() {
-        int x = Txn.execWriteRtn(trans, ()-> {
-            Txn.execWriteRtn(trans, ()-> {throw new ExceptionFromTest() ; }) ;
+        int x = Txn.calculateWrite(trans, ()-> {
+            Txn.calculateWrite(trans, ()-> {throw new ExceptionFromTest() ; }) ;
             return 45 ;
         });
         fail("Should not be here!") ;
     }
     
     @Test public void txn_lifecycle_07() {
-        Txn.execWrite(trans, ()->trans.commit()) ; 
+        Txn.executeWrite(trans, ()->trans.commit()) ; 
     }
     
     @Test public void txn_lifecycle_08() {
-        Txn.execWrite(trans, ()->trans.abort()) ; 
+        Txn.executeWrite(trans, ()->trans.abort()) ; 
     }
     
     @Test public void txn_lifecycle_09() {
-        Txn.execRead(trans, ()->trans.commit()) ; 
+        Txn.executeRead(trans, ()->trans.commit()) ; 
     }
     @Test public void txn_lifecycle_10() {
-        Txn.execRead(trans, ()->trans.abort()) ; 
+        Txn.executeRead(trans, ()->trans.abort()) ; 
     }
 
     static void async(Runnable runnable) {

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-arq/src/test/java/org/apache/jena/system/TestTxnThread.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/system/TestTxnThread.java b/jena-arq/src/test/java/org/apache/jena/system/TestTxnThread.java
index d5dc58d..d3bf4ec 100644
--- a/jena-arq/src/test/java/org/apache/jena/system/TestTxnThread.java
+++ b/jena-arq/src/test/java/org/apache/jena/system/TestTxnThread.java
@@ -59,7 +59,7 @@ public class TestTxnThread {
     
     @Test public void txnThread_11() {
         long x1 = counter.get() ;  
-        Txn.execWrite(counter, ()->{
+        Txn.executeWrite(counter, ()->{
             counter.inc();
             // Read the "before" state
             ThreadAction t = ThreadTxn.threadTxnRead(counter, ()->{ 
@@ -79,7 +79,7 @@ public class TestTxnThread {
             long z1 = counter.get() ;
             assertEquals("Thread", x1, z1) ;
         }) ;
-        Txn.execWrite(counter, ()->counter.inc()) ;
+        Txn.executeWrite(counter, ()->counter.inc()) ;
         t.run() ;
         long x2 = counter.get() ;
         assertEquals("after", x1+1, x2) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/main/java/org/apache/jena/graph/TransactionHandler.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/graph/TransactionHandler.java b/jena-core/src/main/java/org/apache/jena/graph/TransactionHandler.java
index ac3231f..1850333 100644
--- a/jena-core/src/main/java/org/apache/jena/graph/TransactionHandler.java
+++ b/jena-core/src/main/java/org/apache/jena/graph/TransactionHandler.java
@@ -18,45 +18,62 @@
 
 package org.apache.jena.graph;
 
-import org.apache.jena.shared.* ;
+import java.util.function.Supplier ;
+
+import org.apache.jena.shared.Command ;
 
 /**
     Preliminary interface for graphs supporting transactions.
     
  */
 public interface TransactionHandler
-    {
+{
     /**
         Does this handler support transactions at all?
-        
+
         @return true iff begin/abort/commit are implemented and make sense.
-    */
+     */
     boolean transactionsSupported();
-    
+
     /**
         If transactions are supported, begin a new transaction. If tranactions are
         not supported, or they are but this tranaction is nested and nested transactions
         are not supported, throw an UnsupportedOperationException.
-    */
+     */
     void begin();
-    
+
     /**
         If transactions are supported and there is a tranaction in progress, abort
         it. If transactions are not supported, or there is no transaction in progress,
         throw an UnsupportedOperationException.
-    */
+     */
     void abort();
-    
+
     /**
         If transactions are supported and there is a tranaction in progress, commit
         it. If transactions are not supported, , or there is no transaction in progress,
         throw an UnsupportedOperationException.
-   */
+     */
     void commit();
-    
+
+
+
     /**
         If transactions are supported, execute the command c within a transaction
         and return its result. If not, throw an UnsupportedOperationException.
-    */
+        @deprecated use {@link #execute(Runnable)} or {@link #calculate(Supplier)} 
+     */
     Object executeInTransaction( Command c );
-    }
+
+    /**
+     * Execute the runnable <code>action</code> within a transaction. If it completes normally,
+     * commit the transaction, otherwise abort the transaction.
+     */
+    void execute( Runnable action );
+
+    /**
+     * Execute the supplier <code>action</code> within a transaction. If it completes normally,
+     * commit the transaction and return the result, otherwise abort the transaction.
+     */
+    <T> T calculate( Supplier<T> action ) ;
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/main/java/org/apache/jena/graph/impl/TransactionHandlerBase.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/graph/impl/TransactionHandlerBase.java b/jena-core/src/main/java/org/apache/jena/graph/impl/TransactionHandlerBase.java
index 5f0191d..3c7b507 100644
--- a/jena-core/src/main/java/org/apache/jena/graph/impl/TransactionHandlerBase.java
+++ b/jena-core/src/main/java/org/apache/jena/graph/impl/TransactionHandlerBase.java
@@ -18,12 +18,16 @@
 
 package org.apache.jena.graph.impl;
 
-import org.apache.jena.graph.* ;
-import org.apache.jena.shared.* ;
+import java.util.function.Supplier ;
+
+import org.apache.jena.graph.TransactionHandler ;
+import org.apache.jena.shared.Command ;
+import org.apache.jena.shared.JenaException ;
 
 /**
- * A base for transaction handlers - all it does is provide the
- * canonical implementation of executeInTransaction.
+ * A base for transaction handlers; provide implementations of execute* operations
+ * using the fundamental begin-commit-abort. 
+ * (This class predates java8 default methods.) 
  */
 public abstract class TransactionHandlerBase implements TransactionHandler {
     public TransactionHandlerBase() {
@@ -36,21 +40,44 @@ public abstract class TransactionHandlerBase implements TransactionHandler {
      */
     @Override
     public Object executeInTransaction(Command c) {
+        return calculate( () -> c.execute() ) ;
+    }
+
+    /* Abort but don't let problems with the transaction system itself cause loss of the exception */ 
+    private void abort(Throwable e) {
+        try { abort() ; }
+        catch (Throwable th) { e.addSuppressed(th); }
+    }
+    
+    /**
+     * Execute the runnable <code>action</code> within a transaction. If it completes normally,
+     * commit the transaction, otherwise abort the transaction.
+     */
+    @Override
+    public void execute( Runnable action ) {
         begin() ;
-        Object result ;
         try {
-            result = c.execute() ;
+            action.run();
             commit() ;
-            return result ;
         }
         catch (JenaException e) { abort(e) ; throw e ; }
         catch (Throwable e)     { abort(e) ; throw new JenaException(e) ; }
     }
-
-    /* Abort but don't let problems with the transaction system itself cause loss of the exception */ 
-    private void abort(Throwable e) {
-        try { abort() ; }
-        catch (Throwable th) { e.addSuppressed(th); }
+    
+    /**
+     * Execute the supplier <code>action</code> within a transaction. If it completes normally,
+     * commit the transaction and return the result, otherwise abort the transaction.
+     */
+    @Override
+    public <T> T calculate( Supplier<T> action ) {
+        begin() ;
+        try {
+            T result = action.get() ;
+            commit() ;
+            return result ;
+        }
+        catch (JenaException e) { abort(e) ; throw e ; }
+        catch (Throwable e)     { abort(e) ; throw new JenaException(e) ; }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java b/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java
index 16109f0..c3ca922 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/Model.java
@@ -20,6 +20,7 @@ package org.apache.jena.rdf.model;
 
 import java.io.*;
 import java.util.*;
+import java.util.function.Supplier ;
 
 import org.apache.jena.datatypes.* ;
 import org.apache.jena.shared.* ;
@@ -897,13 +898,26 @@ public interface Model
 	 */
 	Model commit() ;
 
-    /**
-        Execute the command <code>cmd</code> inside a transaction. If it
-        completes, commit the transaction and return the result; if it fails
-        (by throwing an exception), abort the transaction and throw an
-        exception.
-    */
+	 /**
+        If transactions are supported, execute the command c within a transaction
+        and return its result. If not, throw an UnsupportedOperationException.
+        @deprecated use {@link #calculateInTxn(Supplier)} or migrate to {@link #executeInTxn(Runnable)}.  
+	  */
+	@Deprecated
     Object executeInTransaction( Command cmd );
+    
+    
+    /**
+     * Execute the runnable <code>action</code> within a transaction. If it completes normally,
+     * commit the transaction, otherwise abort the transaction.
+     */
+    void executeInTxn( Runnable action );
+
+    /**
+     * Execute the supplier <code>action</code> within a transaction. If it completes normally,
+     * commit the transaction and return the result, otherwise abort the transaction.
+     */
+    <T> T calculateInTxn( Supplier<T> action ) ;
 
 	/** Determine whether this model is independent.
 	 *

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java
index 5810f5a..2303321 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/ModelCom.java
@@ -21,6 +21,8 @@ package org.apache.jena.rdf.model.impl;
 import java.io.* ;
 import java.net.URL ;
 import java.util.* ;
+import java.util.function.Supplier ;
+
 import org.apache.jena.datatypes.DatatypeFormatException ;
 import org.apache.jena.datatypes.RDFDatatype ;
 import org.apache.jena.datatypes.TypeMapper ;
@@ -1329,6 +1331,7 @@ implements Model, PrefixMapping, Lock
      public Model commit() 
      { getTransactionHandler().commit(); return this; }
 
+     @SuppressWarnings("deprecation")
      @Override
      public Object executeInTransaction( Command cmd )
      { return getTransactionHandler().executeInTransaction( cmd ); }
@@ -1337,6 +1340,20 @@ implements Model, PrefixMapping, Lock
      { return getGraph().getTransactionHandler(); }
 
      @Override
+     public void executeInTxn( Runnable action ) {
+         getTransactionHandler().execute( action );
+     }
+
+     /**
+      * Execute the supplier <code>action</code> within a transaction. If it completes normally,
+      * commit the transaction and return the result, otherwise abort the transaction.
+      */
+     @Override
+     public <T> T calculateInTxn( Supplier<T> action ) {
+         return getTransactionHandler().calculate( action );
+     }
+     
+     @Override
      public boolean independent() 
      { return true; }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/test/java/org/apache/jena/graph/TransactionHandlerContractTest.java
----------------------------------------------------------------------
diff --git a/jena-core/src/test/java/org/apache/jena/graph/TransactionHandlerContractTest.java b/jena-core/src/test/java/org/apache/jena/graph/TransactionHandlerContractTest.java
index 8ffddbc..b8d592f 100644
--- a/jena-core/src/test/java/org/apache/jena/graph/TransactionHandlerContractTest.java
+++ b/jena-core/src/test/java/org/apache/jena/graph/TransactionHandlerContractTest.java
@@ -61,23 +61,26 @@ public class TransactionHandlerContractTest {
 	 * Test that Graphs have transaction support methods, and that if they fail
 	 * on some g they fail because they do not support the operation.
 	 */
-	@ContractTest
+	@SuppressWarnings("deprecation")
+    @ContractTest
 	public void testTransactionsExistAsPerTransactionSupported() {
-		Command cmd = new Command() {
-			@Override
-			public Object execute() {
-				return null;
-			}
-		};
+        // Write out explicitly
+        Command cmd = new Command() {
+               @Override
+               public Object execute() { return null; }
+           };
 
-		TransactionHandler th = getTransactionHandlerProducer().newInstance();
+        TransactionHandler th = getTransactionHandlerProducer().newInstance();
 
 		if (th.transactionsSupported()) {
 			th.begin();
 			th.abort();
 			th.begin();
 			th.commit();
-			th.executeInTransaction(cmd);
+            th.execute( ()->{} ) ;
+			th.calculate(()->null);
+			th.executeInTransaction(cmd) ;
+			th.executeInTransaction( ()->null ) ;
 		} else {
 			try {
 				th.begin();
@@ -97,14 +100,26 @@ public class TransactionHandlerContractTest {
 			}
 			/* */
 			try {
-				th.executeInTransaction(cmd);
+				th.execute(()->{});
 				fail("Should have thrown UnsupportedOperationException");
-			} catch (UnsupportedOperationException x) {
-			}
+			} catch (UnsupportedOperationException x) { }
+            try {
+                th.calculate(()->null);
+                fail("Should have thrown UnsupportedOperationException");
+            } catch (UnsupportedOperationException x) { }
+            try {
+                th.executeInTransaction(cmd);
+                fail("Should have thrown UnsupportedOperationException");
+            } catch (UnsupportedOperationException x) { }
+            try {
+                th.executeInTransaction(()->null);
+                fail("Should have thrown UnsupportedOperationException");
+            } catch (UnsupportedOperationException x) { }
 		}
 	}
 
-	@ContractTest
+	@SuppressWarnings("deprecation")
+    @ContractTest
 	public void testExecuteInTransactionCatchesThrowable() {
 		TransactionHandler th = getTransactionHandlerProducer().newInstance();
 
@@ -118,8 +133,15 @@ public class TransactionHandlerContractTest {
 			try {
 				th.executeInTransaction(cmd);
 				fail("Should have thrown JenaException");
-			} catch (JenaException x) {
-			}
+			} catch (JenaException x) { }
+			try {
+                th.execute(()-> { throw new Error() ; });
+                fail("Should have thrown JenaException");
+            } catch (JenaException x) { }
+            try {
+                th.calculate(()->{ throw new Error() ; });
+                fail("Should have thrown JenaException");
+            } catch (JenaException x) { }
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java
----------------------------------------------------------------------
diff --git a/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java b/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java
index 9f5deba..3e3612e 100644
--- a/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java
+++ b/jena-core/src/test/java/org/apache/jena/graph/test/AbstractTestGraph.java
@@ -275,21 +275,17 @@ public abstract class AbstractTestGraph extends GraphTestBase
         Command cmd = new Command() 
         { @Override
             public Object execute() { return null; } };
-            try { th.executeInTransaction( cmd ); } 
+            try { th.execute( ()->{} ); } 
             catch (UnsupportedOperationException x) {}
     }
 
-    public void testExecuteInTransactionCatchesThrowable()
-    {Graph g = getGraph();
-    TransactionHandler th = g.getTransactionHandler();
-    if (th.transactionsSupported())
-    {
-        Command cmd = new Command() 
-        { @Override
-            public Object execute() throws Error { throw new Error(); } };
-            try { th.executeInTransaction( cmd ); } 
+    public void testExecuteInTransactionCatchesThrowable() {
+        Graph g = getGraph();
+        TransactionHandler th = g.getTransactionHandler();
+        if (th.transactionsSupported()) {
+            try { th.execute( ()-> { throw new Error() ; } ); } 
             catch (JenaException x) {}
-    }
+        }
     }
 
     static final Triple [] tripleArray = tripleArray( "S P O; A R B; X Q Y" );

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/test/java/org/apache/jena/rdf/model/test/AbstractTestModel.java
----------------------------------------------------------------------
diff --git a/jena-core/src/test/java/org/apache/jena/rdf/model/test/AbstractTestModel.java b/jena-core/src/test/java/org/apache/jena/rdf/model/test/AbstractTestModel.java
index 99bb767..451f205 100644
--- a/jena-core/src/test/java/org/apache/jena/rdf/model/test/AbstractTestModel.java
+++ b/jena-core/src/test/java/org/apache/jena/rdf/model/test/AbstractTestModel.java
@@ -18,11 +18,11 @@
 
 package org.apache.jena.rdf.model.test;
 
-import org.apache.jena.graph.* ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.Triple ;
 import org.apache.jena.graph.test.NodeCreateUtils ;
 import org.apache.jena.rdf.model.* ;
 import org.apache.jena.rdf.model.impl.ModelCom ;
-import org.apache.jena.shared.* ;
 
 public abstract class AbstractTestModel extends ModelTestBase
     {
@@ -41,13 +41,10 @@ public abstract class AbstractTestModel extends ModelTestBase
     public void tearDown()
         { model.close(); } 
        
-    public void testTransactions()
-        { 
-        Command cmd = new Command() 
-        	{ @Override
-            public Object execute() { return null; } };
-        if (model.supportsTransactions()) model.executeInTransaction( cmd );
-        }
+    public void testTransactions() {
+        if ( model.supportsTransactions() )
+            model.executeInTxn(() -> {}) ;
+    }
         
     public void testCreateResourceFromNode()
         {

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestModel.java
----------------------------------------------------------------------
diff --git a/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestModel.java b/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestModel.java
index 973c169..986dffa 100644
--- a/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestModel.java
+++ b/jena-core/src/test/java/org/apache/jena/rdf/model/test/TestModel.java
@@ -25,7 +25,6 @@ import org.apache.jena.graph.test.NodeCreateUtils ;
 import org.apache.jena.rdf.model.* ;
 import org.apache.jena.rdf.model.test.helpers.ModelHelper ;
 import org.apache.jena.rdf.model.test.helpers.TestingModelFactory ;
-import org.apache.jena.shared.Command ;
 import org.apache.jena.test.JenaTestBase ;
 import org.junit.Assert;
 
@@ -229,20 +228,10 @@ public class TestModel extends AbstractModelTestBase
 		Assert.assertEquals(GraphTestBase.node("b"), s.getObject().asNode());
 	}
 
-	public void testTransactions()
-	{
-		final Command cmd = new Command() {
-			@Override
-			public Object execute()
-			{
-				return null;
-			}
-		};
-		if (model.supportsTransactions())
-		{
-			model.executeInTransaction(cmd);
-		}
-	}
+    public void testTransactions() {
+        if ( model.supportsTransactions() )
+            model.executeInTxn(() -> {}) ;
+    }
 
 	public void testURINodeAsResource()
 	{

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java
index b1db216..4be63b8 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java
@@ -243,7 +243,7 @@ public class FusekiCmd {
                 Lang language = RDFLanguages.filenameToLang(filename) ;
                 if ( language == null )
                     throw new CmdException("Can't guess language for file: " + filename) ;
-                Txn.execWrite(cmdLineConfig.dsg, ()->RDFDataMgr.read(cmdLineConfig.dsg, filename)) ;
+                Txn.executeWrite(cmdLineConfig.dsg, ()->RDFDataMgr.read(cmdLineConfig.dsg, filename)) ;
             }
 
             if ( contains(argMemTDB) ) {

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
index cbc0adb..581edaa 100644
--- a/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
+++ b/jena-fuseki2/jena-fuseki-embedded/src/test/java/org/apache/jena/fuseki/embedded/TestEmbeddedFuseki.java
@@ -103,7 +103,7 @@ public class TestEmbeddedFuseki {
         server.start() ;
         try {
             // Add while live.
-            Txn.execWrite(dsg,  ()->{
+            Txn.executeWrite(dsg,  ()->{
                 Quad q = SSE.parseQuad("(_ :s :p _:b)") ;
                 dsg.add(q); 
             }) ;
@@ -118,7 +118,7 @@ public class TestEmbeddedFuseki {
     
     @Test public void embedded_04() {
         DatasetGraph dsg = dataset() ;
-        Txn.execWrite(dsg,  ()->{
+        Txn.executeWrite(dsg,  ()->{
             Quad q = SSE.parseQuad("(_ :s :p _:b)") ;
             dsg.add(q); 
         }) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-sdb/src/main/java/org/apache/jena/sdb/graph/TransactionHandlerSDB.java
----------------------------------------------------------------------
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/graph/TransactionHandlerSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/graph/TransactionHandlerSDB.java
index d10aecb..efc73ef 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/graph/TransactionHandlerSDB.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/graph/TransactionHandlerSDB.java
@@ -21,22 +21,19 @@ package org.apache.jena.sdb.graph;
 import java.sql.Connection;
 import java.sql.SQLException;
 
-import org.apache.jena.graph.TransactionHandler ;
+import org.apache.jena.graph.impl.TransactionHandlerBase ;
 import org.apache.jena.sdb.SDBException ;
 import org.apache.jena.sdb.sql.SDBConnection ;
 import org.apache.jena.sdb.sql.SDBExceptionSQL ;
-import org.apache.jena.shared.Command ;
-import org.apache.jena.shared.JenaException ;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
-public class TransactionHandlerSDB implements TransactionHandler
+public class TransactionHandlerSDB extends TransactionHandlerBase
 {
     static private Logger log = LoggerFactory.getLogger(TransactionHandlerSDB.class) ;
 
-    Connection sqlConnection ;
-    boolean inTransaction ;
+    protected Connection sqlConnection ;
+    protected volatile boolean inTransaction ;
     
     public TransactionHandlerSDB(SDBConnection connection)
     { 
@@ -103,19 +100,4 @@ public class TransactionHandlerSDB implements TransactionHandler
 
     public void abortSilent()
     { try { abortFinally() ; } catch (SDBExceptionSQL ex) {} } 
-
-    
-    @Override
-    public Object executeInTransaction(Command c)
-    {
-        try {
-            begin() ;
-            Object result = c.execute();
-            commit();
-            return result;
-        } 
-        catch (SDBExceptionSQL e) { abortFinally() ; throw e ; } 
-        catch (JenaException e)   { abortFinally() ; throw e ; }
-        catch (Throwable e) { abortFinally() ; throw new SDBException(e) ; } // Pass Graph tests.
-    }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-sdb/src/main/java/org/apache/jena/sdb/sql/SDBConnection.java
----------------------------------------------------------------------
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/sql/SDBConnection.java b/jena-sdb/src/main/java/org/apache/jena/sdb/sql/SDBConnection.java
index 654626f..006d586 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/sql/SDBConnection.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/sql/SDBConnection.java
@@ -27,6 +27,7 @@ import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.List;
+import java.util.function.Supplier ;
 
 import javax.sql.DataSource;
 
@@ -136,7 +137,17 @@ public class SDBConnection
         { throw ex ; }
     }
 
-    public Object executeInTransaction(Command c) { return getTransactionHandler().executeInTransaction(c) ; }
+    public Object executeInTransaction(Command c) {
+        return getTransactionHandler().executeInTransaction(c) ;
+    }
+
+    public void execute(Runnable action) {
+        getTransactionHandler().execute(action) ;
+    }
+
+    public <T> T executeRtn(Supplier<T> action) {
+        return getTransactionHandler().calculate(action) ;
+    }
     
     public Object executeSQL(final SQLCommand c)
     {

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransControl.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransControl.java b/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransControl.java
index 3a597346..385f181 100644
--- a/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransControl.java
+++ b/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransControl.java
@@ -106,7 +106,7 @@ public class TestTransControl {
         DatasetGraph dsg = create() ;
         TransactionManager tMgr = TDBInternal.getTransactionManager(dsg) ;
 
-        Txn.execWrite(dsg,  ()->{});    // About 20 bytes.
+        Txn.executeWrite(dsg,  ()->{});    // About 20 bytes.
         assertEquals(1, tMgr.getQueueLength()) ;
     }
     
@@ -131,7 +131,7 @@ public class TestTransControl {
         DatasetGraph dsg = create() ;
         TransactionManager tMgr = TDBInternal.getTransactionManager(dsg) ;
         
-        Txn.execWrite(dsg,  ()->{});    // About 20 bytes.
+        Txn.executeWrite(dsg,  ()->{});    // About 20 bytes.
         assertEquals(1, tMgr.getQueueLength()) ;
         txnAddData(dsg) ;
         assertEquals(0, tMgr.getQueueLength()) ;
@@ -145,9 +145,9 @@ public class TestTransControl {
         DatasetGraph dsg = create() ;
         TransactionManager tMgr = TDBInternal.getTransactionManager(dsg) ;
 
-        Txn.execWrite(dsg,  ()->{});
+        Txn.executeWrite(dsg,  ()->{});
         assertEquals(0, tMgr.getQueueLength()) ;
-        Txn.execWrite(dsg,  ()->{});
+        Txn.executeWrite(dsg,  ()->{});
         assertEquals(0, tMgr.getQueueLength()) ;
     }
 
@@ -157,9 +157,9 @@ public class TestTransControl {
         DatasetGraph dsg = create() ;
         TransactionManager tMgr = TDBInternal.getTransactionManager(dsg) ;
 
-        Txn.execWrite(dsg,  ()->{});
+        Txn.executeWrite(dsg,  ()->{});
         assertEquals(1, tMgr.getQueueLength()) ;
-        Txn.execWrite(dsg,  ()->{});
+        Txn.executeWrite(dsg,  ()->{});
         assertEquals(0, tMgr.getQueueLength()) ;
     }
 
@@ -185,9 +185,9 @@ public class TestTransControl {
         DatasetGraph dsg = create() ;
         TransactionManager tMgr = TDBInternal.getTransactionManager(dsg) ;
 
-        Txn.execWrite(dsg,  ()->{});
+        Txn.executeWrite(dsg,  ()->{});
         assertEquals(1, tMgr.getQueueLength()) ;
-        Txn.execWrite(dsg,  ()->{});
+        Txn.executeWrite(dsg,  ()->{});
         assertEquals(0, tMgr.getQueueLength()) ;
     }
     
@@ -201,13 +201,13 @@ public class TestTransControl {
         assertEquals(1, tMgr.getQueueLength()) ;
         txnAddData(dsg) ;
         assertEquals(2, tMgr.getQueueLength()) ;
-        Txn.execWrite(dsg,  ()->{});
+        Txn.executeWrite(dsg,  ()->{});
         assertEquals(0, tMgr.getQueueLength()) ;
     }
 
     private static void txnAddData(DatasetGraph dsg) {
         // Unique blank node.
         Quad q = SSE.parseQuad("(_ _:b :p 1)") ;
-        Txn.execWrite(dsg,  ()->dsg.add(q));
+        Txn.executeWrite(dsg,  ()->dsg.add(q));
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/976625b9/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransPromote.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransPromote.java b/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransPromote.java
index d264aa8..1d1d686 100644
--- a/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransPromote.java
+++ b/jena-tdb/src/test/java/org/apache/jena/tdb/transaction/TestTransPromote.java
@@ -199,7 +199,7 @@ public class TestTransPromote {
         Semaphore sema = new Semaphore(0) ;
         Thread t = new Thread(() -> {
             sema.release() ;
-            Txn.execWrite(dsg, () -> dsg.add(q3)) ;
+            Txn.executeWrite(dsg, () -> dsg.add(q3)) ;
             sema.release() ;
         }) ;
 
@@ -255,7 +255,7 @@ public class TestTransPromote {
         dsg.add(q2) ;
         dsg.commit() ;
         dsg.end() ;
-        Txn.execRead(dsg, () -> {
+        Txn.executeRead(dsg, () -> {
             long x = Iter.count(dsg.find()) ;
             assertEquals(2, x) ;
         }) ;