1
19
20 package com.liferay.portal.dao.jdbc.aop;
21
22 import com.liferay.portal.kernel.util.StringPool;
23
24 import java.lang.reflect.Method;
25
26 import org.aopalliance.intercept.MethodInvocation;
27
28 import org.springframework.transaction.interceptor.TransactionAttribute;
29 import org.springframework.transaction.interceptor.TransactionAttributeSource;
30 import org.springframework.transaction.interceptor.TransactionInterceptor;
31
32
39 public class DynamicDataSourceTransactionInterceptor
40 extends TransactionInterceptor {
41
42 public Object invoke(MethodInvocation methodInvocation) throws Throwable {
43 Class<?> targetClass = null;
44
45 if (methodInvocation.getThis() != null) {
46 targetClass = methodInvocation.getThis().getClass();
47 }
48
49 Method targetMethod = methodInvocation.getMethod();
50
51 TransactionAttributeSource transactionAttributeSource =
52 getTransactionAttributeSource();
53
54 TransactionAttribute transactionAttribute =
55 transactionAttributeSource.getTransactionAttribute(
56 targetMethod, targetClass);
57
58 if ((transactionAttribute != null) &&
59 (transactionAttribute.isReadOnly())) {
60
61 _dynamicDataSourceTargetSource.setOperation(Operation.READ);
62 }
63 else {
64 _dynamicDataSourceTargetSource.setOperation(Operation.WRITE);
65 }
66
67 StringBuilder sb = new StringBuilder();
68
69 sb.append(targetClass.getName());
70 sb.append(StringPool.PERIOD);
71 sb.append(targetMethod.getName());
72
73 _dynamicDataSourceTargetSource.pushMethod(sb.toString());
74
75 Object returnValue = null;
76
77 try {
78 returnValue = super.invoke(methodInvocation);
79 }
80 finally {
81 _dynamicDataSourceTargetSource.popMethod();
82 }
83
84 return returnValue;
85 }
86
87 public void setDynamicDataSourceTargetSource(
88 DynamicDataSourceTargetSource dynamicDataSourceTargetSource) {
89
90 _dynamicDataSourceTargetSource = dynamicDataSourceTargetSource;
91 }
92
93 private DynamicDataSourceTargetSource _dynamicDataSourceTargetSource;
94
95 }