/*
* 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.jta.impl;
import org.hibernate.ogm.transaction.impl.ForwardingTransactionDriver;
import org.hibernate.ogm.transaction.impl.ForwardingTransactionCoordinator;
import org.hibernate.ogm.transaction.impl.ForwardingTransactionCoordinatorBuilder;
import org.hibernate.resource.transaction.TransactionCoordinator;
import org.hibernate.resource.transaction.TransactionCoordinator.TransactionDriver;
import org.hibernate.resource.transaction.TransactionCoordinatorBuilder;
import org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner;
/**
* Decorator for JTA-based {@link TransactionCoordinatorBuilder}s.
* <p>
* Used with the {@code RESOURCE_LOCAL} transaction strategy in case we need to actually use JTA for the given backend.
* In that case the user cannot roll back the transaction themselves upon commit failures (as ORM will only allow that
* for the transaction states {@code ACTIVE} and {@code FAILED_COMMIT}, whereas it will be {@code MARKED_ROLLBACK} in
* this case. This implementation does the rollback in this situation.
*
* @author Gunnar Morling
*/
public class RollbackOnCommitFailureJtaTransactionCoordinatorBuilder extends ForwardingTransactionCoordinatorBuilder {
public RollbackOnCommitFailureJtaTransactionCoordinatorBuilder(TransactionCoordinatorBuilder delegate) {
super( delegate );
}
@Override
public TransactionCoordinator buildTransactionCoordinator(TransactionCoordinatorOwner owner, TransactionCoordinatorOptions options) {
return new RollbackOnCommitTransactionCoordinator( super.buildTransactionCoordinator( owner, options ) );
}
private static class RollbackOnCommitTransactionCoordinator extends ForwardingTransactionCoordinator {
public RollbackOnCommitTransactionCoordinator(TransactionCoordinator delegate) {
super( delegate );
}
@Override
public TransactionDriver getTransactionDriverControl() {
return new RollbackOnCommitFailureTransactionDriver( super.getTransactionDriverControl() );
}
}
private static class RollbackOnCommitFailureTransactionDriver extends ForwardingTransactionDriver {
public RollbackOnCommitFailureTransactionDriver(TransactionDriver delegate) {
super( delegate );
}
@Override
public void commit() {
try {
super.commit();
}
catch (Exception e) {
try {
rollback();
}
catch (Exception rollbackException) {
}
throw e;
}
}
}
}