All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jbpm.persistence.jta.JtaDbPersistenceService Maven / Gradle / Ivy

The newest version!
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jbpm.persistence.jta;

import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.jbpm.JbpmException;
import org.jbpm.persistence.db.DbPersistenceService;

public class JtaDbPersistenceService extends DbPersistenceService {

  private UserTransaction userTransaction;

  private static final long serialVersionUID = 1L;
  private static final Log log = LogFactory.getLog(JtaDbPersistenceService.class);

  public JtaDbPersistenceService(JtaDbPersistenceServiceFactory persistenceServiceFactory) {
    super(persistenceServiceFactory);
    // if no transaction is underway, begin one
    if (getTransactionStatus() == Status.STATUS_NO_TRANSACTION) beginTransaction();
  }

  public boolean isTransactionActive() {
    return getTransactionStatus() == Status.STATUS_ACTIVE;
  }

  protected boolean isTransactionManagedExternally() {
    return userTransaction == null;
  }

  protected boolean isTransactionRollbackOnly() {
    return super.isTransactionRollbackOnly()
      || getTransactionStatus() == Status.STATUS_MARKED_ROLLBACK;
  }

  public void beginTransaction() {
    try {
      if (log.isDebugEnabled()) log.debug("beginning user transaction");
      JtaDbPersistenceServiceFactory jtaFactory =
        (JtaDbPersistenceServiceFactory) persistenceServiceFactory;
      userTransaction = jtaFactory.getUserTransaction();
      userTransaction.begin();
    }
    catch (NotSupportedException e) {
      throw new JbpmException("transaction already in course", e);
    }
    catch (SystemException e) {
      throw new JbpmException("failed to begin transaction", e);
    }
  }

  private int getTransactionStatus() {
    try {
      if (userTransaction != null) {
        return userTransaction.getStatus();
      }
      else {
        TransactionManager transactionManager = getTransactionManager();
        return transactionManager != null ? transactionManager.getStatus()
          : Status.STATUS_NO_TRANSACTION;
      }
    }
    catch (SystemException e) {
      log.error("could not get transaction status", e);
      return Status.STATUS_UNKNOWN;
    }
  }

  private TransactionManager getTransactionManager() {
    SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) getSessionFactory();
    return sessionFactory.getSettings().getJtaPlatform().retrieveTransactionManager();
  }

  protected Exception commit() {
    if (userTransaction != null) {
      if (log.isDebugEnabled()) log.debug("committing user transaction");
      try {
        userTransaction.commit();
      }
      catch (RollbackException e) {
        return e;
      }
      catch (HeuristicMixedException e) {
        return e;
      }
      catch (HeuristicRollbackException e) {
        return e;
      }
      catch (SystemException e) {
        return e;
      }
    }
    return null;
  }

  protected Exception rollback() {
    if (userTransaction != null) {
      if (log.isDebugEnabled()) log.debug("rolling back user transaction");
      try {
        userTransaction.rollback();
      }
      catch (SystemException e) {
        return e;
      }
    }
    else {
      TransactionManager transactionManager = getTransactionManager();
      if (transactionManager == null) {
        throw new JbpmException("cannot honor rollback request without transaction manager");
      }
      if (log.isDebugEnabled()) log.debug("marking external transaction for rollback");
      try {
        transactionManager.setRollbackOnly();
      }
      catch (SystemException e) {
        return e;
      }
    }
    return null;
  }

  public boolean isJtaTxCreated() {
    return !isTransactionManagedExternally();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy