KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > jdbcx > JdbcXAConnection


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.jdbcx;
6
7 //#ifdef JDK14
8
import java.sql.Connection JavaDoc;
9 import java.sql.ResultSet JavaDoc;
10 import java.sql.SQLException JavaDoc;
11 import java.sql.Statement JavaDoc;
12 import java.util.ArrayList JavaDoc;
13 import java.util.Properties JavaDoc;
14 import javax.sql.ConnectionEvent JavaDoc;
15 import javax.sql.ConnectionEventListener JavaDoc;
16 import javax.sql.XAConnection JavaDoc;
17 import javax.transaction.xa.XAException JavaDoc;
18 import javax.transaction.xa.XAResource JavaDoc;
19 import javax.transaction.xa.Xid JavaDoc;
20 import org.h2.util.ByteUtils;
21 import org.h2.util.JdbcUtils;
22 import org.h2.jdbc.JdbcConnection;
23 //#endif
24

25 import org.h2.message.TraceObject;
26
27 //#ifdef JDK16
28
/*
29 import javax.sql.StatementEventListener;
30 */

31 //#endif
32

33 public class JdbcXAConnection extends TraceObject
34 //#ifdef JDK14
35
implements XAConnection JavaDoc, XAResource JavaDoc, JdbcConnectionListener
36 //#endif
37
{
38     
39 //#ifdef JDK14
40
private JdbcDataSourceFactory factory;
41     private String JavaDoc url, user, password;
42     private JdbcConnection conn;
43     private ArrayList JavaDoc listeners = new ArrayList JavaDoc();
44     private Xid JavaDoc currentTransaction;
45     
46     JdbcXAConnection(JdbcDataSourceFactory factory, int id, String JavaDoc url, String JavaDoc user, String JavaDoc password) {
47         this.factory = factory;
48         setTrace(factory.getTrace(), TraceObject.XA_DATASOURCE, id);
49         this.url = url;
50         this.user = user;
51         this.password = password;
52     }
53
54     public XAResource JavaDoc getXAResource() throws SQLException JavaDoc {
55         debugCodeCall("getXAResource");
56         return this;
57     }
58
59     public void close() throws SQLException JavaDoc {
60         debugCodeCall("close");
61         if(conn != null) {
62             conn.closeConnection();
63             conn = null;
64         }
65     }
66
67     public Connection JavaDoc getConnection() throws SQLException JavaDoc {
68         debugCodeCall("getConnection");
69         close();
70         Properties JavaDoc info = new Properties JavaDoc();
71         info.setProperty("user", user);
72         info.setProperty("password", password);
73         conn = new JdbcConnection(url, info);
74         return conn;
75     }
76
77     public void addConnectionEventListener(ConnectionEventListener JavaDoc listener) {
78         debugCode("addConnectionEventListener(listener)");
79         listeners.add(listener);
80         conn.setJdbcConnectionListener(this);
81     }
82
83     public void removeConnectionEventListener(ConnectionEventListener JavaDoc listener) {
84         debugCode("removeConnectionEventListener(listener)");
85         listeners.remove(listener);
86     }
87
88     public void fatalErrorOccured(JdbcConnection conn, SQLException JavaDoc e) throws SQLException JavaDoc {
89         debugCode("fatalErrorOccured(conn, e)");
90         for(int i=0; i<listeners.size(); i++) {
91             ConnectionEventListener JavaDoc listener = (ConnectionEventListener JavaDoc)listeners.get(i);
92             ConnectionEvent JavaDoc event = new ConnectionEvent JavaDoc(this, e);
93             listener.connectionErrorOccurred(event);
94         }
95         close();
96     }
97
98     public void closed(JdbcConnection conn) {
99         debugCode("closed(conn)");
100         for(int i=0; i<listeners.size(); i++) {
101             ConnectionEventListener JavaDoc listener = (ConnectionEventListener JavaDoc)listeners.get(i);
102             ConnectionEvent JavaDoc event = new ConnectionEvent JavaDoc(this);
103             listener.connectionClosed(event);
104         }
105     }
106
107     public int getTransactionTimeout() throws XAException JavaDoc {
108         debugCodeCall("getTransactionTimeout");
109         return 0;
110     }
111
112     public boolean setTransactionTimeout(int seconds) throws XAException JavaDoc {
113         debugCodeCall("setTransactionTimeout", seconds);
114         return false;
115     }
116
117     public boolean isSameRM(XAResource JavaDoc xares) throws XAException JavaDoc {
118         debugCode("isSameRM(xares)");
119         return xares == this;
120     }
121
122     public Xid JavaDoc[] recover(int flag) throws XAException JavaDoc {
123         debugCodeCall("recover", quoteFlags(flag));
124         checkOpen();
125         Statement JavaDoc stat = null;
126         try {
127             stat = conn.createStatement();
128             ResultSet JavaDoc rs = stat.executeQuery("SELECT * FROM INFORMATION_SCHEMA.IN_DOUBT ORDER BY ID");
129             ArrayList JavaDoc list = new ArrayList JavaDoc();
130             while(rs.next()) {
131                 String JavaDoc tid = rs.getString("TRANSACTION");
132                 int id = getNextId(XID);
133                 Xid JavaDoc xid = new JdbcXid(factory, id, tid);
134                 list.add(xid);
135             }
136             rs.close();
137             Xid JavaDoc[] result = new Xid JavaDoc[list.size()];
138             list.toArray(result);
139             return result;
140         } catch(SQLException JavaDoc e) {
141             getTrace().debug("throw XAException.XAER_OUTSIDE", e);
142            throw new XAException JavaDoc(XAException.XAER_OUTSIDE);
143         } finally {
144             JdbcUtils.closeSilently(stat);
145         }
146     }
147     
148     private void checkOpen() throws XAException JavaDoc {
149         if(conn == null) {
150             getTrace().debug("conn==null");
151             throw new XAException JavaDoc(XAException.XAER_OUTSIDE);
152         }
153     }
154
155     public int prepare(Xid JavaDoc xid) throws XAException JavaDoc {
156         debugCode("prepare("+quoteXid(xid)+")");
157         checkOpen();
158         if(currentTransaction != xid) {
159             getTrace().debug("throw XAException.XAER_INVAL");
160             throw new XAException JavaDoc(XAException.XAER_INVAL);
161         }
162         Statement JavaDoc stat = null;
163         try {
164             stat = conn.createStatement();
165             stat.execute("PREPARE COMMIT");
166         } catch(SQLException JavaDoc e) {
167             throw convertException(e);
168         } finally {
169             JdbcUtils.closeSilently(stat);
170         }
171         getTrace().debug("return TMSUCCESS");
172         return TMSUCCESS;
173     }
174
175     public void forget(Xid JavaDoc xid) throws XAException JavaDoc {
176         debugCode("forget("+quoteXid(xid)+")");
177         // TODO
178
}
179
180     public void rollback(Xid JavaDoc xid) throws XAException JavaDoc {
181         debugCode("rollback("+quoteXid(xid)+")");
182         try {
183             conn.rollback();
184         } catch(SQLException JavaDoc e) {
185             throw convertException(e);
186         }
187         getTrace().debug("rolled back");
188     }
189
190     public void end(Xid JavaDoc xid, int flags) throws XAException JavaDoc {
191         debugCode("end("+quoteXid(xid)+", "+quoteFlags(flags)+")");
192         if(flags == TMSUSPEND) {
193             return;
194         }
195         if(currentTransaction != xid) {
196             getTrace().debug("throw XAException.XAER_OUTSIDE");
197             throw new XAException JavaDoc(XAException.XAER_OUTSIDE);
198         }
199         getTrace().debug("currentTransaction=null");
200         currentTransaction = null;
201     }
202     
203     private String JavaDoc quoteFlags(int flags) {
204         StringBuffer JavaDoc buff = new StringBuffer JavaDoc();
205         if((flags & XAResource.TMENDRSCAN) != 0) {
206             buff.append("|XAResource.TMENDRSCAN");
207         }
208         if((flags & XAResource.TMFAIL) != 0) {
209             buff.append("|XAResource.TMFAIL");
210         }
211         if((flags & XAResource.TMJOIN) != 0) {
212             buff.append("|XAResource.TMJOIN");
213         }
214         if((flags & XAResource.TMONEPHASE) != 0) {
215             buff.append("|XAResource.TMONEPHASE");
216         }
217         if((flags & XAResource.TMRESUME) != 0) {
218             buff.append("|XAResource.TMRESUME");
219         }
220         if((flags & XAResource.TMSTARTRSCAN) != 0) {
221             buff.append("|XAResource.TMSTARTRSCAN");
222         }
223         if((flags & XAResource.TMSUCCESS) != 0) {
224             buff.append("|XAResource.TMSUCCESS");
225         }
226         if((flags & XAResource.TMSUSPEND) != 0) {
227             buff.append("|XAResource.TMSUSPEND");
228         }
229         if(buff.length() == 0) {
230             buff.append("|XAResource.TMNOFLAGS");
231         }
232         return buff.toString().substring(1);
233     }
234     
235     private String JavaDoc quoteXid(Xid JavaDoc xid) {
236         StringBuffer JavaDoc buff = new StringBuffer JavaDoc();
237         buff.append("\"f:");
238         buff.append(xid.getFormatId());
239         buff.append(",bq:");
240         buff.append(ByteUtils.convertBytesToString(xid.getBranchQualifier()));
241         buff.append(",gxid:");
242         buff.append(ByteUtils.convertBytesToString(xid.getGlobalTransactionId()));
243         buff.append(",c:");
244         buff.append(xid.getClass().getName());
245         buff.append("\"");
246         return buff.toString();
247     }
248
249     public void start(Xid JavaDoc xid, int flags) throws XAException JavaDoc {
250         debugCode("start("+quoteXid(xid)+", "+quoteFlags(flags)+")");
251         if(flags == TMRESUME) {
252             return;
253         }
254         if(currentTransaction != null) {
255             getTrace().debug("throw XAException.XAER_NOTA");
256             throw new XAException JavaDoc(XAException.XAER_NOTA);
257         }
258         try {
259             conn.setAutoCommit(false);
260         } catch(SQLException JavaDoc e) {
261             throw convertException(e);
262         }
263         getTrace().debug("currentTransaction=xid");
264         currentTransaction = xid;
265     }
266     
267     private XAException JavaDoc convertException(SQLException JavaDoc e) {
268         getTrace().debug("throw XAException("+e.getMessage()+")");
269         return new XAException JavaDoc(e.getMessage());
270     }
271
272     public void commit(Xid JavaDoc xid, boolean onePhase) throws XAException JavaDoc {
273         debugCode("commit("+quoteXid(xid)+", "+onePhase+")");
274         try {
275             conn.commit();
276         } catch(SQLException JavaDoc e) {
277             throw convertException(e);
278         }
279         getTrace().debug("committed");
280     }
281 //#endif
282

283 //#ifdef JDK16
284
/*
285     public void addStatementEventListener(StatementEventListener listener) {
286         throw new UnsupportedOperationException();
287     }
288 */

289 //#endif
290

291 //#ifdef JDK16
292
/*
293     public void removeStatementEventListener(StatementEventListener listener) {
294         throw new UnsupportedOperationException();
295     }
296 */

297 //#endif
298

299 }
300
Popular Tags