source: contrib/MailArchiver/sources/src/serpro/mailarchiver/util/jdo/DNJdoDialect.java @ 6785

Revision 6785, 6.9 KB checked in by rafaelraymundo, 12 years ago (diff)

Ticket #2946 - Liberado codigo do MailArchiver?. Documentação na subpasta DOCS.

Line 
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
30package serpro.mailarchiver.util.jdo;
31
32import java.sql.SQLException;
33
34import javax.jdo.JDOException;
35import javax.jdo.Transaction;
36
37import org.datanucleus.TransactionEventListener;
38import org.datanucleus.api.jdo.JDOTransaction;
39
40import org.springframework.dao.DataAccessException;
41import org.springframework.jdbc.datasource.ConnectionHandle;
42import org.springframework.jdbc.support.SQLExceptionTranslator;
43import org.springframework.orm.jdo.DefaultJdoDialect;
44import org.springframework.transaction.TransactionDefinition;
45
46import serpro.mailarchiver.util.Logger;
47
48/**
49 * Dialect for using DataNucleus within Spring's JDO support, giving finer control over transactions and queries.
50 */
51public 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}
Note: See TracBrowser for help on using the repository browser.