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