package org.jboss.seam.transaction;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import org.jboss.seam.Component;
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.Unwrap;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.util.EJB;
import org.jboss.seam.util.Naming;
/**
* Supports injection of a Seam UserTransaction object that
* wraps the current JTA transaction or EJB container managed
* transaction.
*
* @author Mike Youngstrom
* @author Gavin King
*
*/
@Name("org.jboss.seam.transaction.transaction")
@Scope(ScopeType.EVENT)
@Install(precedence=BUILT_IN)
@BypassInterceptors
public class Transaction
{
// Event keys
public static final String TRANSACTION_FAILED = "org.jboss.seam.transaction.transactionFailed";
public static UserTransaction instance()
{
return (UserTransaction) Component.getInstance(Transaction.class, ScopeType.EVENT);
}
@Unwrap
public UserTransaction getTransaction() throws NamingException
{
try
{
return createUTTransaction();
}
catch (NameNotFoundException nnfe)
{
try
{
return createCMTTransaction();
}
catch (NameNotFoundException nnfe2)
{
return createNoTransaction();
}
}
}
protected UserTransaction createNoTransaction()
{
return new NoTransaction();
}
protected UserTransaction createCMTTransaction() throws NamingException
{
return new CMTTransaction( EJB.getEJBContext() );
}
protected UserTransaction createUTTransaction() throws NamingException
{
return new UTTransaction( getUserTransaction() );
}
protected javax.transaction.UserTransaction getUserTransaction() throws NamingException
{
InitialContext context = Naming.getInitialContext();
try
{
return (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");
}
catch (NameNotFoundException nnfe)
{
try
{
//Embedded JBoss has no java:comp/UserTransaction
javax.transaction.UserTransaction ut = (javax.transaction.UserTransaction) context.lookup("UserTransaction");
ut.getStatus(); //for glassfish, which can return an unusable UT
return ut;
}
catch (Exception e)
{
throw nnfe;
}
}
}
}