001
014
015 package com.liferay.portal.spring.transaction;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.transaction.TransactionLifecycleManager;
020
021 import org.aopalliance.intercept.MethodInvocation;
022
023 import org.springframework.transaction.PlatformTransactionManager;
024
025
029 public class DefaultTransactionExecutor
030 implements TransactionExecutor, TransactionHandler {
031
032 @Override
033 public void commit(
034 PlatformTransactionManager platformTransactionManager,
035 TransactionAttributeAdapter transactionAttributeAdapter,
036 TransactionStatusAdapter transactionStatusAdapter) {
037
038 Throwable throwable = null;
039
040 try {
041 platformTransactionManager.commit(
042 transactionStatusAdapter.getTransactionStatus());
043 }
044 catch (RuntimeException re) {
045 _log.error(
046 "Application exception overridden by commit exception", re);
047
048 throwable = re;
049
050 throw re;
051 }
052 catch (Error e) {
053 _log.error("Application exception overridden by commit error", e);
054
055 throwable = e;
056
057 throw e;
058 }
059 finally {
060 if (throwable != null) {
061 TransactionLifecycleManager.fireTransactionRollbackedEvent(
062 transactionAttributeAdapter, transactionStatusAdapter,
063 throwable);
064 }
065 else {
066 TransactionLifecycleManager.fireTransactionCommittedEvent(
067 transactionAttributeAdapter, transactionStatusAdapter);
068 }
069 }
070 }
071
072 @Override
073 public Object execute(
074 PlatformTransactionManager platformTransactionManager,
075 TransactionAttributeAdapter transactionAttributeAdapter,
076 MethodInvocation methodInvocation)
077 throws Throwable {
078
079 TransactionStatusAdapter transactionStatusAdapter = start(
080 platformTransactionManager, transactionAttributeAdapter);
081
082 Object returnValue = null;
083
084 try {
085 returnValue = methodInvocation.proceed();
086 }
087 catch (Throwable throwable) {
088 rollback(
089 platformTransactionManager, throwable,
090 transactionAttributeAdapter, transactionStatusAdapter);
091 }
092
093 commit(
094 platformTransactionManager, transactionAttributeAdapter,
095 transactionStatusAdapter);
096
097 return returnValue;
098 }
099
100 @Override
101 public void rollback(
102 PlatformTransactionManager platformTransactionManager,
103 Throwable throwable,
104 TransactionAttributeAdapter transactionAttributeAdapter,
105 TransactionStatusAdapter transactionStatusAdapter)
106 throws Throwable {
107
108 if (transactionAttributeAdapter.rollbackOn(throwable)) {
109 try {
110 platformTransactionManager.rollback(
111 transactionStatusAdapter.getTransactionStatus());
112 }
113 catch (RuntimeException re) {
114 re.addSuppressed(throwable);
115
116 _log.error(
117 "Application exception overridden by rollback exception",
118 re);
119
120 throw re;
121 }
122 catch (Error e) {
123 e.addSuppressed(throwable);
124
125 _log.error(
126 "Application exception overridden by rollback error", e);
127
128 throw e;
129 }
130 finally {
131 TransactionLifecycleManager.fireTransactionRollbackedEvent(
132 transactionAttributeAdapter, transactionStatusAdapter,
133 throwable);
134 }
135 }
136 else {
137 commit(
138 platformTransactionManager, transactionAttributeAdapter,
139 transactionStatusAdapter);
140 }
141
142 throw throwable;
143 }
144
145 @Override
146 public TransactionStatusAdapter start(
147 PlatformTransactionManager platformTransactionManager,
148 TransactionAttributeAdapter transactionAttributeAdapter) {
149
150 TransactionStatusAdapter transactionStatusAdapter =
151 new TransactionStatusAdapter(
152 platformTransactionManager.getTransaction(
153 transactionAttributeAdapter));
154
155 TransactionLifecycleManager.fireTransactionCreatedEvent(
156 transactionAttributeAdapter, transactionStatusAdapter);
157
158 return transactionStatusAdapter;
159 }
160
161 private static final Log _log = LogFactoryUtil.getLog(
162 DefaultTransactionExecutor.class);
163
164 }