1 | /** |
---|
2 | * MailArchiver is an application that provides services for storing and managing e-mail messages through a Web Services SOAP interface. |
---|
3 | * Copyright (C) 2012 Marcio Andre Scholl Levien and Fernando Alberto Reuter Wendt and Jose Ronaldo Nogueira Fonseca Junior |
---|
4 | * |
---|
5 | * This program is free software: you can redistribute it and/or modify |
---|
6 | * it under the terms of the GNU Affero General Public License as |
---|
7 | * published by the Free Software Foundation, either version 3 of the |
---|
8 | * License, or (at your option) any later version. |
---|
9 | * |
---|
10 | * This program is distributed in the hope that it will be useful, |
---|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
13 | * GNU Affero General Public License for more details. |
---|
14 | * |
---|
15 | * You should have received a copy of the GNU Affero General Public License |
---|
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
---|
17 | */ |
---|
18 | |
---|
19 | /******************************************************************************\ |
---|
20 | * |
---|
21 | * This product was developed by |
---|
22 | * |
---|
23 | * SERVIÃO FEDERAL DE PROCESSAMENTO DE DADOS (SERPRO), |
---|
24 | * |
---|
25 | * a government company established under Brazilian law (5.615/70), |
---|
26 | * at Department of Development of Porto Alegre. |
---|
27 | * |
---|
28 | \******************************************************************************/ |
---|
29 | |
---|
30 | package serpro.mailarchiver.util.jdo; |
---|
31 | |
---|
32 | import java.sql.SQLException; |
---|
33 | |
---|
34 | import javax.jdo.JDOException; |
---|
35 | import javax.jdo.Transaction; |
---|
36 | |
---|
37 | import org.datanucleus.TransactionEventListener; |
---|
38 | import org.datanucleus.api.jdo.JDOTransaction; |
---|
39 | |
---|
40 | import org.springframework.dao.DataAccessException; |
---|
41 | import org.springframework.jdbc.datasource.ConnectionHandle; |
---|
42 | import org.springframework.jdbc.support.SQLExceptionTranslator; |
---|
43 | import org.springframework.orm.jdo.DefaultJdoDialect; |
---|
44 | import org.springframework.transaction.TransactionDefinition; |
---|
45 | |
---|
46 | import serpro.mailarchiver.util.Logger; |
---|
47 | |
---|
48 | /** |
---|
49 | * Dialect for using DataNucleus within Spring's JDO support, giving finer control over transactions and queries. |
---|
50 | */ |
---|
51 | public class DNJdoDialect extends DefaultJdoDialect { |
---|
52 | |
---|
53 | private static final Logger log = Logger.getLocalLogger(); |
---|
54 | |
---|
55 | /** |
---|
56 | * Method to start a transaction. Hooks into DataNucleus's configurability for transactions. |
---|
57 | * @param transaction The transaction to start |
---|
58 | * @param definition Definition of the transaction |
---|
59 | * @return The transaction |
---|
60 | */ |
---|
61 | @Override |
---|
62 | public Object beginTransaction(final Transaction transaction, final TransactionDefinition definition) { |
---|
63 | |
---|
64 | ((JDOTransaction)transaction).registerEventListener(new TransactionEventListener() { |
---|
65 | |
---|
66 | @Override |
---|
67 | public void transactionStarted() { |
---|
68 | System.out.println("transactionStarted: " + definition.getName()); |
---|
69 | } |
---|
70 | |
---|
71 | @Override |
---|
72 | public void transactionEnded() { |
---|
73 | System.out.println("transactionEnded: " + definition.getName()); |
---|
74 | } |
---|
75 | |
---|
76 | @Override |
---|
77 | public void transactionFlushed() { |
---|
78 | System.out.println("transactionFlushed: " + definition.getName()); |
---|
79 | } |
---|
80 | |
---|
81 | @Override |
---|
82 | public void transactionPreCommit() { |
---|
83 | System.out.println("transactionPreCommit: " + definition.getName()); |
---|
84 | } |
---|
85 | |
---|
86 | @Override |
---|
87 | public void transactionPreRollBack() { |
---|
88 | System.out.println("transactionPreRollBack: " + definition.getName()); |
---|
89 | } |
---|
90 | |
---|
91 | @Override |
---|
92 | public void transactionCommitted() { |
---|
93 | System.out.println("transactionCommitted: " + definition.getName()); |
---|
94 | } |
---|
95 | |
---|
96 | @Override |
---|
97 | public void transactionRolledBack() { |
---|
98 | System.out.println("transactionRolledBack: " + definition.getName()); |
---|
99 | } |
---|
100 | }); |
---|
101 | |
---|
102 | StringBuilder sb = new StringBuilder(); |
---|
103 | sb.append("beginTransaction") |
---|
104 | .append("\n\tname: ").append(definition.getName()) |
---|
105 | .append("\n\treadOnly: ").append(definition.isReadOnly()) |
---|
106 | .append("\n\tpropagation: "); |
---|
107 | |
---|
108 | switch(definition.getPropagationBehavior()) { |
---|
109 | case TransactionDefinition.PROPAGATION_REQUIRED: |
---|
110 | sb.append("REQUIRED"); |
---|
111 | break; |
---|
112 | |
---|
113 | case TransactionDefinition.PROPAGATION_SUPPORTS: |
---|
114 | sb.append("SUPPORTS"); |
---|
115 | break; |
---|
116 | |
---|
117 | case TransactionDefinition.PROPAGATION_MANDATORY: |
---|
118 | sb.append("MANDATORY"); |
---|
119 | break; |
---|
120 | |
---|
121 | case TransactionDefinition.PROPAGATION_REQUIRES_NEW: |
---|
122 | sb.append("REQUIRES_NEW"); |
---|
123 | break; |
---|
124 | |
---|
125 | case TransactionDefinition.PROPAGATION_NOT_SUPPORTED: |
---|
126 | sb.append("NOT_SUPPORTED"); |
---|
127 | break; |
---|
128 | |
---|
129 | case TransactionDefinition.PROPAGATION_NEVER: |
---|
130 | sb.append("NEVER"); |
---|
131 | break; |
---|
132 | |
---|
133 | case TransactionDefinition.PROPAGATION_NESTED: |
---|
134 | sb.append("NESTED"); |
---|
135 | break; |
---|
136 | } |
---|
137 | |
---|
138 | sb.append("\n\tisolation: "); |
---|
139 | |
---|
140 | switch(definition.getIsolationLevel()) { |
---|
141 | case TransactionDefinition.ISOLATION_READ_UNCOMMITTED: |
---|
142 | sb.append("READ_UNCOMMITTED"); |
---|
143 | transaction.setIsolationLevel("read-uncommitted"); |
---|
144 | break; |
---|
145 | |
---|
146 | case TransactionDefinition.ISOLATION_READ_COMMITTED: |
---|
147 | sb.append("READ_COMMITTED"); |
---|
148 | transaction.setIsolationLevel("read-committed"); |
---|
149 | break; |
---|
150 | |
---|
151 | case TransactionDefinition.ISOLATION_REPEATABLE_READ: |
---|
152 | sb.append("REPEATABLE_READ"); |
---|
153 | transaction.setIsolationLevel("repeatable-read"); |
---|
154 | break; |
---|
155 | |
---|
156 | case TransactionDefinition.ISOLATION_SERIALIZABLE: |
---|
157 | sb.append("SERIALIZABLE"); |
---|
158 | transaction.setIsolationLevel("serializable"); |
---|
159 | break; |
---|
160 | |
---|
161 | case TransactionDefinition.ISOLATION_DEFAULT: |
---|
162 | sb.append("DEFAULT"); |
---|
163 | transaction.setIsolationLevel("read-committed"); |
---|
164 | break; |
---|
165 | } |
---|
166 | |
---|
167 | sb.append("\n\ttimeout: ").append(definition.getTimeout()); |
---|
168 | |
---|
169 | String s = sb.toString(); |
---|
170 | log.debug(s); |
---|
171 | System.out.println(s); |
---|
172 | |
---|
173 | transaction.begin(); |
---|
174 | |
---|
175 | return transaction; |
---|
176 | } |
---|
177 | |
---|
178 | /** |
---|
179 | * Method to apply a timeout to the specified query. |
---|
180 | * @param query The query |
---|
181 | * @param remainingTimeInSeconds The timeout to apply |
---|
182 | * @throws JDOException Thrown when an error occurs setting the timeout. |
---|
183 | */ |
---|
184 | @Override |
---|
185 | public void applyQueryTimeout(javax.jdo.Query query, int remainingTimeInSeconds) { |
---|
186 | System.out.println("applyQueryTimeout"); |
---|
187 | |
---|
188 | query.addExtension("datanucleus.query.timeout", "" + remainingTimeInSeconds); |
---|
189 | } |
---|
190 | |
---|
191 | @Override |
---|
192 | public void cleanupTransaction(Object transactionData) { |
---|
193 | System.out.println("cleanupTransaction"); |
---|
194 | |
---|
195 | // if(transactionData != null) { |
---|
196 | // JDOTransaction transaction = (JDOTransaction) transactionData; |
---|
197 | // } |
---|
198 | |
---|
199 | super.cleanupTransaction(transactionData); |
---|
200 | } |
---|
201 | } |
---|