package org.yajul.jta; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yajul.util.ReflectionUtil; import javax.transaction.Status; import javax.transaction.SystemException; import javax.transaction.TransactionManager; import java.util.Collections; import java.util.Map; /** * Useful methods for decoding JTA transaction status. 'Borrowed' from Hibernate's JTAHelper class. * <br> * User: josh * Date: Jan 12, 2010 * Time: 5:18:49 PM */ public class TransactionStatusHelper { private static final Logger log = LoggerFactory.getLogger(TransactionStatusHelper.class); private static Map<Integer, String> STATUS_TO_NAME_MAP; /** * @param status JTA transaction status code * @return true if the transaction is being rolled back, or is already rolled back */ public static boolean isRollback(int status) { switch (status) { case Status.STATUS_MARKED_ROLLBACK: case Status.STATUS_ROLLING_BACK: case Status.STATUS_ROLLEDBACK: return true; default: return false; } } /** * @param status JTA transaction status code * @return true if the transaction is in progress */ public static boolean isInProgress(int status) { return status == Status.STATUS_ACTIVE || status == Status.STATUS_MARKED_ROLLBACK; } /** * @param status JTA transaction status code * @return the string name of the status */ public static String asName(int status) { synchronized (TransactionStatusHelper.class) { if (STATUS_TO_NAME_MAP == null) STATUS_TO_NAME_MAP = Collections.unmodifiableMap(ReflectionUtil.getConstantNameMap(Status.class)); } return STATUS_TO_NAME_MAP.get(status); } /** * @param txm the transaction manager * @return the string name of the current transaction's status */ public static String asName(TransactionManager txm) { return asName(getStatus(txm)); } public static boolean isInProgress(TransactionManager txm) { return isInProgress(getStatus(txm)); } public static int getStatus(TransactionManager txm) { try { return txm.getStatus(); } catch (SystemException e) { log.error("Unexpected: " + e, e); return Status.STATUS_UNKNOWN; } } }