/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.model;
import com.mysema.commons.lang.Assert;
/**
* MultiTransaction is the RDFBeanTransaction of MultiConnection
*
* @author tiwe
* @version $Id$
*/
public class MultiTransaction implements RDFBeanTransaction {
private boolean rollbackOnly = false;
private final MultiConnection connection;
private final RDFBeanTransaction[] transactions;
public MultiTransaction(MultiConnection connection, RDFBeanTransaction[] transactions) {
this.connection = Assert.notNull(connection, "connection");
this.transactions = Assert.notNull(transactions, "transactions");
if (transactions.length == 0) {
throw new IllegalArgumentException("No transactions given");
}
}
@Override
public void commit() {
if (rollbackOnly) {
throw new RepositoryException("Transaction is rollBackOnly");
}
try {
prepare();
} catch (RuntimeException e) {
rollback();
throw new RepositoryException(e);
}
try {
for (RDFBeanTransaction tx : transactions) {
tx.commit();
}
} finally {
connection.cleanUpAfterCommit();
}
}
@Override
public boolean isActive() {
return transactions[0].isActive();
}
@Override
public boolean isRollbackOnly() {
return rollbackOnly;
}
@Override
public void rollback() {
try {
for (RDFBeanTransaction tx : transactions) {
tx.rollback();
}
} finally {
connection.cleanUpAfterCommit();
}
}
@Override
public void setRollbackOnly() {
this.rollbackOnly = true;
for (RDFBeanTransaction tx : transactions) {
tx.setRollbackOnly();
}
}
@Override
public void prepare() {
for (RDFBeanTransaction tx : transactions) {
tx.prepare();
}
}
}