001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.transaction.jta;
018:
019: import java.lang.reflect.InvocationTargetException;
020: import java.lang.reflect.Method;
021:
022: import javax.transaction.TransactionManager;
023:
024: import org.apache.commons.logging.Log;
025: import org.apache.commons.logging.LogFactory;
026:
027: import org.springframework.beans.factory.FactoryBean;
028: import org.springframework.transaction.TransactionSystemException;
029:
030: /**
031: * {@link org.springframework.beans.factory.FactoryBean} that retrieves
032: * the JTA TransactionManager for IBM's WebSphere application servers
033: * (versions 5.1, 6.0 and 6.1).
034: *
035: * <p>Uses WebSphere's static accessor methods to obtain the internal JTA
036: * TransactionManager. This is known to work reliably on all tested WebSphere
037: * versions; however, access to the internal TransactionManager facility
038: * is not officially supported by IBM.
039: *
040: * <p>In combination with Spring's JtaTransactionManager, this FactoryBean
041: * can be used to enable transaction suspension (PROPAGATION_REQUIRES_NEW,
042: * PROPAGATION_NOT_SUPPORTED) on WebSphere:
043: *
044: * <pre>
045: * <bean id="wsJtaTm" class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/>
046: *
047: * <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
048: * <property name="transactionManager ref="wsJtaTm"/>
049: * </bean></pre>
050: *
051: * Note that Spring's JtaTransactionManager will continue to use the JTA
052: * UserTransaction for standard transaction demarcation, as defined by
053: * standard J2EE. It will only use the provided WebSphere TransactionManager
054: * in case of actual transaction suspension needs. <i>If you do not require
055: * transaction suspension in the first place, do not bother with this FactoryBean.</i>
056: *
057: * <p><b>NOTE: On recent WebSphere 6.0.x and 6.1.x versions, this class has
058: * been superseded by the {@link WebSphereUowTransactionManager} class, which
059: * uses IBM's official UOWManager API facility for transaction suspension.</b>
060: * The WebSphereUowTransactionManager class is a direct replacement for a
061: * standard JtaTransactionManager definition, without further configuration.
062: *
063: * @author Juergen Hoeller
064: * @since 21.01.2004
065: * @see JtaTransactionManager#setTransactionManager
066: * @see com.ibm.ws.Transaction.TransactionManagerFactory#getTransactionManager
067: * @see WebSphereUowTransactionManager
068: */
069: public class WebSphereTransactionManagerFactoryBean implements
070: FactoryBean {
071:
072: private static final String FACTORY_CLASS_5_1 = "com.ibm.ws.Transaction.TransactionManagerFactory";
073:
074: protected final Log logger = LogFactory.getLog(getClass());
075:
076: private final TransactionManager transactionManager;
077:
078: /**
079: * This constructor retrieves the WebSphere TransactionManager factory class,
080: * so we can get access to the JTA TransactionManager.
081: */
082: public WebSphereTransactionManagerFactoryBean()
083: throws TransactionSystemException {
084: try {
085: // Using the thread context class loader for compatibility with the WSAD test server.
086: Class clazz = Thread.currentThread()
087: .getContextClassLoader().loadClass(
088: FACTORY_CLASS_5_1);
089: Method method = clazz.getMethod("getTransactionManager",
090: (Class[]) null);
091: this .transactionManager = (TransactionManager) method
092: .invoke(null, (Object[]) null);
093: } catch (ClassNotFoundException ex) {
094: throw new TransactionSystemException(
095: "Could not find WebSphere 5.1/6.0/6.1 TransactionManager factory class",
096: ex);
097: } catch (InvocationTargetException ex) {
098: throw new TransactionSystemException(
099: "WebSphere's TransactionManagerFactory.getTransactionManager method failed",
100: ex.getTargetException());
101: } catch (Exception ex) {
102: throw new TransactionSystemException(
103: "Could not access WebSphere's TransactionManagerFactory.getTransactionManager method",
104: ex);
105: }
106: }
107:
108: public Object getObject() {
109: return this .transactionManager;
110: }
111:
112: public Class getObjectType() {
113: return this .transactionManager.getClass();
114: }
115:
116: public boolean isSingleton() {
117: return true;
118: }
119:
120: }
|