/*
* 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.processor;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.transaction.Transaction;
import org.mule.runtime.api.tx.TransactionException;
import org.mule.runtime.core.api.transaction.TransactionFactory;
import org.mule.runtime.core.config.i18n.CoreMessages;
import org.mule.runtime.core.transaction.AbstractTransaction;
/**
* Transaction placeholder to replace with proper transaction once transactional resource is discovered by mule
*/
public class DelegateTransaction extends AbstractTransaction {
private Transaction delegate = new NullTransaction();
public DelegateTransaction(MuleContext muleContext) {
super(muleContext);
}
@Override
protected void doBegin() throws TransactionException {}
@Override
protected void doCommit() throws TransactionException {
delegate.commit();
}
@Override
protected void doRollback() throws TransactionException {
delegate.rollback();
}
@Override
public int getStatus() throws TransactionException {
return delegate.getStatus();
}
@Override
public boolean isBegun() throws TransactionException {
return delegate.isBegun();
}
@Override
public boolean isRolledBack() throws TransactionException {
return delegate.isRolledBack();
}
@Override
public boolean isCommitted() throws TransactionException {
return delegate.isCommitted();
}
@Override
public Object getResource(Object key) {
return delegate.getResource(key);
}
@Override
public boolean hasResource(Object key) {
return delegate.hasResource(key);
}
@Override
public boolean supports(Object key, Object resource) {
return delegate.supports(key, resource);
}
@Override
public void bindResource(Object key, Object resource) throws TransactionException {
if (!(this.delegate instanceof NullTransaction)) {
throw new TransactionException(CoreMessages
.createStaticMessage("Single resource transaction has already a resource bound"));
}
TransactionFactory transactionFactory = muleContext.getTransactionFactoryManager().getTransactionFactoryFor(key.getClass());
this.unbindTransaction();
int timeout = delegate.getTimeout();
this.delegate = transactionFactory.beginTransaction(muleContext);
delegate.setTimeout(timeout);
delegate.bindResource(key, resource);
}
@Override
public void setRollbackOnly() throws TransactionException {
delegate.setRollbackOnly();
}
@Override
public boolean isRollbackOnly() throws TransactionException {
return delegate.isRollbackOnly();
}
@Override
public boolean isXA() {
return delegate.isXA();
}
@Override
public void resume() throws TransactionException {
delegate.resume();
}
@Override
public javax.transaction.Transaction suspend() throws TransactionException {
return delegate.suspend();
}
@Override
public String getId() {
return delegate.getId();
}
public boolean supportsInnerTransaction(Transaction transaction) {
return this.delegate instanceof NullTransaction || this.delegate == transaction;
}
@Override
public int getTimeout() {
return delegate.getTimeout();
}
@Override
public void setTimeout(int timeout) {
delegate.setTimeout(timeout);
}
private class NullTransaction implements Transaction {
private int timeout = muleContext.getConfiguration().getDefaultTransactionTimeout();
@Override
public void begin() throws TransactionException {}
@Override
public void commit() throws TransactionException {}
@Override
public void rollback() throws TransactionException {}
@Override
public int getStatus() throws TransactionException {
return Transaction.STATUS_UNKNOWN;
}
@Override
public boolean isBegun() throws TransactionException {
return false;
}
@Override
public boolean isRolledBack() throws TransactionException {
return false;
}
@Override
public boolean isCommitted() throws TransactionException {
return false;
}
@Override
public int getTimeout() {
return timeout;
}
@Override
public void setTimeout(int timeout) {
this.timeout = timeout;
}
@Override
public Object getResource(Object key) {
return null;
}
@Override
public boolean hasResource(Object key) {
return false;
}
@Override
public boolean supports(Object key, Object resource) {
return true;
}
@Override
public void bindResource(Object key, Object resource) throws TransactionException {}
@Override
public void setRollbackOnly() throws TransactionException {}
@Override
public boolean isRollbackOnly() throws TransactionException {
return false;
}
@Override
public boolean isXA() {
return false;
}
@Override
public void resume() throws TransactionException {}
@Override
public javax.transaction.Transaction suspend() throws TransactionException {
return null;
}
@Override
public String getId() {
return null;
}
}
}