001
014
015 package com.liferay.portal.spring.transaction;
016
017 import com.liferay.portal.kernel.transaction.TransactionAttribute;
018 import com.liferay.portal.kernel.transaction.TransactionInvoker;
019 import com.liferay.portal.kernel.transaction.TransactionStatus;
020
021 import java.lang.reflect.AccessibleObject;
022 import java.lang.reflect.Method;
023
024 import java.util.concurrent.Callable;
025
026 import org.aopalliance.intercept.MethodInvocation;
027
028 import org.springframework.transaction.PlatformTransactionManager;
029 import org.springframework.transaction.support.DefaultTransactionStatus;
030
031
034 public class TransactionInvokerImpl implements TransactionInvoker {
035
036 @Override
037 public <T> T invoke(
038 TransactionAttribute transactionAttribute, Callable<T> callable)
039 throws Throwable {
040
041 return (T)_transactionExecutor.execute(
042 _platformTransactionManager,
043 TransactionAttributeBuilder.build(
044 true, transactionAttribute.getIsolation(),
045 transactionAttribute.getPropagation(),
046 transactionAttribute.isReadOnly(),
047 transactionAttribute.getTimeout(),
048 transactionAttribute.getRollbackForClasses(),
049 transactionAttribute.getRollbackForClassNames(),
050 transactionAttribute.getNoRollbackForClasses(),
051 transactionAttribute.getNoRollbackForClassNames()),
052 new CallableMethodInvocation(callable));
053 }
054
055 public void setPlatformTransactionManager(
056 PlatformTransactionManager platformTransactionManager) {
057
058 _platformTransactionManager = platformTransactionManager;
059 }
060
061 public void setTransactionExecutor(
062 TransactionExecutor transactionExecutor) {
063
064 _transactionExecutor = transactionExecutor;
065 }
066
067 protected static org.springframework.transaction.TransactionStatus
068 toTransactionStatus(TransactionStatus transactionStatus) {
069
070 DefaultTransactionStatus defaultTransactionStatus =
071 new DefaultTransactionStatus(
072 null, transactionStatus.isNewTransaction(), false, false, false,
073 null);
074
075 if (transactionStatus.isCompleted()) {
076 defaultTransactionStatus.setCompleted();
077 }
078
079 if (transactionStatus.isRollbackOnly()) {
080 defaultTransactionStatus.setRollbackOnly();
081 }
082
083 return defaultTransactionStatus;
084 }
085
086 private static PlatformTransactionManager _platformTransactionManager;
087 private static TransactionExecutor _transactionExecutor;
088
089 private static class CallableMethodInvocation implements MethodInvocation {
090
091 @Override
092 public Object[] getArguments() {
093 throw new UnsupportedOperationException();
094 }
095
096 @Override
097 public Method getMethod() {
098 throw new UnsupportedOperationException();
099 }
100
101 @Override
102 public AccessibleObject getStaticPart() {
103 throw new UnsupportedOperationException();
104 }
105
106 @Override
107 public Object getThis() {
108 throw new UnsupportedOperationException();
109 }
110
111 @Override
112 public Object proceed() throws Throwable {
113 return _callable.call();
114 }
115
116 private CallableMethodInvocation(Callable<?> callable) {
117 _callable = callable;
118 }
119
120 private final Callable<?> _callable;
121
122 }
123
124 }