/* * 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.core.util.xa; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.transaction.Status; import javax.transaction.xa.Xid; public abstract class AbstractXAResourceManager<T extends AbstractXaTransactionContext> extends AbstractResourceManager { protected Map<Xid, T> suspendedContexts = new ConcurrentHashMap<Xid, T>(); protected Map<Xid, T> activeContexts = new ConcurrentHashMap<Xid, T>(); public AbstractXAResourceManager() { super(); } public int prepareTransaction(T context) throws ResourceManagerException { assureReady(); synchronized (context) { if (logger.isDebugEnabled()) { logger.debug("Preparing transaction " + context); } context.status = Status.STATUS_PREPARING; int status = doPrepare(context); context.status = Status.STATUS_PREPARED; if (logger.isDebugEnabled()) { logger.debug("Prepared transaction " + context); } return status; } } protected abstract int doPrepare(T context) throws ResourceManagerException; protected T getTransactionalResource(Xid xid) { T context = getActiveTransactionalResource(xid); if (context != null) { return context; } else { return getSuspendedTransactionalResource(xid); } } T getActiveTransactionalResource(Xid xid) { return activeContexts.get(xid); } T getSuspendedTransactionalResource(Xid xid) { return suspendedContexts.get(xid); } void addActiveTransactionalResource(Xid xid, T context) { activeContexts.put(xid, context); } void addSuspendedTransactionalResource(Xid xid, T context) { suspendedContexts.put(xid, context); } void removeActiveTransactionalResource(Xid xid) { activeContexts.remove(xid); } void removeSuspendedTransactionalResource(Xid xid) { suspendedContexts.remove(xid); } }