ee8eb77dc08fb3d8a25ad5efb9bb154a86372750
[utils] / test / enterprise / src / main / java / org / wamblee / test / transactions / SimpleTransactionManager.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.test.transactions;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import javax.transaction.UserTransaction;
22
23 /**
24  * Simple transaction manager provides a simple mechanism to manage transaction
25  * in test code through the {@link UserTransaction} object.
26  * 
27  * @author Erik Brakkee
28  * 
29  */
30 public class SimpleTransactionManager {
31
32     private UserTransactionFactory factory;
33     private ThreadLocal<UserTransaction> current;
34     private UserTransactionCallback callback;
35     private List<TransactionResource> resources;
36
37     /**
38      * Constructs the transaction manager.
39      * 
40      * @param aFactory
41      *            Factory to create transactions with.
42      */
43     public SimpleTransactionManager(UserTransactionFactory aFactory) {
44         factory = aFactory;
45         current = new ThreadLocal<UserTransaction>();
46         callback = new UserTransactionCallback() {
47
48             @Override
49             public void transactionFinished() {
50                 current.set(null);
51             }
52         };
53         resources = new ArrayList<TransactionResource>();
54     }
55
56     /**
57      * Adds a resource to manage. Adding resources is no longer allowed after
58      * the first transaction has started.
59      * 
60      * @param aResource
61      *            Resource.
62      */
63     public void addResource(TransactionResource aResource) {
64         resources.add(aResource);
65     }
66
67     /**
68      * Gets a transaction associated with the current thread.
69      * 
70      * @return User transaction.
71      */
72     public UserTransaction getTransaction() {
73         UserTransaction transaction = current.get();
74         if (transaction == null) {
75             transaction = factory.create(callback, resources);
76             current.set(transaction);
77         }
78         return transaction;
79     }
80 }