| 1 21 22 package org.opensubsystems.core.persist.db.transaction; 23 24 import java.sql.Connection ; 25 import java.util.logging.Level ; 26 import java.util.logging.Logger ; 27 28 import javax.naming.NamingException ; 29 import javax.transaction.SystemException ; 30 import javax.transaction.TransactionManager ; 31 import javax.transaction.UserTransaction ; 32 33 import org.objectweb.transaction.jta.TMService; 34 import org.opensubsystems.core.error.OSSDatabaseAccessException; 35 import org.opensubsystems.core.error.OSSException; 36 import org.opensubsystems.core.persist.db.DatabaseConnectionFactoryImpl; 37 import org.opensubsystems.core.persist.db.DatabaseTransactionFactoryImpl; 38 import org.opensubsystems.core.persist.db.connectionpool.XAPoolDatabaseConnectionFactoryImpl; 39 import org.opensubsystems.core.util.GlobalConstants; 40 import org.opensubsystems.core.util.Log; 41 42 51 public class JOTMTransactionFactoryImpl extends DatabaseTransactionFactoryImpl 52 { 53 55 58 protected TMService m_tmJotm; 59 60 63 protected boolean m_bStarted = false; 64 65 67 70 private static Logger s_logger = Log.getInstance(JOTMTransactionFactoryImpl.class); 71 72 74 77 public JOTMTransactionFactoryImpl( 78 ) 79 { 80 super(); 81 82 start(); 83 } 84 85 88 public TransactionManager getTransactionManager( 89 ) 90 { 91 if (!m_bStarted) 92 { 93 start(); 94 } 95 96 return m_tmJotm.getTransactionManager(); 97 } 98 99 102 public UserTransaction requestTransaction( 103 ) throws OSSException 104 { 105 if (!m_bStarted) 106 { 107 start(); 108 } 109 110 UserTransaction transaction; 111 112 transaction = m_tmJotm.getUserTransaction(); 113 if (s_bTransactionMonitor) 114 { 115 transaction = new DelegatingUserTransaction(transaction); 116 } 117 try 118 { 119 transaction.setTransactionTimeout(s_iTransactionTimeout); 120 } 121 catch (SystemException seExc) 122 { 123 throw new OSSDatabaseAccessException("Cannot set transaction timeout", seExc); 124 } 125 126 return transaction; 127 } 128 129 132 public void reset( 133 ) throws OSSException 134 { 135 s_logger.severe("About to reset state of transaction manage." + 138 " Hope you know what you are doing."); 139 stop(); 141 start(); 142 } 143 144 147 public void stop( 148 ) throws OSSException 149 { 150 if (m_tmJotm != null) 151 { 152 s_logger.fine("Stopping JoTM transaction manager."); 153 m_tmJotm.stop(); 154 m_bStarted = false; 155 s_logger.fine("JoTM transaction manager is stopped."); 156 } 157 } 158 159 161 164 protected void start( 165 ) 166 { 167 if (!m_bStarted) 168 { 169 s_logger.fine("Starting JoTM transaction manager."); 172 173 try 174 { 175 m_tmJotm = new org.objectweb.jotm.Jotm(true, false); 176 177 181 } 198 catch (NamingException nmeExc) 199 { 200 s_logger.log(Level.SEVERE, "Cannot create instance of JOTM", nmeExc); 201 throw new RuntimeException ("Cannot create instance of JOTM", nmeExc); 202 } 203 204 m_bStarted = true; 205 206 s_logger.fine("JoTM is running..."); 207 } 208 else 209 { 210 s_logger.fine("JoTM is already running..."); 211 } 212 } 213 214 217 protected Connection requestTransactionalConnection( 218 boolean bAutoCommit, 219 String strDataSourceName, 220 String strUser, 221 String strPassword, 222 DatabaseConnectionFactoryImpl connectionFactory 223 ) throws OSSDatabaseAccessException 224 { 225 if (GlobalConstants.ERROR_CHECKING) 226 { 227 assert connectionFactory instanceof XAPoolDatabaseConnectionFactoryImpl 232 : "JOTM can manage only XAPool connections at this time."; 233 } 234 235 return super.requestTransactionalConnection(bAutoCommit, strDataSourceName, 238 strUser, strPassword, 239 connectionFactory); 240 } 241 242 245 protected void returnTransactionalConnection( 246 Connection cntDBConnection, 247 DatabaseConnectionFactoryImpl connectionFactory 248 ) 249 { 250 if (GlobalConstants.ERROR_CHECKING) 251 { 252 assert connectionFactory instanceof XAPoolDatabaseConnectionFactoryImpl 257 : "JOTM can manage only XAPool connections at this time."; 258 } 259 260 super.returnTransactionalConnection(cntDBConnection, connectionFactory); 262 } 263 } 264 | Popular Tags |