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

Gavin King gavin.king at jboss.com
Sun Jun 24 15:40:33 EDT 2007


  User: gavin   
  Date: 07/06/24 15:40:33

  Modified:    src/main/org/jboss/seam/transaction   EntityTransaction.java
                        HibernateTransaction.java
  Log:
  fix synchronizations for resource-local txns
  more logging
  
  Revision  Changes    Path
  1.6       +35 -5     jboss-seam/src/main/org/jboss/seam/transaction/EntityTransaction.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: EntityTransaction.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/transaction/EntityTransaction.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -b -r1.5 -r1.6
  --- EntityTransaction.java	24 Jun 2007 06:34:34 -0000	1.5
  +++ EntityTransaction.java	24 Jun 2007 19:40:33 -0000	1.6
  @@ -12,11 +12,15 @@
   import javax.transaction.SystemException;
   
   import org.jboss.seam.ScopeType;
  +import org.jboss.seam.annotations.Create;
   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;
   import org.jboss.seam.core.Expressions.ValueExpression;
  +import org.jboss.seam.log.LogProvider;
  +import org.jboss.seam.log.Logging;
  +import org.jboss.seam.persistence.PersistenceProvider;
   
   /**
    * Support for the JPA EntityTransaction API.
  @@ -33,10 +37,21 @@
   @BypassInterceptors
   public class EntityTransaction extends AbstractUserTransaction
   {
  +   private static final LogProvider log = Logging.getLogProvider(EntityTransaction.class);
  +   
      private SynchronizationRegistry synchronizations = new SynchronizationRegistry();
      private ValueExpression<EntityManager> entityManager;
      private EntityManager currentEntityManager;
      
  +   @Create
  +   public void validate()
  +   {
  +      if (entityManager==null)
  +      {
  +         throw new IllegalStateException("entity manager reference not set, use <transaction:entity-transaction entity-manager=...");
  +      }
  +   }
  +   
      private javax.persistence.EntityTransaction getDelegate()
      {
         if (currentEntityManager==null)
  @@ -58,6 +73,7 @@
   
      public void begin() throws NotSupportedException, SystemException
      {
  +      log.debug("beginning JPA resource-local transaction");
         //TODO: translate exceptions that occur into the correct JTA exception
         assertNotActive();
         initEntityManager();
  @@ -75,11 +91,13 @@
      public void commit() throws RollbackException, HeuristicMixedException,
               HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
      {
  +      log.debug("committing JPA resource-local transaction");
         assertActive();
  +      javax.persistence.EntityTransaction delegate = getDelegate();
  +      clearEntityManager();
         boolean success = false;
         try
         {
  -         javax.persistence.EntityTransaction delegate = getDelegate();
            if ( delegate.getRollbackOnly() )
            {
               delegate.rollback();
  @@ -94,28 +112,30 @@
         }
         finally
         {
  -         clearEntityManager();
            synchronizations.afterTransactionCompletion(success);
         }
      }
   
      public void rollback() throws IllegalStateException, SecurityException, SystemException
      {
  +      log.debug("rolling back JPA resource-local transaction");
         //TODO: translate exceptions that occur into the correct JTA exception
         assertActive();
  +      javax.persistence.EntityTransaction delegate = getDelegate();
  +      clearEntityManager();
         try
         {
  -         getDelegate().rollback();
  +         delegate.rollback();
         }
         finally
         {
  -         clearEntityManager();
            synchronizations.afterTransactionCompletion(false);
         }
      }
   
      public void setRollbackOnly() throws IllegalStateException, SystemException
      {
  +      log.debug("marking JPA resource-local transaction for rollback");
         assertActive();
         getDelegate().setRollbackOnly();
      }
  @@ -170,9 +190,19 @@
      @Override
      public void registerSynchronization(Synchronization sync)
      {
  +      if ( log.isDebugEnabled() )
  +      {
  +         log.debug("registering synchronization: " + sync);
  +      }
         assertActive();
  +      //try to register the synchronization directly with the
  +      //persistence provider, but if this fails, just hold
  +      //on to it myself
  +      if ( !PersistenceProvider.instance().registerSynchronization(sync, currentEntityManager) )
  +      {
         synchronizations.registerSynchronization(sync);
      }
  +   }
   
      @Override
      public boolean isConversationContextRequired()
  
  
  
  1.5       +33 -20    jboss-seam/src/main/org/jboss/seam/transaction/HibernateTransaction.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: HibernateTransaction.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/transaction/HibernateTransaction.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -b -r1.4 -r1.5
  --- HibernateTransaction.java	24 Jun 2007 06:34:34 -0000	1.4
  +++ HibernateTransaction.java	24 Jun 2007 19:40:33 -0000	1.5
  @@ -11,12 +11,16 @@
   import javax.transaction.SystemException;
   
   import org.hibernate.Session;
  +import org.hibernate.Transaction;
   import org.jboss.seam.ScopeType;
  +import org.jboss.seam.annotations.Create;
   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;
   import org.jboss.seam.core.Expressions.ValueExpression;
  +import org.jboss.seam.log.LogProvider;
  +import org.jboss.seam.log.Logging;
   
   /**
    * Support for the Hibernate Transaction API.
  @@ -33,11 +37,21 @@
   @BypassInterceptors
   public class HibernateTransaction extends AbstractUserTransaction
   {
  +   private static final LogProvider log = Logging.getLogProvider(HibernateTransaction.class);
   
      private ValueExpression<Session> session;
      private Session currentSession;
      private boolean rollbackOnly; //Hibernate Transaction doesn't have a "rollback only" state
      
  +   @Create
  +   public void validate()
  +   {
  +      if (session==null)
  +      {
  +         throw new IllegalStateException("session reference not set, use <transaction:hibernate-transaction session=...");
  +      }
  +   }
  +   
      private org.hibernate.Transaction getDelegate()
      {
         if (currentSession==null)
  @@ -59,6 +73,7 @@
   
      public void begin() throws NotSupportedException, SystemException
      {
  +      log.debug("beginning Hibernate transaction");
         assertNotActive();
         initSession();
         try
  @@ -75,41 +90,35 @@
      public void commit() throws RollbackException, HeuristicMixedException,
               HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
      {
  +      log.debug("committing Hibernate transaction");
  +      //TODO: translate exceptions that occur into the correct JTA exception
         assertActive();
  -      try
  -      {
  +      Transaction delegate = getDelegate();
  +      clearSession();
            if (rollbackOnly)
            {
  -            getDelegate().rollback();
  +         delegate.rollback();
               throw new RollbackException();
            }
            else
            {
  -            getDelegate().commit();
  -         }
  -      }
  -      finally
  -      {
  -         clearSession();
  +         delegate.commit();
         }
      }
   
      public void rollback() throws IllegalStateException, SecurityException, SystemException
      {
  +      log.debug("rolling back Hibernate transaction");
         //TODO: translate exceptions that occur into the correct JTA exception
         assertActive();
  -      try
  -      {
  -         getDelegate().rollback();
  -      }
  -      finally
  -      {
  +      Transaction delegate = getDelegate();
            clearSession();
  -      }
  +      delegate.rollback();
      }
   
      public void setRollbackOnly() throws IllegalStateException, SystemException
      {
  +      log.debug("marking Hibernate transaction for rollback");
         assertActive();
         rollbackOnly = true;
      }
  @@ -166,6 +175,10 @@
      @Override
      public void registerSynchronization(Synchronization sync)
      {
  +      if ( log.isDebugEnabled() )
  +      {
  +         log.debug("registering synchronization: " + sync);
  +      }
         assertActive();
         getDelegate().registerSynchronization(sync);
      }
  
  
  



More information about the jboss-cvs-commits mailing list