/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.transaction.emulated.impl;
import org.hibernate.ConnectionAcquisitionMode;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.ogm.transaction.impl.ForwardingTransactionCoordinatorOwner;
import org.hibernate.resource.transaction.TransactionCoordinator;
import org.hibernate.resource.transaction.TransactionCoordinatorBuilder;
import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransaction;
import org.hibernate.resource.transaction.backend.jdbc.spi.JdbcResourceTransactionAccess;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner;
import org.hibernate.resource.transaction.spi.TransactionStatus;
/**
* Builds non-JTA-based {@link TransactionCoordinator}s which use a no-op {@link JdbcResourceTransaction} and
* connection. That way flushes are triggered as expected - and written to the datastore, but no actual transaction is
* involved.
*
* @author Gunnar Morling
*/
public class EmulatedLocalTransactionCoordinatorBuilder implements TransactionCoordinatorBuilder {
private final TransactionCoordinatorBuilder delegate;
public EmulatedLocalTransactionCoordinatorBuilder(TransactionCoordinatorBuilder delegate) {
this.delegate = delegate;
}
@Override
public TransactionCoordinator buildTransactionCoordinator(TransactionCoordinatorOwner owner, TransactionCoordinatorOptions options) {
return delegate.buildTransactionCoordinator( new NoopJdbcResourceTransactionCoordinatorOwner( owner ), options );
}
@Override
public boolean isJta() {
return false;
}
@Override
public ConnectionReleaseMode getDefaultConnectionReleaseMode() {
return ConnectionReleaseMode.AFTER_TRANSACTION;
}
@Override
public ConnectionAcquisitionMode getDefaultConnectionAcquisitionMode() {
return ConnectionAcquisitionMode.IMMEDIATELY;
}
/**
* Makes sure a no-op {@link JdbcResourceTransaction} is used.
*/
private static class NoopJdbcResourceTransactionCoordinatorOwner extends ForwardingTransactionCoordinatorOwner implements JdbcResourceTransactionAccess {
public NoopJdbcResourceTransactionCoordinatorOwner(TransactionCoordinatorOwner delegate) {
super( delegate );
}
@Override
public JdbcResourceTransaction getResourceLocalTransaction() {
return new NoopJdbcResourceTransaction();
}
}
/**
* No-op {@link JdbcResourceTransaction}.
*/
private static class NoopJdbcResourceTransaction implements JdbcResourceTransaction {
private TransactionStatus status;
@Override
public void begin() {
status = TransactionStatus.ACTIVE;
}
@Override
public void commit() {
status = TransactionStatus.NOT_ACTIVE;
}
@Override
public void rollback() {
status = TransactionStatus.NOT_ACTIVE;
}
@Override
public TransactionStatus getStatus() {
return status;
}
}
}