[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