View Javadoc
1   /*
2    *    Copyright 2009-2023 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    *       https://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.mybatis.guice.transactional;
17  
18  import jakarta.transaction.HeuristicMixedException;
19  import jakarta.transaction.HeuristicRollbackException;
20  import jakarta.transaction.InvalidTransactionException;
21  import jakarta.transaction.NotSupportedException;
22  import jakarta.transaction.RollbackException;
23  import jakarta.transaction.Status;
24  import jakarta.transaction.SystemException;
25  import jakarta.transaction.Transaction;
26  import jakarta.transaction.TransactionManager;
27  
28  public enum TransactionAttribute {
29    MANDATORY {
30      @Override
31      public TransactionToken begin(TransactionManager man) throws SystemException {
32        if (man.getStatus() == Status.STATUS_NO_TRANSACTION) {
33          throw new IllegalStateException(
34              "A call is being made on a method that mandates a transaction but there is no current transaction.");
35        }
36        return new TransactionToken(man.getTransaction(), null, MANDATORY);
37      }
38    },
39    NEVER {
40      @Override
41      public TransactionToken begin(TransactionManager man) throws SystemException {
42        if (man.getStatus() == Status.STATUS_ACTIVE) {
43          throw new IllegalStateException(
44              "A call is being made on a method that forbids a transaction but there is a current transaction.");
45        }
46        return new TransactionToken(null, null, NEVER);
47      }
48    },
49    NOTSUPPORTED {
50      @Override
51      public TransactionToken begin(TransactionManager man) throws SystemException {
52        if (man.getStatus() == Status.STATUS_ACTIVE) {
53          return new TransactionToken(null, man.suspend(), this);
54        }
55        return new TransactionToken(null, null, NOTSUPPORTED);
56      }
57  
58      @Override
59      public void finish(TransactionManager man, TransactionToken tranToken)
60          throws SystemException, InvalidTransactionException, IllegalStateException {
61        Transaction tran = tranToken.getSuspendedTransaction();
62        if (tran != null) {
63          man.resume(tran);
64        }
65      }
66    },
67    REQUIRED {
68      @Override
69      public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException {
70        if (man.getStatus() == Status.STATUS_NO_TRANSACTION) {
71          man.begin();
72          return new TransactionToken(man.getTransaction(), null, REQUIRED, true);
73        }
74        return new TransactionToken(man.getTransaction(), null, REQUIRED);
75      }
76  
77      @Override
78      public void finish(TransactionManager man, TransactionToken tranToken)
79          throws SystemException, InvalidTransactionException, IllegalStateException, SecurityException,
80          RollbackException, HeuristicMixedException, HeuristicRollbackException {
81  
82        if (tranToken.isCompletionAllowed()) {
83          if (man.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
84            man.rollback();
85          } else {
86            man.commit();
87          }
88        }
89      }
90    },
91    REQUIRESNEW {
92      @Override
93      public TransactionToken begin(TransactionManager man)
94          throws SystemException, NotSupportedException, InvalidTransactionException, IllegalStateException {
95        TransactionToken tranToken;
96        if (man.getStatus() == Status.STATUS_ACTIVE) {
97          tranToken = new TransactionToken(null, man.suspend(), REQUIRESNEW);
98        } else {
99          tranToken = new TransactionToken(null, null, REQUIRESNEW);
100       }
101 
102       try {
103         man.begin();
104       } catch (NotSupportedException | SystemException e) {
105         man.resume(tranToken.getSuspendedTransaction());
106         throw e;
107       }
108 
109       tranToken.setActiveTransaction(man.getTransaction());
110       tranToken.setCompletionAllowed(true);
111 
112       return tranToken;
113     }
114 
115     @Override
116     public void finish(TransactionManager man, TransactionToken tranToken)
117         throws SystemException, InvalidTransactionException, IllegalStateException, SecurityException,
118         RollbackException, HeuristicMixedException, HeuristicRollbackException {
119       if (tranToken.isCompletionAllowed()) {
120         if (man.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
121           man.rollback();
122         } else {
123           man.commit();
124         }
125       }
126 
127       Transaction tran = tranToken.getSuspendedTransaction();
128       if (tran != null) {
129         man.resume(tran);
130       }
131     }
132   },
133   SUPPORTS {
134     @Override
135     public TransactionToken begin(TransactionManager man)
136         throws SystemException, NotSupportedException, InvalidTransactionException, IllegalStateException {
137       if (man.getStatus() == Status.STATUS_ACTIVE) {
138         return new TransactionToken(man.getTransaction(), null, SUPPORTS);
139       }
140 
141       return new TransactionToken(null, null, SUPPORTS);
142     }
143   };
144 
145   public static TransactionAttribute fromValue(String value) {
146     return valueOf(value.toUpperCase());
147   }
148 
149   public TransactionToken begin(TransactionManager man)
150       throws SystemException, NotSupportedException, InvalidTransactionException, IllegalStateException {
151 
152     return null;
153   }
154 
155   public void finish(TransactionManager man, TransactionToken tranToken)
156       throws SystemException, InvalidTransactionException, IllegalStateException, SecurityException, RollbackException,
157       HeuristicMixedException, HeuristicRollbackException {
158 
159   }
160 }