diff --git a/spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerBeanDefinitionParser.java b/spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerBeanDefinitionParser.java index 1fd334df52..04b74b44a8 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerBeanDefinitionParser.java +++ b/spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerBeanDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,46 +21,23 @@ import org.w3c.dom.Element; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.util.ClassUtils; /** - * Parser for the <tx:jta-transaction-manager/> element, - * autodetecting BEA WebLogic and IBM WebSphere. + * Parser for the <tx:jta-transaction-manager/> XML configuration element, + * autodetecting WebLogic and WebSphere servers and exposing the corresponding + * {@link org.springframework.transaction.jta.JtaTransactionManager} subclass. * * @author Juergen Hoeller * @author Christian Dupuis * @since 2.5 + * @see org.springframework.transaction.jta.WebLogicJtaTransactionManager + * @see org.springframework.transaction.jta.WebSphereUowTransactionManager */ public class JtaTransactionManagerBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { - private static final String WEBLOGIC_JTA_TRANSACTION_MANAGER_CLASS_NAME = - "org.springframework.transaction.jta.WebLogicJtaTransactionManager"; - - private static final String WEBSPHERE_TRANSACTION_MANAGER_CLASS_NAME = - "org.springframework.transaction.jta.WebSphereUowTransactionManager"; - - private static final String JTA_TRANSACTION_MANAGER_CLASS_NAME = - "org.springframework.transaction.jta.JtaTransactionManager"; - - - private static final boolean weblogicPresent = ClassUtils.isPresent( - "weblogic.transaction.UserTransaction", JtaTransactionManagerBeanDefinitionParser.class.getClassLoader()); - - private static final boolean webspherePresent = ClassUtils.isPresent( - "com.ibm.wsspi.uow.UOWManager", JtaTransactionManagerBeanDefinitionParser.class.getClassLoader()); - - @Override protected String getBeanClassName(Element element) { - if (weblogicPresent) { - return WEBLOGIC_JTA_TRANSACTION_MANAGER_CLASS_NAME; - } - else if (webspherePresent) { - return WEBSPHERE_TRANSACTION_MANAGER_CLASS_NAME; - } - else { - return JTA_TRANSACTION_MANAGER_CLASS_NAME; - } + return JtaTransactionManagerFactoryBean.resolveJtaTransactionManagerClassName(); } @Override diff --git a/spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerFactoryBean.java b/spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerFactoryBean.java new file mode 100644 index 0000000000..8a80e6eaa9 --- /dev/null +++ b/spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerFactoryBean.java @@ -0,0 +1,98 @@ +/* + * Copyright 2002-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.transaction.config; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.transaction.jta.JtaTransactionManager; +import org.springframework.util.ClassUtils; + +/** + * A {@link FactoryBean} equivalent to the <tx:jta-transaction-manager/> XML element, + * autodetecting WebLogic and WebSphere servers and exposing the corresponding + * {@link org.springframework.transaction.jta.JtaTransactionManager} subclass. + * + * @author Juergen Hoeller + * @since 4.1.1 + * @see org.springframework.transaction.jta.WebLogicJtaTransactionManager + * @see org.springframework.transaction.jta.WebSphereUowTransactionManager + */ +public class JtaTransactionManagerFactoryBean implements FactoryBean { + + private static final String WEBLOGIC_JTA_TRANSACTION_MANAGER_CLASS_NAME = + "org.springframework.transaction.jta.WebLogicJtaTransactionManager"; + + private static final String WEBSPHERE_TRANSACTION_MANAGER_CLASS_NAME = + "org.springframework.transaction.jta.WebSphereUowTransactionManager"; + + private static final String JTA_TRANSACTION_MANAGER_CLASS_NAME = + "org.springframework.transaction.jta.JtaTransactionManager"; + + + private static final boolean weblogicPresent = ClassUtils.isPresent( + "weblogic.transaction.UserTransaction", JtaTransactionManagerFactoryBean.class.getClassLoader()); + + private static final boolean webspherePresent = ClassUtils.isPresent( + "com.ibm.wsspi.uow.UOWManager", JtaTransactionManagerFactoryBean.class.getClassLoader()); + + + private final JtaTransactionManager transactionManager; + + + @SuppressWarnings("unchecked") + public JtaTransactionManagerFactoryBean() { + String className = resolveJtaTransactionManagerClassName(); + try { + Class clazz = (Class) + JtaTransactionManagerFactoryBean.class.getClassLoader().loadClass(className); + this.transactionManager = BeanUtils.instantiate(clazz); + } + catch (ClassNotFoundException ex) { + throw new IllegalStateException("Failed to load JtaTransactionManager class: " + className, ex); + } + } + + + @Override + public JtaTransactionManager getObject() { + return this.transactionManager; + } + + @Override + public Class getObjectType() { + return (this.transactionManager != null ? this.transactionManager.getClass() : JtaTransactionManager.class); + } + + @Override + public boolean isSingleton() { + return true; + } + + + static String resolveJtaTransactionManagerClassName() { + if (weblogicPresent) { + return WEBLOGIC_JTA_TRANSACTION_MANAGER_CLASS_NAME; + } + else if (webspherePresent) { + return WEBSPHERE_TRANSACTION_MANAGER_CLASS_NAME; + } + else { + return JTA_TRANSACTION_MANAGER_CLASS_NAME; + } + } + +}