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(
058 transactional);
059
060 if (transactionAttribute == null) {
061 _transactionAttributes.put(
062 methodTargetClassKey, _nullTransactionAttribute);
063 }
064 else {
065 _transactionAttributes.put(
066 methodTargetClassKey, transactionAttribute);
067 }
068
069 return transactionAttribute;
070 }
071
072 private static TransactionAttribute _nullTransactionAttribute =
073 new DefaultTransactionAttribute();
074 private Map<MethodTargetClassKey, TransactionAttribute>
075 _transactionAttributes =
076 new ConcurrentHashMap<MethodTargetClassKey, TransactionAttribute>();
077
078 }