package com.github.dynamicextensionsalfresco.aop;
import com.github.dynamicextensionsalfresco.annotations.Transactional;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.Assert;
/**
* Provides advice for {@link Transactional}-annotated methods.
* <p>
* This implementation invokes {@link Transactional} operations within a {@link RetryingTransactionCallback}
*
* @author Laurens Fridael
*
*/
public class TransactionalAdvice implements MethodInterceptor {
/* Dependencies */
private RetryingTransactionHelper retryingTransactionHelper;
/* Main operations */
@Override
public Object invoke(final MethodInvocation invocation) throws Throwable {
final Transactional transactional = AnnotationUtils.findAnnotation(invocation.getMethod(), Transactional.class);
return getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Object>() {
@Override
public Object execute() throws Throwable {
return invocation.proceed();
}
}, transactional.readOnly(), transactional.requiresNew());
}
/* Dependencies */
public void setRetryingTransactionHelper(final RetryingTransactionHelper retryingTransactionHelper) {
Assert.notNull(retryingTransactionHelper);
this.retryingTransactionHelper = retryingTransactionHelper;
}
protected RetryingTransactionHelper getRetryingTransactionHelper() {
return retryingTransactionHelper;
}
}