001
014
015 package com.liferay.portal.kernel.transaction;
016
017 import com.liferay.portal.kernel.util.ArrayUtil;
018
019 import java.util.concurrent.atomic.AtomicReference;
020
021
024 public class TransactionLifecycleManager {
025
026 public static void fireTransactionCommittedEvent(
027 TransactionAttribute transactionAttribute,
028 TransactionStatus transactionStatus) {
029
030 for (TransactionLifecycleListener transactionLifecycleListener :
031 _transactionLifecycleListenersReference.get()) {
032
033 transactionLifecycleListener.committed(
034 transactionAttribute, transactionStatus);
035 }
036 }
037
038 public static void fireTransactionCreatedEvent(
039 TransactionAttribute transactionAttribute,
040 TransactionStatus transactionStatus) {
041
042 for (TransactionLifecycleListener transactionLifecycleListener :
043 _transactionLifecycleListenersReference.get()) {
044
045 transactionLifecycleListener.created(
046 transactionAttribute, transactionStatus);
047 }
048 }
049
050 public static void fireTransactionRollbackedEvent(
051 TransactionAttribute transactionAttribute,
052 TransactionStatus transactionStatus, Throwable throwable) {
053
054 for (TransactionLifecycleListener transactionLifecycleListener :
055 _transactionLifecycleListenersReference.get()) {
056
057 transactionLifecycleListener.rollbacked(
058 transactionAttribute, transactionStatus, throwable);
059 }
060 }
061
062 public static TransactionLifecycleListener[]
063 getRegisteredTransactionLifecycleListeners() {
064
065 TransactionLifecycleListener[] transactionLifecycleListeners =
066 _transactionLifecycleListenersReference.get();
067
068 return transactionLifecycleListeners.clone();
069 }
070
071 public static boolean register(
072 TransactionLifecycleListener transactionLifecycleListener) {
073
074 while (true) {
075 TransactionLifecycleListener[] transactionLifecycleListeners =
076 _transactionLifecycleListenersReference.get();
077
078 if (ArrayUtil.contains(
079 transactionLifecycleListeners,
080 transactionLifecycleListener)) {
081
082 return false;
083 }
084
085 TransactionLifecycleListener[] newTransactionLifecycleListeners =
086 ArrayUtil.append(
087 transactionLifecycleListeners,
088 transactionLifecycleListener);
089
090 if (_transactionLifecycleListenersReference.compareAndSet(
091 transactionLifecycleListeners,
092 newTransactionLifecycleListeners)) {
093
094 return true;
095 }
096 }
097 }
098
099 public static boolean unregister(
100 TransactionLifecycleListener transactionLifecycleListener) {
101
102 while (true) {
103 TransactionLifecycleListener[] transactionLifecycleListeners =
104 _transactionLifecycleListenersReference.get();
105
106 TransactionLifecycleListener[] newTransactionLifecycleListeners =
107 ArrayUtil.remove(
108 transactionLifecycleListeners,
109 transactionLifecycleListener);
110
111 if (transactionLifecycleListeners ==
112 newTransactionLifecycleListeners) {
113
114 return false;
115 }
116
117 if (_transactionLifecycleListenersReference.compareAndSet(
118 transactionLifecycleListeners,
119 newTransactionLifecycleListeners)) {
120
121 return true;
122 }
123 }
124 }
125
126 private static final AtomicReference<TransactionLifecycleListener[]>
127 _transactionLifecycleListenersReference = new AtomicReference<>(
128 new TransactionLifecycleListener[0]);
129
130 }