/**
*
*/
package com.mysema.rdfbean.tapestry;
import org.apache.tapestry5.ioc.Invocation;
import org.apache.tapestry5.ioc.MethodAdvice;
import com.mysema.rdfbean.model.RDFBeanTransaction;
import com.mysema.rdfbean.object.FlushMode;
import com.mysema.rdfbean.object.Session;
import com.mysema.rdfbean.object.SimpleSessionContext;
/**
* @author tiwe
*/
public final class TransactionalMethodAdvice implements MethodAdvice {
private final TransactionalAdvisor transactionalAdvisor;
private final SimpleSessionContext sessionContext;
public TransactionalMethodAdvice(TransactionalAdvisor transactionalAdvisor, SimpleSessionContext sessionContext) {
this.transactionalAdvisor = transactionalAdvisor;
this.sessionContext = sessionContext;
}
@Override
public void advise(Invocation invocation) {
boolean inSession = false;
boolean inTx = false;
if (this.sessionContext.getCurrentSession() != null) {
inSession = true;
Session session = sessionContext.getCurrentSession();
inTx = session.getTransaction() != null && session.getTransaction().isActive();
}
if (!inTx) {
Session session = sessionContext.getOrCreateSession();
FlushMode savedFlushMode = session.getFlushMode();
try {
RDFBeanTransaction txn = transactionalAdvisor.doBegin(session);
try {
invocation.proceed();
} catch (RuntimeException e) {
transactionalAdvisor.doRollback(txn);
throw e;
}
// checked exception
if (invocation.isFail()) {
transactionalAdvisor.doRollback(txn);
invocation.rethrow();
}
if (!txn.isRollbackOnly()) {
transactionalAdvisor.doCommit(session, txn);
} else {
transactionalAdvisor.doRollback(txn);
}
} finally {
session.setFlushMode(savedFlushMode);
sessionContext.releaseSession();
if (!inSession) {
session.close();
}
}
} else {
invocation.proceed();
}
}
}