package org.jboss.seam.transaction; import static org.jboss.seam.annotations.Install.BUILT_IN; import java.util.Stack; import javax.transaction.Synchronization; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.intercept.BypassInterceptors; /** * This implementation does not have access to the JTA TransactionManager, so it * is not fully aware of container managed transaction lifecycle, and is not * able to register Synchronizations with a container managed transaction. * * @author Gavin King * */ @Name("org.jboss.seam.transaction.synchronizations") @Scope(ScopeType.EVENT) @Install(precedence = BUILT_IN) @BypassInterceptors public class SeSynchronizations implements Synchronizations { protected Stack<SynchronizationRegistry> synchronizations = new Stack<SynchronizationRegistry>(); public void afterTransactionBegin() { synchronizations.push(new SynchronizationRegistry()); } public void afterTransactionCommit(boolean success) { if (!synchronizations.isEmpty()) { synchronizations.pop().afterTransactionCompletion(success); } } public void afterTransactionRollback() { if (!synchronizations.isEmpty()) { synchronizations.pop().afterTransactionCompletion(false); } } public void beforeTransactionCommit() { if (!synchronizations.isEmpty()) { synchronizations.peek().beforeTransactionCompletion(); } } public void registerSynchronization(Synchronization sync) { if (synchronizations.isEmpty()) { throw new IllegalStateException("Transaction begin not detected, try installing transaction:ejb-transaction in components.xml"); } else { synchronizations.peek().registerSynchronization(sync); } } public boolean isAwareOfContainerTransactions() { return false; } }