/* * 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.datastore.neo4j.remote.http.transaction.impl; import javax.transaction.Synchronization; import org.hibernate.ogm.datastore.neo4j.remote.http.impl.HttpNeo4jClient; import org.hibernate.ogm.datastore.neo4j.remote.http.impl.HttpNeo4jDatastoreProvider; import org.hibernate.ogm.datastore.neo4j.transaction.impl.BaseNeo4jJtaTransactionCoordinator; import org.hibernate.ogm.datastore.neo4j.transaction.impl.Neo4jSynchronization; import org.hibernate.ogm.datastore.neo4j.transaction.impl.RemoteTransactionDriver; import org.hibernate.ogm.transaction.impl.ForwardingTransactionCoordinator; import org.hibernate.resource.transaction.TransactionCoordinator; /** * A {@link TransactionCoordinator} for a remote Neo4j. * * Note that during a JTA transaction Neo4j {@link HttpNeo4jTransaction} are * synchronized using the {@link Synchronization} interface. A commit to the Neo4j transaction will happen before the * end of the JTA transaction, meaning that it won't be possible to roll-back if an error happen after successful commit * to the db. * * @author Davide D'Alto */ public class HttpNeo4jJtaTransactionCoordinator extends ForwardingTransactionCoordinator implements BaseNeo4jJtaTransactionCoordinator { private final HttpNeo4jClient remoteNeo4j; private HttpNeo4jTransaction tx; public HttpNeo4jJtaTransactionCoordinator(TransactionCoordinator delegate, HttpNeo4jDatastoreProvider provider) { super( delegate ); this.remoteNeo4j = provider.getClient(); } @Override public TransactionDriver getTransactionDriverControl() { return new RemoteTransactionDriver( this, super.getTransactionDriverControl() ); } @Override public void explicitJoin() { super.explicitJoin(); join(); } @Override public void pulse() { super.pulse(); join(); } @Override public void join() { if ( tx == null && delegate.isActive() && delegate.getTransactionCoordinatorBuilder().isJta() ) { beginTransaction(); delegate.getLocalSynchronizations().registerSynchronization( new Neo4jSynchronization( this ) ); } } @Override public void success() { if ( tx != null ) { tx.commit(); tx = null; } } @Override public void failure() { if ( tx != null ) { tx.rollback(); tx = null; } } @Override public boolean isTransactionOpen() { return tx != null; } @Override public Object getTransactionId() { if ( tx == null ) { return null; } return tx.getId(); } @Override public void beginTransaction() { tx = remoteNeo4j.beginTx(); } }