/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.config.spring.factories; import static org.mule.runtime.core.config.i18n.CoreMessages.failedToCreate; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.api.exception.MuleRuntimeException; import org.mule.runtime.core.api.context.MuleContextAware; import org.mule.runtime.core.api.transaction.TransactionManagerFactory; import javax.transaction.TransactionManager; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.annotation.Autowired; /** * {@link FactoryBean} adapter for the configured {@link TransactionManagerFactory}. * <p/> * Creates a reference to the TransactionManager configured on the MuleContext. This is useful when you need to inject the * TransactionManager into other objects such as XA data Sources. * <p/> * This will first look for a single {@link TransactionManagerFactory} and use it to build the {@link TransactionManager}. * <p/> * If no {@link TransactionManagerFactory} is found, then it will look for {@link TransactionManager} instances. * * @since 3.7.4 */ public class TransactionManagerFactoryBean implements FactoryBean<TransactionManager>, MuleContextAware { @Autowired(required = false) private TransactionManagerFactory txManagerFactory; @Autowired(required = false) private TransactionManager customTxManager; private MuleContext muleContext; @Override public TransactionManager getObject() throws Exception { if (muleContext.isDisposing()) { // The txManager might be declared, but if it isn't used by the application it won't be created until the // muleContext is disposed. // At that point, there is no need to create the txManager. return null; } else if (txManagerFactory != null) { try { return txManagerFactory.create(muleContext.getConfiguration()); } catch (Exception e) { throw new MuleRuntimeException(failedToCreate("transaction manager"), e); } } else { return customTxManager; } } @Override public Class<?> getObjectType() { return TransactionManager.class; } @Override public boolean isSingleton() { return true; } public void setTxManagerFactory(TransactionManagerFactory txManagerFactory) { this.txManagerFactory = txManagerFactory; } public void setCustomTxManager(TransactionManager customTxManager) { this.customTxManager = customTxManager; } @Override public void setMuleContext(MuleContext context) { this.muleContext = context; } }