001
014
015 package com.liferay.portal.kernel.test.rule;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.test.rule.BaseTestRule.StatementWrapper;
020 import com.liferay.portal.kernel.transaction.Propagation;
021 import com.liferay.portal.kernel.transaction.TransactionAttribute;
022 import com.liferay.portal.kernel.transaction.TransactionInvokerUtil;
023 import com.liferay.portal.kernel.util.ReflectionUtil;
024
025 import java.util.concurrent.Callable;
026
027 import org.junit.rules.TestRule;
028 import org.junit.runner.Description;
029 import org.junit.runners.model.Statement;
030
031
034 public class TransactionalTestRule implements TestRule {
035
036 public static final TransactionalTestRule INSTANCE =
037 new TransactionalTestRule();
038
039 public TransactionalTestRule() {
040 this(Propagation.SUPPORTS);
041 }
042
043 public TransactionalTestRule(Propagation propagation) {
044 TransactionAttribute.Builder builder =
045 new TransactionAttribute.Builder();
046
047 builder.setPropagation(propagation);
048 builder.setRollbackForClasses(
049 PortalException.class, SystemException.class);
050
051 _transactionAttribute = builder.build();
052 }
053
054 @Override
055 public Statement apply(Statement statement, Description description) {
056 String methodName = description.getMethodName();
057
058 if (methodName == null) {
059 return statement;
060 }
061
062 return new StatementWrapper(statement) {
063
064 @Override
065 public void evaluate() throws Throwable {
066 TransactionInvokerUtil.invoke(
067 getTransactionAttribute(), new Callable<Void>() {
068
069 @Override
070 public Void call() throws Exception {
071 try {
072 statement.evaluate();
073 }
074 catch (Throwable t) {
075 ReflectionUtil.throwException(t);
076 }
077
078 return null;
079 }
080 });
081 }
082
083 };
084 }
085
086 public TransactionAttribute getTransactionAttribute() {
087 return _transactionAttribute;
088 }
089
090 private final TransactionAttribute _transactionAttribute;
091
092 }