X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=test%2Fenterprise%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Ftest%2Ftransactions%2FSimpleTransactionManager.java;h=3ba4e8147c760e19d76a410e25f4ec1d3f1f0224;hb=ee7fa42171c628c71bf072131b4b67b79316129c;hp=ee8eb77dc08fb3d8a25ad5efb9bb154a86372750;hpb=099827f9fe35da8a3be1010a222e90db94f0b5c4;p=utils diff --git a/test/enterprise/src/main/java/org/wamblee/test/transactions/SimpleTransactionManager.java b/test/enterprise/src/main/java/org/wamblee/test/transactions/SimpleTransactionManager.java index ee8eb77d..3ba4e814 100644 --- a/test/enterprise/src/main/java/org/wamblee/test/transactions/SimpleTransactionManager.java +++ b/test/enterprise/src/main/java/org/wamblee/test/transactions/SimpleTransactionManager.java @@ -20,9 +20,43 @@ import java.util.List; import javax.transaction.UserTransaction; +import org.wamblee.general.ThreadSpecificProxyFactory; +import org.wamblee.test.persistence.JpaBuilder; + /** - * Simple transaction manager provides a simple mechanism to manage transaction + * + *

+ * Simple transaction manager provides a simple mechanism to manage transactions * in test code through the {@link UserTransaction} object. + * To construct the transaction manager use: + *

+ *
+ *      SimpleTransactionManager manager = 
+ *          new SimpleTransactionManager(new DefaultUserTransactionFactory());
+ * 
+ * + *

+ * Next, add resources to manage using {@link #addResource(TransactionResource)}: + *

+ *      manager.addResource(jpaTester.getJpaBuilder());
+ * 
+ *

+ * As you can see from the above, {@link JpaBuilder} is a resource that can be used + * so this mechanism can be used with JPA testing. + *

+ * + *

+ * The next step is to manage transactions using the standard UserTransaction + * APIs: + *

+ *
+ *      UserTransaction transaction = manager.getTransaction();
+ *      transaction.begin();
+ *     
+ *      ... do work...
+ *  
+ *      transaction.commit(); 
+ * 
* * @author Erik Brakkee * @@ -30,7 +64,7 @@ import javax.transaction.UserTransaction; public class SimpleTransactionManager { private UserTransactionFactory factory; - private ThreadLocal current; + private ThreadLocal transaction; private UserTransactionCallback callback; private List resources; @@ -42,12 +76,12 @@ public class SimpleTransactionManager { */ public SimpleTransactionManager(UserTransactionFactory aFactory) { factory = aFactory; - current = new ThreadLocal(); + transaction = new ThreadLocal(); callback = new UserTransactionCallback() { @Override public void transactionFinished() { - current.set(null); + transaction.set(null); } }; resources = new ArrayList(); @@ -65,16 +99,31 @@ public class SimpleTransactionManager { } /** - * Gets a transaction associated with the current thread. + * Gets the user transaction. This is a contextual reference, meaning that + * it will delegate to the appropriate thread-specific user transaction. + * It is also safe to store in a JNDI tree and for caching by applications. * * @return User transaction. */ public UserTransaction getTransaction() { - UserTransaction transaction = current.get(); - if (transaction == null) { - transaction = factory.create(callback, resources); - current.set(transaction); + return new AutoCreateUserTransaction(this); + } + + UserTransaction getOrCreateThreadSpecificTransaction() { + UserTransaction tx = transaction.get(); + if (tx == null) { + tx = factory.create(callback, resources); + transaction.set(tx); } - return transaction; + return tx; + } + + /** + * Gets the thread-specific transaction object. + * @return Transaction object. + */ + UserTransaction getThreadSpecificTransaction() { + getTransaction(); // create tx if needed + return transaction.get(); } }