001    package com.mockrunner.mock.ejb;
002    
003    import javax.transaction.HeuristicMixedException;
004    import javax.transaction.HeuristicRollbackException;
005    import javax.transaction.NotSupportedException;
006    import javax.transaction.RollbackException;
007    import javax.transaction.Status;
008    import javax.transaction.SystemException;
009    import javax.transaction.UserTransaction;
010    
011    /**
012     * Mock implementation of <code>UserTransaction</code>.
013     */
014    public class MockUserTransaction implements UserTransaction
015    {
016        private boolean beginCalled;
017        private boolean commitCalled;
018        private boolean rollbackCalled;
019        private boolean rollbackOnlyCalled;
020        private int transactionTimeout;
021        private int beginCalls;
022        private int commitCalls;
023        private int rollbackCalls;
024        private int rollbackOnlyCalls;
025        
026        public MockUserTransaction()
027        {
028            reset();
029        }
030        
031        /**
032         * Resets the state, i.e. sets the status to
033         * <code>Status.STATUS_NO_TRANSACTION</code>
034         * and the number of calls to 0.
035         */
036        public void reset()
037        {
038            beginCalled = false;
039            commitCalled = false;
040            rollbackCalled = false;
041            rollbackOnlyCalled = false;
042            transactionTimeout = 0;
043            beginCalls = 0;
044            commitCalls = 0;
045            rollbackCalls = 0;
046            rollbackOnlyCalls = 0;
047        }
048        
049        /**
050         * Returns if {@link #begin} was called.
051         * @return was {@link #begin} called
052         */
053        public boolean wasBeginCalled()
054        {
055            return beginCalled;
056        }
057        
058        /**
059         * Returns if {@link #commit} was called.
060         * @return was {@link #commit} called
061         */
062        public boolean wasCommitCalled()
063        {
064            return commitCalled;
065        }
066        
067        /**
068         * Returns if {@link #rollback} was called.
069         * @return was {@link #rollback} called
070         */
071        public boolean wasRollbackCalled()
072        {
073            return rollbackCalled;
074        }
075        
076        /**
077         * Returns if {@link #setRollbackOnly} was called.
078         * @return was {@link #setRollbackOnly} called
079         */
080        public boolean wasRollbackOnlyCalled()
081        {
082            return rollbackOnlyCalled;
083        }
084        
085        /**
086         * Returns the transaction timeout.
087         * @return the transaction timeout
088         */
089        public int getTransactionTimeout()
090        {
091            return transactionTimeout;
092        }
093        
094        /**
095         * Returns the number of overall {@link #begin} calls.
096         * @return the number of overall {@link #begin} calls
097         */
098        public int getNumberBeginCalls()
099        {
100            return beginCalls;
101        }
102        
103        /**
104         * Returns the number of overall {@link #commit} calls.
105         * @return the number of overall {@link #commit} calls
106         */
107        public int getNumberCommitCalls()
108        {
109            return commitCalls;
110        }
111        
112        /**
113         * Returns the number of overall {@link #rollback} calls.
114         * @return the number of overall {@link #rollback} calls
115         */
116        public int getNumberRollbackCalls()
117        {
118            return rollbackCalls;
119        }
120        
121        /**
122         * Returns the number of overall {@link #setRollbackOnly} calls.
123         * @return the number of overall {@link #setRollbackOnly} calls
124         */
125        public int getNumberRollbackOnlyCalls()
126        {
127            return rollbackOnlyCalls;
128        }
129        
130        /**
131         * Returns the status of this transaction.
132         * @return the status of this transaction
133         */
134        public int getStatus() throws SystemException
135        {
136            if(rollbackCalled) return Status.STATUS_ROLLEDBACK;
137            if(commitCalled) return Status.STATUS_COMMITTED;
138            if(rollbackOnlyCalled) return Status.STATUS_MARKED_ROLLBACK;
139            if(beginCalled) return Status.STATUS_ACTIVE;
140            return Status.STATUS_NO_TRANSACTION;
141        }
142        
143        /**
144         * Starts the transaction. The status will be
145         * <code>Status.STATUS_ACTIVE</code> and the
146         * flags regarding <code>wasXYZCalled</code>
147         * are reset to <code>false</code>. This method
148         * does not reset the number of overall calls.
149         */
150        public void begin() throws NotSupportedException, SystemException
151        {
152            beginCalled = true;
153            commitCalled = false;
154            rollbackCalled = false;
155            rollbackOnlyCalled = false;
156            beginCalls++;
157        }
158    
159        /**
160         * Commits the transaction.
161         */
162        public void commit() throws RollbackException, 
163                                    HeuristicMixedException,
164                                    HeuristicRollbackException,
165                                    SecurityException,
166                                    IllegalStateException,
167                                    SystemException
168        {
169    
170            commitCalled = true;
171            commitCalls++;
172        }
173    
174        /**
175         * Rolls back the transaction.
176         */
177        public void rollback() throws IllegalStateException, SecurityException, SystemException
178        {
179            rollbackCalled = true;
180            rollbackCalls++;
181        }
182    
183        /**
184         * Sets the rollback only flag.
185         */
186        public void setRollbackOnly() throws IllegalStateException, SystemException
187        {
188            rollbackOnlyCalled = true;
189            rollbackOnlyCalls++;
190        }
191    
192        /**
193         * Sets the transaction timeout.
194         * @param timeout the transaction timeout
195         */
196        public void setTransactionTimeout(int timeout) throws SystemException
197        {
198            transactionTimeout = timeout;
199        }
200    }