001/* 002 * Copyright 2002-2014 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 * https://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 017package org.springframework.transaction.config; 018 019import org.springframework.beans.BeanUtils; 020import org.springframework.beans.factory.FactoryBean; 021import org.springframework.transaction.jta.JtaTransactionManager; 022import org.springframework.util.ClassUtils; 023 024/** 025 * A {@link FactoryBean} equivalent to the <tx:jta-transaction-manager/> XML element, 026 * autodetecting WebLogic and WebSphere servers and exposing the corresponding 027 * {@link org.springframework.transaction.jta.JtaTransactionManager} subclass. 028 * 029 * @author Juergen Hoeller 030 * @since 4.1.1 031 * @see org.springframework.transaction.jta.WebLogicJtaTransactionManager 032 * @see org.springframework.transaction.jta.WebSphereUowTransactionManager 033 */ 034public class JtaTransactionManagerFactoryBean implements FactoryBean<JtaTransactionManager> { 035 036 private static final String WEBLOGIC_JTA_TRANSACTION_MANAGER_CLASS_NAME = 037 "org.springframework.transaction.jta.WebLogicJtaTransactionManager"; 038 039 private static final String WEBSPHERE_TRANSACTION_MANAGER_CLASS_NAME = 040 "org.springframework.transaction.jta.WebSphereUowTransactionManager"; 041 042 private static final String JTA_TRANSACTION_MANAGER_CLASS_NAME = 043 "org.springframework.transaction.jta.JtaTransactionManager"; 044 045 046 private static final boolean weblogicPresent = ClassUtils.isPresent( 047 "weblogic.transaction.UserTransaction", JtaTransactionManagerFactoryBean.class.getClassLoader()); 048 049 private static final boolean webspherePresent = ClassUtils.isPresent( 050 "com.ibm.wsspi.uow.UOWManager", JtaTransactionManagerFactoryBean.class.getClassLoader()); 051 052 053 private final JtaTransactionManager transactionManager; 054 055 056 @SuppressWarnings("unchecked") 057 public JtaTransactionManagerFactoryBean() { 058 String className = resolveJtaTransactionManagerClassName(); 059 try { 060 Class<? extends JtaTransactionManager> clazz = (Class<? extends JtaTransactionManager>) 061 ClassUtils.forName(className, JtaTransactionManagerFactoryBean.class.getClassLoader()); 062 this.transactionManager = BeanUtils.instantiate(clazz); 063 } 064 catch (ClassNotFoundException ex) { 065 throw new IllegalStateException("Failed to load JtaTransactionManager class: " + className, ex); 066 } 067 } 068 069 070 @Override 071 public JtaTransactionManager getObject() { 072 return this.transactionManager; 073 } 074 075 @Override 076 public Class<?> getObjectType() { 077 return (this.transactionManager != null ? this.transactionManager.getClass() : JtaTransactionManager.class); 078 } 079 080 @Override 081 public boolean isSingleton() { 082 return true; 083 } 084 085 086 static String resolveJtaTransactionManagerClassName() { 087 if (weblogicPresent) { 088 return WEBLOGIC_JTA_TRANSACTION_MANAGER_CLASS_NAME; 089 } 090 else if (webspherePresent) { 091 return WEBSPHERE_TRANSACTION_MANAGER_CLASS_NAME; 092 } 093 else { 094 return JTA_TRANSACTION_MANAGER_CLASS_NAME; 095 } 096 } 097 098}