From 976625b9bf81dd9158e2921c1cf0f09f0f6b2e4f Mon Sep 17 00:00:00 2001 From: Andy Seaborne Date: Thu, 8 Sep 2016 16:38:02 +0100 Subject: [PATCH] JENA-1231: Modernize executeInTransaction. Use execute/calculate style naming in Txn. --- .../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 ++++++++++----- .../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 +++---- .../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 ++-------- .../apache/jena/sdb/sql/SDBConnection.java | 13 ++++- .../tdb/transaction/TestTransControl.java | 20 +++---- .../tdb/transaction/TestTransPromote.java | 4 +- 18 files changed, 235 insertions(+), 163 deletions(-) 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 5db5e6c58ff..4aa3527e9ba 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 @@ public class Txn { /** Execute the Runnable in a read transaction. */ - public static void execRead(T txn, Runnable r) { + public static void executeRead(T txn, Runnable r) { boolean b = txn.isInTransaction() ; if ( !b ) txn.begin(ReadWrite.READ) ; @@ -48,7 +48,7 @@ public static void execRead(T txn, Runnable r) { } /** Execute and return a value in a read transaction */ - public static X execReadRtn(T txn, Supplier r) { + public static X calculateRead(T txn, Supplier r) { boolean b = txn.isInTransaction() ; if ( !b ) txn.begin(ReadWrite.READ) ; @@ -64,7 +64,7 @@ public static X execReadRtn(T txn, Supplier r) { } /** Execute the Runnable in a write transaction */ - public static void execWrite(T txn, Runnable r) { + public static void executeWrite(T txn, Runnable r) { boolean b = txn.isInTransaction() ; if ( !b ) txn.begin(ReadWrite.WRITE) ; @@ -82,7 +82,7 @@ public static void execWrite(T txn, Runnable r) { } /** Execute and return a value in a write transaction. */ - public static X execWriteRtn(Transactional txn, Supplier r) { + public static X calculateWrite(Transactional txn, Supplier r) { boolean b = txn.isInTransaction() ; if ( !b ) txn.begin(ReadWrite.WRITE) ; 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 d9a9546c868..2ef2718bab4 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 void txn_exception_01() { @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 void txn_exception_02() { @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(); 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 3cfa82b91bd..8be8ae9b827 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) { 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 d5dc58d6a89..d3bf4ec711c 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 void txnThread_3() { @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 void txnThread_3() { 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) ; 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 ac3231f11cf..18503335ac0 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 action within a transaction. If it completes normally, + * commit the transaction, otherwise abort the transaction. + */ + void execute( Runnable action ); + + /** + * Execute the supplier action within a transaction. If it completes normally, + * commit the transaction and return the result, otherwise abort the transaction. + */ + T calculate( Supplier action ) ; +} 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 5f0191daa85..3c7b50719bc 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 TransactionHandlerBase() { */ @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 action 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 action within a transaction. If it completes normally, + * commit the transaction and return the result, otherwise abort the transaction. + */ + @Override + public T calculate( Supplier 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) ; } } } 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 16109f0bd11..c3ca9226f1f 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 @@ 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 @@ Remove all reifications (ie implicit reification quads) of _s_. */ Model commit() ; - /** - Execute the command cmd 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 action within a transaction. If it completes normally, + * commit the transaction, otherwise abort the transaction. + */ + void executeInTxn( Runnable action ); + + /** + * Execute the supplier action within a transaction. If it completes normally, + * commit the transaction and return the result, otherwise abort the transaction. + */ + T calculateInTxn( Supplier action ) ; /** Determine whether this model is independent. * 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 5810f5a43fa..2303321d50a 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 @@ 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 @@ public Model abort() public Model commit() { getTransactionHandler().commit(); return this; } + @SuppressWarnings("deprecation") @Override public Object executeInTransaction( Command cmd ) { return getTransactionHandler().executeInTransaction( cmd ); } @@ -1336,6 +1339,20 @@ public Object executeInTransaction( Command cmd ) private TransactionHandler getTransactionHandler() { return getGraph().getTransactionHandler(); } + @Override + public void executeInTxn( Runnable action ) { + getTransactionHandler().execute( action ); + } + + /** + * Execute the supplier action within a transaction. If it completes normally, + * commit the transaction and return the result, otherwise abort the transaction. + */ + @Override + public T calculateInTxn( Supplier action ) { + return getTransactionHandler().calculate( action ); + } + @Override public boolean independent() { return true; } 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 8ffddbc5927..b8d592f2b03 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 @@ protected IProducer getTransactionHandlerProducer() { * 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 Object execute() { } /* */ 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 Object execute() throws Error { 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) { } } } 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 9f5deba6635..3e3612eaf06 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 void testHasTransactions() 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" ); 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 99bb76743d5..451f20553d4 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 void setUp() 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() { 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 973c169a7ef..986dffaf337 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.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 void testToStatement() 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() { 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 b1db2167606..4be63b8c5d7 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 @@ protected void processModulesAndArgs() { 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) ) { 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 cbc0adb7411..581edaa9140 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); }) ; 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 d10aecbd13e..efc73efd849 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 @@ 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 synchronized void abortFinally() 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. - } } 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 654626fc1ab..006d58629c5 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.SQLException; import java.sql.Statement; import java.util.List; +import java.util.function.Supplier ; import javax.sql.DataSource; @@ -136,7 +137,17 @@ public ResultSetJDBC execQuery(String sqlString, int fetchSize) throws SQLExcept { 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 executeRtn(Supplier action) { + return getTransactionHandler().calculate(action) ; + } public Object executeSQL(final SQLCommand c) { 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 3a597346622..385f1813a7e 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 @@ protected DatasetGraph create() { 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 @@ protected DatasetGraph create() { 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 @@ protected DatasetGraph create() { 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 @@ protected DatasetGraph create() { 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 @@ protected DatasetGraph create() { 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 @@ protected DatasetGraph create() { 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)); } } 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 d264aa87216..1d1d68650b4 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 @@ private void run_06(boolean b) { 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 @@ private void run_08(boolean b) { dsg.add(q2) ; dsg.commit() ; dsg.end() ; - Txn.execRead(dsg, () -> { + Txn.executeRead(dsg, () -> { long x = Iter.count(dsg.find()) ; assertEquals(2, x) ; }) ;