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
41 public class DynamicDataSourceTransactionInterceptor
42 extends TransactionInterceptor {
43
44 public Object invoke(MethodInvocation methodInvocation) throws Throwable {
45 Class<?> targetClass = null;
46
47 if (methodInvocation.getThis() != null) {
48 targetClass = methodInvocation.getThis().getClass();
49 }
50
51 Method targetMethod = methodInvocation.getMethod();
52
53 TransactionAttributeSource transactionAttributeSource =
54 getTransactionAttributeSource();
55
56 TransactionAttribute transactionAttribute =
57 transactionAttributeSource.getTransactionAttribute(
58 targetMethod, targetClass);
59
60 if ((transactionAttribute != null) &&
61 (transactionAttribute.isReadOnly())) {
62
63 _dynamicDataSourceTargetSource.setOperation(Operation.READ);
64 }
65 else {
66 _dynamicDataSourceTargetSource.setOperation(Operation.WRITE);
67 }
68
69 StringBuilder sb = new StringBuilder();
70
71 sb.append(targetClass.getName());
72 sb.append(StringPool.PERIOD);
73 sb.append(targetMethod.getName());
74
75 _dynamicDataSourceTargetSource.pushMethod(sb.toString());
76
77 Object returnValue = null;
78
79 try {
80 returnValue = super.invoke(methodInvocation);
81 }
82 finally {
83 _dynamicDataSourceTargetSource.popMethod();
84 }
85
86 return returnValue;
87 }
88
89 public void setDynamicDataSourceTargetSource(
90 DynamicDataSourceTargetSource dynamicDataSourceTargetSource) {
91
92 _dynamicDataSourceTargetSource = dynamicDataSourceTargetSource;
93 }
94
95 private DynamicDataSourceTargetSource _dynamicDataSourceTargetSource;
96
97 }