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

Gavin King gavin.king at jboss.com
Mon Jun 25 19:59:32 EDT 2007


  User: gavin   
  Date: 07/06/25 19:59:32

  Added:       src/main/org/jboss/seam/transaction  
                        RollbackInterceptor.java
                        TransactionInterceptor.java
  Log:
  move builtin interceptors to the packages they relate to
  
  Revision  Changes    Path
  1.1      date: 2007/06/25 23:59:31;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/RollbackInterceptor.java
  
  Index: RollbackInterceptor.java
  ===================================================================
  //$Id: RollbackInterceptor.java,v 1.1 2007/06/25 23:59:31 gavin Exp $
  package org.jboss.seam.transaction;
  
  import static org.jboss.seam.ComponentType.JAVA_BEAN;
  import static org.jboss.seam.util.EJB.APPLICATION_EXCEPTION;
  import static org.jboss.seam.util.EJB.rollback;
  
  import org.jboss.seam.annotations.ApplicationException;
  import org.jboss.seam.annotations.intercept.AroundInvoke;
  import org.jboss.seam.annotations.intercept.Interceptor;
  import org.jboss.seam.intercept.AbstractInterceptor;
  import org.jboss.seam.intercept.InvocationContext;
  import org.jboss.seam.util.JSF;
  
  /**
   * Automatically sets the current transaction to rollback 
   * only when an exception is thrown.
   * 
   * @author Gavin King
   */
  @Interceptor(stateless=true)
  public class RollbackInterceptor extends AbstractInterceptor 
  {
     private static final long serialVersionUID = 5551801508325093417L;
     
     @AroundInvoke
     public Object aroundInvoke(InvocationContext invocation) throws Exception 
     {
        try
        {
           return invocation.proceed();
        }
        catch (Exception e)
        {
           if ( isRollbackRequired(e) )
           {
              try
              {
                 Transaction.instance().setRollbackOnly();
              }
              catch (Exception te) {} //swallow
           }
           throw e;
        }
     }
     
     private boolean isRollbackRequired(Exception e)
     {
        boolean isJavaBean = getComponent().getType()==JAVA_BEAN;
        Class<? extends Exception> clazz = e.getClass();
        return ( isSystemException(e, isJavaBean, clazz) ) || 
              ( isJavaBean && clazz.isAnnotationPresent(APPLICATION_EXCEPTION) && rollback( clazz.getAnnotation(APPLICATION_EXCEPTION) ) ) ||
              ( clazz.isAnnotationPresent(ApplicationException.class) && clazz.getAnnotation(ApplicationException.class).rollback() );
     }
  
     private boolean isSystemException(Exception e, boolean isJavaBean, Class<? extends Exception> clazz)
     {
        return isJavaBean && 
              (e instanceof RuntimeException) && 
              !clazz.isAnnotationPresent(APPLICATION_EXCEPTION) && 
              !clazz.isAnnotationPresent(ApplicationException.class) &&
              //TODO: this is hackish, maybe just turn off RollackInterceptor for @Converter/@Validator components
              !JSF.VALIDATOR_EXCEPTION.isInstance(e) &&
              !JSF.CONVERTER_EXCEPTION.isInstance(e);
     }
     
  }
  
  
  
  1.1      date: 2007/06/25 23:59:31;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/TransactionInterceptor.java
  
  Index: TransactionInterceptor.java
  ===================================================================
  package org.jboss.seam.transaction;
  
  import java.lang.reflect.AnnotatedElement;
  import java.lang.reflect.Method;
  
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.annotations.intercept.AroundInvoke;
  import org.jboss.seam.annotations.intercept.Interceptor;
  import org.jboss.seam.bpm.BusinessProcessInterceptor;
  import org.jboss.seam.core.BijectionInterceptor;
  import org.jboss.seam.core.ConversationInterceptor;
  import org.jboss.seam.intercept.AbstractInterceptor;
  import org.jboss.seam.intercept.InvocationContext;
  import org.jboss.seam.util.Work;
  
  /**
   * Implements transaction propagation rules for Seam JavaBean components.
   * 
   * @author Gavin King
   *
   */
  @Interceptor(stateless=true,
               around={RollbackInterceptor.class, BusinessProcessInterceptor.class, 
                       ConversationInterceptor.class, BijectionInterceptor.class})
  public class TransactionInterceptor extends AbstractInterceptor
  {
     private static final long serialVersionUID = -4364203056333738988L;
     
     @AroundInvoke
     public Object aroundInvoke(final InvocationContext invocation) throws Exception
     {
        return new Work()
        {
           
           @Override
           protected Object work() throws Exception
           {
              return invocation.proceed();
           }
           
           @Override
           protected boolean isNewTransactionRequired(boolean transactionActive)
           {
              return isNewTransactionRequired( invocation.getMethod(), getComponent().getBeanClass(), transactionActive );
           }
           
           private boolean isNewTransactionRequired(Method method, Class beanClass, boolean transactionActive)
           {
              return isTransactionAnnotationPresent(method) ? 
                    isNewTransactionRequired(method, transactionActive) :
                    isTransactionAnnotationPresent(beanClass) && isNewTransactionRequired(beanClass, transactionActive);
           }
           
           private boolean isTransactionAnnotationPresent(AnnotatedElement element)
           {
              return element.isAnnotationPresent(Transactional.class);
           }
           
           private boolean isNewTransactionRequired(AnnotatedElement element, boolean transactionActive)
           {
              return element.getAnnotation(Transactional.class).value().isNewTransactionRequired(transactionActive);
           }
           
        }.workInTransaction();      
     }
     
  }
  
  
  



More information about the jboss-cvs-commits mailing list