1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 }