package org.springmodules.prevayler;
import org.apache.log4j.Logger;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
import org.springframework.transaction.support.DefaultTransactionStatus;
import org.springframework.transaction.support.SmartTransactionObject;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* Prevayler {@link org.springframework.transaction.support.AbstractPlatformTransactionManager} implementation
* based on {@link PersistenceManager}s.
*
* @author Sergio Bossa
*/
public class PrevaylerTransactionManager extends AbstractPlatformTransactionManager {
private static final Logger logger = Logger.getLogger(PrevaylerTransactionManager.class);
private PersistenceManager persistenceManager;
public PrevaylerTransactionManager() {}
public PrevaylerTransactionManager(PersistenceManager persistenceManager) {
this.persistenceManager = persistenceManager;
}
public PersistenceManager getPersistenceManager() {
return this.persistenceManager;
}
public void setPersistenceManager(PersistenceManager persistenceManager) {
this.persistenceManager = persistenceManager;
}
protected void doBegin(Object transaction, TransactionDefinition transactionDefinition) throws TransactionException {
PrevaylerTransactionObject txObject = (PrevaylerTransactionObject) transaction;
Session session = this.persistenceManager.createTransaction();
TransactionSynchronizationManager.bindResource(persistenceManager, session);
txObject.setSession(session);
}
protected void doCommit(DefaultTransactionStatus defaultTransactionStatus) throws TransactionException {
PrevaylerTransactionObject txObject = (PrevaylerTransactionObject) defaultTransactionStatus.getTransaction();
Session session = txObject.getSession();
if (defaultTransactionStatus.isDebug()) {
logger.debug("Committing transaction in session: " + session);
}
this.persistenceManager.commitTransaction(session);
}
protected void doRollback(DefaultTransactionStatus defaultTransactionStatus) throws TransactionException {
PrevaylerTransactionObject txObject = (PrevaylerTransactionObject) defaultTransactionStatus.getTransaction();
Session session = txObject.getSession();
if (defaultTransactionStatus.isDebug()) {
logger.debug("Rolling back transaction in session: " + session);
}
this.persistenceManager.rollbackTransaction(session);
}
protected Object doGetTransaction() throws TransactionException {
Session session = (Session) TransactionSynchronizationManager.getResource(this.persistenceManager);
return new PrevaylerTransactionObject(session);
}
protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException {
PrevaylerTransactionObject txObject = (PrevaylerTransactionObject) status.getTransaction();
txObject.setRollbackOnly(true);
}
protected boolean isExistingTransaction(Object transaction) throws TransactionException {
PrevaylerTransactionObject txObject = (PrevaylerTransactionObject) transaction;
if (txObject.getSession() != null) {
return true;
}
else {
return false;
}
}
protected void doCleanupAfterCompletion(Object transaction) {
PrevaylerTransactionObject txObject = (PrevaylerTransactionObject) transaction;
TransactionSynchronizationManager.unbindResource(this.persistenceManager);
txObject.clear();
}
/** Class internals **/
private class PrevaylerTransactionObject implements SmartTransactionObject {
private Session session;
private boolean rollbackFlag;
public PrevaylerTransactionObject(Session session) {
this.session = session;
}
public void setRollbackOnly(boolean rollbackFlag) {
this.rollbackFlag = rollbackFlag;
}
public boolean isRollbackOnly() {
return this.rollbackFlag;
}
public Session getSession() {
return this.session;
}
public void setSession(Session session) {
this.session = session;
}
public void clear() {
this.session = null;
}
}
}