[jboss-cvs] jboss-seam/src/main/org/jboss/seam/transaction ...

Gavin King gavin.king at jboss.com
Wed May 30 16:16:00 EDT 2007


  User: gavin   
  Date: 07/05/30 16:16:00

  Added:       src/main/org/jboss/seam/transaction       
                        EJBTransaction.java LocalTransactionListener.java
                        NoTransaction.java Transaction.java
                        TransactionListener.java UTTransaction.java
                        UserTransaction.java
  Log:
  refactor
  
  Revision  Changes    Path
  1.1      date: 2007/05/30 20:16:00;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/EJBTransaction.java
  
  Index: EJBTransaction.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import javax.ejb.EJBContext;
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.NotSupportedException;
  import javax.transaction.RollbackException;
  import javax.transaction.Status;
  import javax.transaction.SystemException;
  
  /**
   * Wraps EJBContext transaction management in a
   * UserTransaction interface.
   * 
   * @author Mike Youngstrom
   * @author Gavin King
   * 
   */
  public class EJBTransaction extends UserTransaction
  {
     
     private EJBContext ejbContext;
     
  
     public EJBTransaction(EJBContext ejbContext)
     {
        this.ejbContext = ejbContext;
     }
  
     public void begin() throws NotSupportedException, SystemException
     {
        throw new UnsupportedOperationException();
     }
  
     public void commit() throws RollbackException, HeuristicMixedException,
              HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
     {
        throw new UnsupportedOperationException();
     }
  
     public int getStatus() throws SystemException
     {
        try
        {
           if ( !ejbContext.getRollbackOnly() )
           {
              return Status.STATUS_ACTIVE;
           }
           else
           {
              return Status.STATUS_MARKED_ROLLBACK;
           }
        }
        catch (IllegalStateException ise)
        {
           return Status.STATUS_NO_TRANSACTION;
        }
     }
  
     public void rollback() throws IllegalStateException, SecurityException, SystemException
     {
        throw new UnsupportedOperationException();
     }
  
     public void setRollbackOnly() throws IllegalStateException, SystemException
     {
        ejbContext.setRollbackOnly();
     }
  
     public void setTransactionTimeout(int timeout) throws SystemException
     {
        throw new UnsupportedOperationException();
     }
  
  }
  
  
  
  1.1      date: 2007/05/30 20:16:00;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/LocalTransactionListener.java
  
  Index: LocalTransactionListener.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import javax.ejb.Local;
  
  @Local
  public interface LocalTransactionListener
  {
     public void scheduleEvent(String type, Object... parameters);
     public void destroy();
  }
  
  
  
  1.1      date: 2007/05/30 20:16:00;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/NoTransaction.java
  
  Index: NoTransaction.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.NotSupportedException;
  import javax.transaction.RollbackException;
  import javax.transaction.Status;
  import javax.transaction.SystemException;
  
  /**
   * When no kind of transaction management
   * exists.
   * 
   * @author Mike Youngstrom
   * @author Gavin King
   * 
   */
  public class NoTransaction extends UserTransaction
  {
     
     public void begin() throws NotSupportedException, SystemException
     {
        throw new UnsupportedOperationException();
     }
  
     public void commit() throws RollbackException, HeuristicMixedException,
              HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
     {
        throw new UnsupportedOperationException();
     }
  
     public int getStatus() throws SystemException
     {
        return Status.STATUS_NO_TRANSACTION;
     }
  
     public void rollback() throws IllegalStateException, SecurityException, SystemException
     {
        throw new UnsupportedOperationException();
     }
  
     public void setRollbackOnly() throws IllegalStateException, SystemException
     {
        throw new UnsupportedOperationException();
     }
  
     public void setTransactionTimeout(int timeout) throws SystemException
     {
        throw new UnsupportedOperationException();
     }
  
  }
  
  
  
  1.1      date: 2007/05/30 20:16:00;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/Transaction.java
  
  Index: Transaction.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import static org.jboss.seam.annotations.Install.BUILT_IN;
  
  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.contexts.Contexts;
  import org.jboss.seam.util.EJB;
  import org.jboss.seam.util.Naming;
  
  /**
   * Abstracts all possible transaction management APIs
   * behind a JTA-compatible interface.
   * 
   * @author Mike Youngstrom
   * @author Gavin King
   * 
   */
  @Name("org.jboss.seam.transaction.transaction")
  @Scope(ScopeType.STATELESS)
  @Install(precedence=BUILT_IN)
  public class Transaction
  {
  
     private static final String STANDARD_USER_TRANSACTION_NAME = "java:comp/UserTransaction";
  
     private static String userTransactionName = "UserTransaction";
  
     public static void setUserTransactionName(String name)
     {
        userTransactionName = name;
     }
  
     public static String getUserTransactionName()
     {
        return userTransactionName;
     }
     
     public static UserTransaction instance()
     {
        if (!Contexts.isApplicationContextActive())
        {
           throw new IllegalStateException("No application context active, cannot obtain Transaction component");
        }
        return (UserTransaction) Component.getInstance(Transaction.class, ScopeType.STATELESS);
     }
     
     @Unwrap
     public UserTransaction getTransaction() throws NamingException
     {
        try
        {
           return new UTTransaction( getUserTransaction() );
        }
        catch (NameNotFoundException nnfe)
        {
           try
           {
              return new EJBTransaction( EJB.getEJBContext() );
           }
           catch (NameNotFoundException nnfe2)
           {
              return new NoTransaction();
           }
        }
     }
  
     private static javax.transaction.UserTransaction getUserTransaction() throws NamingException
     {
        try
        {
           return (javax.transaction.UserTransaction) Naming.getInitialContext().lookup(userTransactionName);
        }
        catch (NameNotFoundException nnfe)
        {
           return (javax.transaction.UserTransaction) Naming.getInitialContext().lookup(STANDARD_USER_TRANSACTION_NAME);
        }
     }
  
  }
  
  
  
  1.1      date: 2007/05/30 20:16:00;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/TransactionListener.java
  
  Index: TransactionListener.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import static org.jboss.seam.annotations.Install.BUILT_IN;
  
  import java.rmi.RemoteException;
  import java.util.ArrayList;
  import java.util.List;
  
  import javax.ejb.EJBException;
  import javax.ejb.Remove;
  import javax.ejb.SessionSynchronization;
  import javax.ejb.Stateful;
  
  import org.jboss.seam.Component;
  import org.jboss.seam.ScopeType;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.contexts.Contexts;
  import org.jboss.seam.core.Events;
  
  /**
   * Temporary solution for getting JTA transaction lifecycle
   * callbacks. Once all appservers support the new EE5 APIs,
   * this will be removed.
   * 
   * @author Gavin King
   *
   */
  @Stateful
  @Scope(ScopeType.EVENT)
  @Name("org.jboss.seam.transaction.transactionListener")
  @Install(value=false, precedence=BUILT_IN)
  public class TransactionListener implements LocalTransactionListener, SessionSynchronization
  {
     static class Event
     {
        private String type;
        private Object[] parameters;
        
        public Event(String type, Object[] parameters)
        {
           this.type = type;
           this.parameters = parameters;
        }
        public void call()
        {
           Events.instance().raiseEvent(type, parameters);
        }
     }
  
     private List<Event> events = new ArrayList<Event>();
     
     public static LocalTransactionListener instance()
     {
        if ( !Contexts.isEventContextActive() )
        {
           throw new IllegalStateException("no event context active");
        }
        return (LocalTransactionListener) Component.getInstance(TransactionListener.class, ScopeType.EVENT);         
     }
     
     public void afterBegin() throws EJBException, RemoteException
     {
     }
     
     public void scheduleEvent(String type, Object... parameters)
     {
        events.add( new Event(type, parameters) );
     }
  
     public void afterCompletion(boolean success) throws EJBException, RemoteException
     {
        try
        {
           if (success)
           {
              for (Event event: events) event.call();
           }
        }
        finally
        {
           events.clear();
        }
     }
  
     public void beforeCompletion() throws EJBException, RemoteException
     {
     }
     
     @Remove @Destroy
     public void destroy() {}
  
  }
  
  
  
  1.1      date: 2007/05/30 20:16:00;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/UTTransaction.java
  
  Index: UTTransaction.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import javax.transaction.HeuristicMixedException;
  import javax.transaction.HeuristicRollbackException;
  import javax.transaction.NotSupportedException;
  import javax.transaction.RollbackException;
  import javax.transaction.SystemException;
  
  /**
   * Wraps EJBContext transaction management in a
   * UserTransaction interface.
   * 
   * @author Mike Youngstrom
   * @author Gavin King
   * 
   */
  public class UTTransaction extends UserTransaction
  {
     
     private javax.transaction.UserTransaction delegate;
  
     UTTransaction(javax.transaction.UserTransaction delegate)
     {
        this.delegate = delegate;
     }
     
     public void begin() throws NotSupportedException, SystemException
     {
        delegate.begin();
     }
  
     public void commit() throws RollbackException, HeuristicMixedException,
              HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
     {
        delegate.commit();
     }
  
     public int getStatus() throws SystemException
     {
        return delegate.getStatus();
     }
  
     public void rollback() throws IllegalStateException, SecurityException, SystemException
     {
        delegate.rollback();
     }
  
     public void setRollbackOnly() throws IllegalStateException, SystemException
     {
        delegate.setRollbackOnly();
     }
  
     public void setTransactionTimeout(int timeout) throws SystemException
     {
        delegate.setTransactionTimeout(timeout);
     }
  
  }
  
  
  
  1.1      date: 2007/05/30 20:16:00;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/UserTransaction.java
  
  Index: UserTransaction.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import static javax.transaction.Status.STATUS_ACTIVE;
  import static javax.transaction.Status.STATUS_MARKED_ROLLBACK;
  
  import javax.transaction.SystemException;
  
  /**
   * Extends the standard UserTransaction interface with a couple 
   * of helpful methods.
   * 
   * @author Gavin King
   * 
   */
  public abstract class UserTransaction implements javax.transaction.UserTransaction
  {
     
     public boolean isActive() throws SystemException
     {
        return getStatus() == STATUS_ACTIVE;
     }
  
     public boolean isActiveOrMarkedRollback() throws SystemException
     {
        int status = getStatus();
        return status == STATUS_ACTIVE || status == STATUS_MARKED_ROLLBACK;
     }
  
     public boolean isMarkedRollback() throws SystemException
     {
        return getStatus() == STATUS_MARKED_ROLLBACK;
     }
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list