/* * Copyright (c) 2009 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.tapestry; import java.lang.reflect.Method; import org.apache.tapestry5.ioc.MethodAdvice; import org.apache.tapestry5.ioc.MethodAdviceReceiver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.NotTransactional; import org.springframework.transaction.annotation.Transactional; import com.mysema.rdfbean.model.RDFBeanTransaction; import com.mysema.rdfbean.object.FlushMode; import com.mysema.rdfbean.object.Session; import com.mysema.rdfbean.object.SessionFactory; import com.mysema.rdfbean.object.SimpleSessionContext; /** * @author tiwe */ public class TransactionalAdvisorImpl implements TransactionalAdvisor { static final Logger logger = LoggerFactory.getLogger(TransactionalAdvisorImpl.class); private final MethodAdvice advice; private final SimpleSessionContext sessionContext; public TransactionalAdvisorImpl(SessionFactory sessionFactory) { this.sessionContext = new SimpleSessionContext(sessionFactory); this.advice = new TransactionalMethodAdvice(this, sessionContext); sessionFactory.setSessionContext(sessionContext); } @SuppressWarnings("unchecked") public void addTransactionCommitAdvice(MethodAdviceReceiver receiver) { if (receiver.getInterface().getAnnotation(Transactional.class) != null) { Transactional annotation = (Transactional) receiver.getInterface().getAnnotation(Transactional.class); if (isIntercepted(annotation)) { for (Method m : receiver.getInterface().getMethods()) { if (m.getAnnotation(NotTransactional.class) == null) { receiver.adviseMethod(m, advice); } } } } else { for (Method m : receiver.getInterface().getMethods()) { if (m.getAnnotation(Transactional.class) != null) { Transactional annotation = m.getAnnotation(Transactional.class); if (isIntercepted(annotation)) { receiver.adviseMethod(m, advice); } } } } } private boolean isIntercepted(Transactional annotation) { switch (annotation.propagation()) { case NOT_SUPPORTED: case NEVER: case SUPPORTS: return false; default: return true; } } public RDFBeanTransaction doBegin(Session session) { RDFBeanTransaction txn = session.beginTransaction( false, // not readonly -1, // default timeout -1); // default isolation session.setFlushMode(FlushMode.COMMIT); return txn; } public void doCommit(Session session, RDFBeanTransaction txn) { RuntimeException commitException = null; try { session.flush(); txn.commit(); } catch (RuntimeException re) { doRollback(txn); commitException = re; } if (commitException != null) { throw commitException; } } public void doRollback(RDFBeanTransaction txn) { txn.rollback(); } }