001
014
015 package com.liferay.portal.spring.transaction;
016
017 import com.liferay.portal.kernel.annotation.AnnotationLocator;
018 import com.liferay.portal.kernel.transaction.Transactional;
019 import com.liferay.portal.kernel.util.MethodTargetClassKey;
020
021 import java.lang.reflect.Method;
022
023 import java.util.Map;
024 import java.util.concurrent.ConcurrentHashMap;
025
026 import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
027 import org.springframework.transaction.interceptor.TransactionAttribute;
028 import org.springframework.transaction.interceptor.TransactionAttributeSource;
029
030
033 public class AnnotationTransactionAttributeSource
034 implements TransactionAttributeSource {
035
036 public TransactionAttribute getTransactionAttribute(
037 Method method, Class<?> targetClass) {
038
039 MethodTargetClassKey methodTargetClassKey = new MethodTargetClassKey(
040 method, targetClass);
041
042 TransactionAttribute transactionAttribute = _transactionAttributes.get(
043 methodTargetClassKey);
044
045 if (transactionAttribute != null) {
046 if (transactionAttribute == _nullTransactionAttribute) {
047 return null;
048 }
049 else {
050 return transactionAttribute;
051 }
052 }
053
054 Transactional transactional = AnnotationLocator.locate(
055 method, targetClass, Transactional.class);
056
057 transactionAttribute = TransactionAttributeBuilder.build(transactional);
058
059 if (transactionAttribute == null) {
060 _transactionAttributes.put(
061 methodTargetClassKey, _nullTransactionAttribute);
062 }
063 else {
064 _transactionAttributes.put(
065 methodTargetClassKey, transactionAttribute);
066 }
067
068 return transactionAttribute;
069 }
070
071 private static TransactionAttribute _nullTransactionAttribute =
072 new DefaultTransactionAttribute();
073 private Map<MethodTargetClassKey, TransactionAttribute>
074 _transactionAttributes =
075 new ConcurrentHashMap<MethodTargetClassKey, TransactionAttribute>();
076
077 }