Package es.twentymobile.mule.modules.jpa.xa

Source Code of es.twentymobile.mule.modules.jpa.xa.JpaXaResourceForTomcatAndOpenJpa

/**
*
*/
package es.twentymobile.mule.modules.jpa.xa;

import javax.persistence.EntityManager;
import javax.sql.XAConnection;
import javax.transaction.xa.XAResource;

import org.mule.api.transaction.Transaction;
import org.mule.api.transaction.TransactionException;
import org.mule.config.i18n.CoreMessages;
import org.mule.transaction.IllegalTransactionStateException;
import org.mule.transaction.TransactionCoordination;
import org.mule.transaction.XaTransaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* @author alvarezjm
*
*/
public class JpaXaResourceForTomcatAndOpenJpa extends JpaXaResource {

  private Boolean enlisted;

  private static Logger log = LoggerFactory.getLogger(JpaXaResourceForTomcatAndOpenJpa.class);

  public boolean isEnlisted() {
    return enlisted;
  }

  public EntityManager getEntityManager() {
    return impl;
  }

  public JpaXaResourceForTomcatAndOpenJpa(EntityManager s) {
    super(s);
    this.enlisted = Boolean.FALSE;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.mule.transaction.XaTransaction.MuleXaObject#enlist()
   */
  @Override
  public boolean enlist() throws TransactionException {
    if (isEnlisted()) {
      return false;
    }
    if (log.isDebugEnabled()) {
      log.debug("Enlistment request");
    }

    Transaction transaction = TransactionCoordination.getInstance().getTransaction();
    if (transaction == null) {
      throw new IllegalTransactionStateException(CoreMessages.noMuleTransactionAvailable());
    }
    if (!(transaction instanceof XaTransaction)) {
      throw new IllegalTransactionStateException(CoreMessages.notMuleXaTransaction(transaction));
    }
    if (!isEnlisted()) {
      XAResource xaResource;
      try {
        XAConnection conn = ((org.apache.openjpa.jdbc.kernel.JDBCStoreManager.ClientConnection) (impl
            .unwrap(org.apache.openjpa.persistence.EntityManagerImpl.class)).getConnection()).getInnermostDelegate().unwrap(XAConnection.class);
        if (conn != null) {
          xaResource = ((XAConnection) conn).getXAResource();
          enlisted = ((XaTransaction) transaction).enlistResource(xaResource);
          if (log.isDebugEnabled()) {
            log.debug("Enlistment result: " + enlisted);
          }
        } else {
          log.error("Connection is null, cannot enlist");
          return true;
        }
      } catch (Exception e) {
        throw new TransactionException(e);
      }

    }
    return enlisted;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.mule.transaction.XaTransaction.MuleXaObject#delist()
   */
  @Override
  public boolean delist() throws Exception {
    if (!isEnlisted()) {
      return false;
    }
    if (log.isDebugEnabled()) {
      log.debug("Delistment request");
    }

    Transaction transaction = TransactionCoordination.getInstance().getTransaction();
    if (transaction == null) {
      throw new IllegalTransactionStateException(CoreMessages.noMuleTransactionAvailable());
    }
    if (!(transaction instanceof XaTransaction)) {
      throw new IllegalTransactionStateException(CoreMessages.notMuleXaTransaction(transaction));
    }
    if (isEnlisted() && transaction.isXA()) {
      XAConnection conn = ((org.apache.openjpa.jdbc.kernel.JDBCStoreManager.ClientConnection) (impl
          .unwrap(org.apache.openjpa.persistence.EntityManagerImpl.class)).getConnection()).getInnermostDelegate().unwrap(XAConnection.class);

      if (conn != null) {
        XAResource xaResource = ((XAConnection) conn).getXAResource();
        enlisted = !((XaTransaction) transaction).delistResource(xaResource, XAResource.TMSUCCESS);
        if (log.isDebugEnabled()) {
          log.debug("Delistment result: " + enlisted);
        }
      } else {
        log.error("Connection is null, cannot delist");
        return true;
      }
    }
    return !isEnlisted();
  }

}
TOP

Related Classes of es.twentymobile.mule.modules.jpa.xa.JpaXaResourceForTomcatAndOpenJpa

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.