package com.buschmais.xo.neo4j.remote.impl.datastore;
import org.neo4j.driver.v1.Session;
import org.neo4j.driver.v1.StatementRunner;
import org.neo4j.driver.v1.Transaction;
import com.buschmais.xo.api.XOException;
import com.buschmais.xo.spi.datastore.DatastoreTransaction;
public class RemoteDatastoreTransaction implements DatastoreTransaction {
private Session session;
private Transaction transaction = null;
public RemoteDatastoreTransaction(Session session) {
this.session = session;
}
@Override
public void begin() {
if (transaction != null) {
throw new XOException("There is already an existing transaction.");
}
this.transaction = session.beginTransaction();
}
@Override
public void commit() {
assertTransaction();
try {
this.transaction.success();
} finally {
close();
}
}
@Override
public void rollback() {
assertTransaction();
try {
this.transaction.failure();
} finally {
close();
}
}
private void close() {
assertTransaction();
this.transaction.close();
this.transaction = null;
}
private void assertTransaction() {
if (transaction == null) {
throw new XOException("There is no existing transaction.");
}
}
@Override
public boolean isActive() {
return transaction != null && transaction.isOpen();
}
public StatementRunner getStatementRunner() {
return transaction != null ? transaction : session;
}
}