package org.hibernate.test.cache.infinispan.util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.Synchronization;
import javax.transaction.SystemException;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
import org.hibernate.engine.transaction.spi.IsolationDelegate;
import org.hibernate.engine.transaction.spi.TransactionObserver;
import org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate;
import org.hibernate.resource.transaction.backend.jta.internal.StatusTranslator;
import org.hibernate.resource.transaction.spi.SynchronizationRegistry;
import org.hibernate.resource.transaction.spi.TransactionCoordinator;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder;
import org.hibernate.resource.transaction.spi.TransactionStatus;
import org.infinispan.transaction.tm.BatchModeTransactionManager;
import org.infinispan.transaction.tm.DummyTransaction;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Mocks transaction coordinator when {@link org.hibernate.engine.spi.SharedSessionContractImplementor} is only mocked
* and {@link org.infinispan.transaction.tm.BatchModeTransactionManager} is used.
*
* @author Radim Vansa <rvansa@redhat.com>
*/
public class BatchModeTransactionCoordinator implements TransactionCoordinator {
private BatchModeTransactionManager tm = BatchModeTransactionManager.getInstance();;
private TransactionDriver transactionDriver = new TransactionDriver() {
@Override
public void begin() {
try {
tm.begin();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void commit() {
try {
tm.commit();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void rollback() {
try {
tm.rollback();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public TransactionStatus getStatus() {
try {
DummyTransaction transaction = tm.getTransaction();
return transaction == null ? TransactionStatus.NOT_ACTIVE : StatusTranslator.translate(transaction.getStatus());
} catch (SystemException e) {
throw new RuntimeException(e);
}
}
@Override
public void markRollbackOnly() {
throw new UnsupportedOperationException();
}
};;
@Override
public void explicitJoin() {
}
@Override
public boolean isJoined() {
return true;
}
@Override
public void pulse() {
}
@Override
public TransactionDriver getTransactionDriverControl() {
return transactionDriver;
}
@Override
public SynchronizationRegistry getLocalSynchronizations() {
return new SynchronizationRegistry() {
@Override
public void registerSynchronization(Synchronization synchronization) {
try {
BatchModeTransactionManager.getInstance().getTransaction().registerSynchronization(synchronization);
} catch (RollbackException e) {
throw new RuntimeException(e);
} catch (SystemException e) {
throw new RuntimeException(e);
}
}
};
}
@Override
public boolean isActive() {
try {
return BatchModeTransactionManager.getInstance().getStatus() == Status.STATUS_ACTIVE;
} catch (SystemException e) {
return false;
}
}
@Override
public IsolationDelegate createIsolationDelegate() {
Connection connection = mock(Connection.class);
JdbcConnectionAccess jdbcConnectionAccess = mock(JdbcConnectionAccess.class);
try {
when(jdbcConnectionAccess.obtainConnection()).thenReturn(connection);
} catch (SQLException e) {
}
return new JtaIsolationDelegate(jdbcConnectionAccess, mock(SqlExceptionHelper.class), tm);
}
@Override
public void addObserver(TransactionObserver observer) {
throw new UnsupportedOperationException();
}
@Override
public void removeObserver(TransactionObserver observer) {
throw new UnsupportedOperationException();
}
@Override
public TransactionCoordinatorBuilder getTransactionCoordinatorBuilder() {
throw new UnsupportedOperationException();
}
@Override
public void setTimeOut(int seconds) {
throw new UnsupportedOperationException();
}
@Override
public int getTimeOut() {
throw new UnsupportedOperationException();
}
public Transaction newTransaction() {
return new BatchModeTransaction();
}
public class BatchModeTransaction implements Transaction {
@Override
public void begin() {
}
@Override
public void commit() {
transactionDriver.commit();
}
@Override
public void rollback() {
transactionDriver.rollback();
}
@Override
public void setRollbackOnly() {
}
@Override
public boolean getRollbackOnly() {
return false;
}
@Override
public boolean isActive() {
return false;
}
@Override
public TransactionStatus getStatus() {
return transactionDriver.getStatus();
}
@Override
public void registerSynchronization(Synchronization synchronization) throws HibernateException {
getLocalSynchronizations().registerSynchronization(synchronization);
}
@Override
public void setTimeout(int seconds) {
}
@Override
public int getTimeout() {
return 0;
}
@Override
public void markRollbackOnly() {
transactionDriver.markRollbackOnly();
}
}
}