KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hibernate > transaction > WebSphereExtendedJTATransactionLookup


1 //$Id: WebSphereExtendedJTATransactionLookup.java,v 1.7 2005/04/15 18:52:00 oneovthafew Exp $
2
package org.hibernate.transaction;
3
4 import java.lang.reflect.InvocationHandler JavaDoc;
5 import java.lang.reflect.Method JavaDoc;
6 import java.lang.reflect.Proxy JavaDoc;
7 import java.util.Properties JavaDoc;
8
9 import javax.naming.NamingException JavaDoc;
10 import javax.transaction.HeuristicMixedException JavaDoc;
11 import javax.transaction.HeuristicRollbackException JavaDoc;
12 import javax.transaction.InvalidTransactionException JavaDoc;
13 import javax.transaction.NotSupportedException JavaDoc;
14 import javax.transaction.RollbackException JavaDoc;
15 import javax.transaction.Status JavaDoc;
16 import javax.transaction.Synchronization JavaDoc;
17 import javax.transaction.SystemException JavaDoc;
18 import javax.transaction.Transaction JavaDoc;
19 import javax.transaction.TransactionManager JavaDoc;
20 import javax.transaction.xa.XAResource JavaDoc;
21
22 import org.hibernate.HibernateException;
23 import org.hibernate.util.NamingHelper;
24
25 /**
26  * Support for proprietary interfaces for registering synchronizations in WebSphere 6.
27  * @author Gavin King
28  */

29 public class WebSphereExtendedJTATransactionLookup implements TransactionManagerLookup {
30     
31     public TransactionManager JavaDoc getTransactionManager(Properties JavaDoc props)
32     throws HibernateException {
33         return new TransactionManagerAdapter(props);
34     }
35
36     public String JavaDoc getUserTransactionName() {
37         return "java:comp/UserTransaction";
38     }
39     
40     public static class TransactionManagerAdapter implements TransactionManager JavaDoc {
41
42         private final Properties JavaDoc properties;
43         private final Class JavaDoc synchronizationCallbackClass;
44         private final Method JavaDoc registerSynchronizationMethod;
45         private final Method JavaDoc getLocalIdMethod;
46         
47         private TransactionManagerAdapter(Properties JavaDoc props) {
48             this.properties = props;
49             try {
50                 synchronizationCallbackClass = Class.forName("com.ibm.websphere.jtaextensions.SynchronizationCallback");
51                 Class JavaDoc extendedJTATransactionClass = Class.forName("com.ibm.websphere.jtaextensions.ExtendedJTATransaction");
52                 registerSynchronizationMethod = extendedJTATransactionClass
53                     .getMethod( "registerSynchronizationCallbackForCurrentTran", new Class JavaDoc[] { synchronizationCallbackClass } );
54                 getLocalIdMethod = extendedJTATransactionClass.getMethod( "getLocalId", null );
55                 
56             }
57             catch (ClassNotFoundException JavaDoc cnfe) {
58                 throw new HibernateException(cnfe);
59             }
60             catch (NoSuchMethodException JavaDoc nsme) {
61                 throw new HibernateException(nsme);
62             }
63         }
64         
65         public void begin() throws NotSupportedException JavaDoc, SystemException JavaDoc {
66             throw new UnsupportedOperationException JavaDoc();
67         }
68
69         public void commit() throws RollbackException JavaDoc, HeuristicMixedException JavaDoc,
70                 HeuristicRollbackException JavaDoc, SecurityException JavaDoc,
71                 IllegalStateException JavaDoc, SystemException JavaDoc {
72             throw new UnsupportedOperationException JavaDoc();
73         }
74
75         public int getStatus() throws SystemException JavaDoc {
76             throw new UnsupportedOperationException JavaDoc();
77         }
78
79         public Transaction JavaDoc getTransaction() throws SystemException JavaDoc {
80             return new TransactionAdapter(properties);
81         }
82
83         public void resume(Transaction JavaDoc txn) throws InvalidTransactionException JavaDoc,
84                 IllegalStateException JavaDoc, SystemException JavaDoc {
85             throw new UnsupportedOperationException JavaDoc();
86         }
87
88         public void rollback() throws IllegalStateException JavaDoc, SecurityException JavaDoc,
89                 SystemException JavaDoc {
90             throw new UnsupportedOperationException JavaDoc();
91         }
92
93         public void setRollbackOnly() throws IllegalStateException JavaDoc,
94                 SystemException JavaDoc {
95             throw new UnsupportedOperationException JavaDoc();
96         }
97
98         public void setTransactionTimeout(int i) throws SystemException JavaDoc {
99             throw new UnsupportedOperationException JavaDoc();
100         }
101
102         public Transaction JavaDoc suspend() throws SystemException JavaDoc {
103             throw new UnsupportedOperationException JavaDoc();
104         }
105
106         public class TransactionAdapter implements Transaction JavaDoc {
107             
108             private final Object JavaDoc extendedJTATransaction;
109             
110             private TransactionAdapter(Properties JavaDoc props) {
111                 try {
112                     extendedJTATransaction = NamingHelper.getInitialContext(props)
113                         .lookup("java:comp/websphere/ExtendedJTATransaction");
114                 }
115                 catch (NamingException JavaDoc ne) {
116                     throw new HibernateException(ne);
117                 }
118             }
119
120             public void registerSynchronization(final Synchronization JavaDoc synchronization)
121                     throws RollbackException JavaDoc, IllegalStateException JavaDoc,
122                     SystemException JavaDoc {
123                 
124                 final InvocationHandler JavaDoc ih = new InvocationHandler JavaDoc() {
125                     
126                     public Object JavaDoc invoke(Object JavaDoc proxy, Method JavaDoc method, Object JavaDoc[] args) throws Throwable JavaDoc {
127                         if ( "afterCompletion".equals( method.getName() ) ) {
128                             int status = args[2].equals(Boolean.TRUE) ?
129                                     Status.STATUS_COMMITTED :
130                                     Status.STATUS_UNKNOWN;
131                             synchronization.afterCompletion(status);
132                         }
133                         else if ( "beforeCompletion".equals( method.getName() ) ) {
134                             synchronization.beforeCompletion();
135                         }
136                         else if ( "toString".equals( method.getName() ) ) {
137                             return synchronization.toString();
138                         }
139                         return null;
140                     }
141                     
142                 };
143                 
144                 final Object JavaDoc synchronizationCallback = Proxy.newProxyInstance(
145                         getClass().getClassLoader(),
146                         new Class JavaDoc[] { synchronizationCallbackClass },
147                         ih
148                 );
149                 
150                 try {
151                     registerSynchronizationMethod.invoke(
152                             extendedJTATransaction,
153                             new Object JavaDoc[] { synchronizationCallback }
154                     );
155                 }
156                 catch (Exception JavaDoc e) {
157                     throw new HibernateException(e);
158                 }
159
160             }
161             
162             public int hashCode() {
163                 return getLocalId().hashCode();
164             }
165             
166             public boolean equals(Object JavaDoc other) {
167                 if ( !(other instanceof TransactionAdapter) ) return false;
168                 TransactionAdapter that = (TransactionAdapter) other;
169                 return getLocalId().equals( that.getLocalId() );
170             }
171
172             private Object JavaDoc getLocalId() {
173                 try {
174                     return getLocalIdMethod.invoke(extendedJTATransaction, null);
175                 }
176                 catch (Exception JavaDoc e) {
177                     throw new HibernateException(e);
178                 }
179             }
180
181             public void commit() throws RollbackException JavaDoc, HeuristicMixedException JavaDoc,
182                     HeuristicRollbackException JavaDoc, SecurityException JavaDoc,
183                     IllegalStateException JavaDoc, SystemException JavaDoc {
184                 throw new UnsupportedOperationException JavaDoc();
185             }
186         
187             public boolean delistResource(XAResource JavaDoc resource, int i)
188                     throws IllegalStateException JavaDoc, SystemException JavaDoc {
189                 throw new UnsupportedOperationException JavaDoc();
190             }
191         
192             public boolean enlistResource(XAResource JavaDoc resource)
193                     throws RollbackException JavaDoc, IllegalStateException JavaDoc,
194                     SystemException JavaDoc {
195                 throw new UnsupportedOperationException JavaDoc();
196             }
197         
198             public int getStatus() throws SystemException JavaDoc {
199                 return new Integer JavaDoc(0).equals( getLocalId() ) ?
200                         Status.STATUS_NO_TRANSACTION : Status.STATUS_ACTIVE;
201             }
202
203             public void rollback() throws IllegalStateException JavaDoc, SystemException JavaDoc {
204                 throw new UnsupportedOperationException JavaDoc();
205             }
206
207             public void setRollbackOnly() throws IllegalStateException JavaDoc,
208                     SystemException JavaDoc {
209                 throw new UnsupportedOperationException JavaDoc();
210             }
211         }
212             
213     }
214     
215 }
216
Popular Tags