Coverage Report - org.springframework.transaction.jta.JotmFactoryBean
 
Classes in this File Line Coverage Branch Coverage Complexity
JotmFactoryBean
0%
0/18
0%
0/4
1.429
 
 1  
 /*
 2  
  * Copyright 2002-2008 the original author or authors.
 3  
  *
 4  
  * Licensed under the Apache License, Version 2.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  *      http://www.apache.org/licenses/LICENSE-2.0
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 
 17  
 package org.springframework.transaction.jta;
 18  
 
 19  
 import javax.naming.NamingException;
 20  
 import javax.transaction.SystemException;
 21  
 
 22  
 import org.objectweb.jotm.Current;
 23  
 import org.objectweb.jotm.Jotm;
 24  
 
 25  
 import org.springframework.beans.factory.DisposableBean;
 26  
 import org.springframework.beans.factory.FactoryBean;
 27  
 
 28  
 /**
 29  
  * {@link FactoryBean} that retrieves the JTA UserTransaction/TransactionManager
 30  
  * for ObjectWeb's <a href="http://jotm.objectweb.org">JOTM</a>. Will retrieve
 31  
  * an already active JOTM instance if found (e.g. if running in JOnAS),
 32  
  * else create a new local JOTM instance.
 33  
  *
 34  
  * <p>With JOTM, the same object implements both the
 35  
  * {@link javax.transaction.UserTransaction} and the
 36  
  * {@link javax.transaction.TransactionManager} interface,
 37  
  * as returned by this FactoryBean.
 38  
  *
 39  
  * <p>A local JOTM instance is well-suited for working in conjunction with
 40  
  * ObjectWeb's <a href="http://xapool.experlog.com">XAPool</a>, e.g. with bean
 41  
  * definitions like the following:
 42  
  *
 43  
  * <pre class="code">
 44  
  * &lt;bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/&gt;
 45  
  *
 46  
  * &lt;bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"&gt;
 47  
  *   &lt;property name="userTransaction" ref="jotm"/&gt;
 48  
  * &lt;/bean&gt;
 49  
  *
 50  
  * &lt;bean id="innerDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"&gt;
 51  
  *   &lt;property name="transactionManager" ref="jotm"/&gt;
 52  
  *   &lt;property name="driverName" value="..."/&gt;
 53  
  *   &lt;property name="url" value="..."/&gt;
 54  
  *   &lt;property name="user" value="..."/&gt;
 55  
  *   &lt;property name="password" value="..."/&gt;
 56  
  * &lt;/bean&gt;
 57  
  *
 58  
  * &lt;bean id="dataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"&gt;
 59  
  *   &lt;property name="dataSource" ref="innerDataSource"/&gt;
 60  
  *   &lt;property name="user" value="..."/&gt;
 61  
  *   &lt;property name="password" value="..."/&gt;
 62  
  *   &lt;property name="maxSize" value="..."/&gt;
 63  
  * &lt;/bean&gt;</pre>
 64  
  *
 65  
  * Note that Spring's {@link JtaTransactionManager} will automatically detect
 66  
  * that the passed-in UserTransaction reference also implements the
 67  
  * TransactionManager interface. Hence, it is not necessary to specify a
 68  
  * separate reference for JtaTransactionManager's "transactionManager" property.
 69  
  *
 70  
  * <p>Implementation note: This FactoryBean uses JOTM's static access method
 71  
  * to obtain the JOTM {@link org.objectweb.jotm.Current} object, which
 72  
  * implements both the UserTransaction and the TransactionManager interface,
 73  
  * as mentioned above.
 74  
  *
 75  
  * @author Juergen Hoeller
 76  
  * @since 21.01.2004
 77  
  * @see JtaTransactionManager#setUserTransaction
 78  
  * @see JtaTransactionManager#setTransactionManager
 79  
  * @see org.objectweb.jotm.Current
 80  
  */
 81  
 public class JotmFactoryBean implements FactoryBean, DisposableBean {
 82  
 
 83  
         private Current jotmCurrent;
 84  
 
 85  
         private Jotm jotm;
 86  
 
 87  
 
 88  0
         public JotmFactoryBean() throws NamingException {
 89  
                 // Check for already active JOTM instance.
 90  0
                 this.jotmCurrent = Current.getCurrent();
 91  
 
 92  
                 // If none found, create new local JOTM instance.
 93  0
                 if (this.jotmCurrent == null) {
 94  
                         // Only for use within the current Spring context:
 95  
                         // local, not bound to registry.
 96  0
                         this.jotm = new Jotm(true, false);
 97  0
                         this.jotmCurrent = Current.getCurrent();
 98  
                 }
 99  0
         }
 100  
 
 101  
         /**
 102  
          * Set the default transaction timeout for the JOTM instance.
 103  
          * <p>Should only be called for a local JOTM instance,
 104  
          * not when accessing an existing (shared) JOTM instance.
 105  
          */
 106  
         public void setDefaultTimeout(int defaultTimeout) {
 107  0
                 this.jotmCurrent.setDefaultTimeout(defaultTimeout);
 108  
                 // The following is a JOTM oddity: should be used for demarcation transaction only,
 109  
                 // but is required here in order to actually get rid of JOTM's default (60 seconds).
 110  
                 try {
 111  0
                         this.jotmCurrent.setTransactionTimeout(defaultTimeout);
 112  
                 }
 113  0
                 catch (SystemException ex) {
 114  
                         // should never happen
 115  0
                 }
 116  0
         }
 117  
 
 118  
 
 119  
         /**
 120  
          * Return the JOTM instance created by this factory bean, if any.
 121  
          * Will be <code>null</code> if an already active JOTM instance is used.
 122  
          * <p>Application code should never need to access this.
 123  
          */
 124  
         public Jotm getJotm() {
 125  0
                 return this.jotm;
 126  
         }
 127  
 
 128  
         public Object getObject() {
 129  0
                 return this.jotmCurrent;
 130  
         }
 131  
 
 132  
         public Class getObjectType() {
 133  0
                 return this.jotmCurrent.getClass();
 134  
         }
 135  
 
 136  
         public boolean isSingleton() {
 137  0
                 return true;
 138  
         }
 139  
 
 140  
 
 141  
         /**
 142  
          * Stop the local JOTM instance, if created by this FactoryBean.
 143  
          */
 144  
         public void destroy() {
 145  0
                 if (this.jotm != null) {
 146  0
                         this.jotm.stop();
 147  
                 }
 148  0
         }
 149  
 
 150  
 }