package org.jboss.seam.transaction; import java.util.ArrayList; import java.util.List; import javax.transaction.Status; import javax.transaction.Synchronization; import org.jboss.seam.core.Events; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; /** * A list of Synchronizations to be invoked before and after transaction * completion. This class is used when we can't register a synchronization * directly with JTA. * * @author Gavin King * */ class SynchronizationRegistry { private static final LogProvider log = Logging.getLogProvider(SynchronizationRegistry.class); private List<Synchronization> synchronizations = new ArrayList<Synchronization>(); void registerSynchronization(Synchronization sync) { synchronizations.add(sync); } void afterTransactionCompletion(boolean success) { if ( Events.exists() ) { Events.instance().raiseEvent("org.jboss.seam.afterTransactionCompletion", success); } for (Synchronization sync: synchronizations) { try { sync.afterCompletion(success ? Status.STATUS_COMMITTED : Status.STATUS_ROLLEDBACK); } catch (Exception e) { log.error("Exception processing transaction Synchronization after completion", e); } } synchronizations.clear(); } void beforeTransactionCompletion() { if ( Events.exists() ) { Events.instance().raiseEvent("org.jboss.seam.beforeTransactionCompletion"); } for (Synchronization sync: synchronizations) { try { sync.beforeCompletion(); } catch (Exception e) { log.error("Exception processing transaction Synchronization before completion", e); } } } }