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.isReadOnly()) {
62 _dynamicDataSourceTargetSource.setOperation(Operation.READ);
63 }
64 else {
65 _dynamicDataSourceTargetSource.setOperation(Operation.WRITE);
66 }
67
68 StringBuilder sb = new StringBuilder();
69
70 sb.append(targetClass.getName());
71 sb.append(StringPool.PERIOD);
72 sb.append(targetMethod.getName());
73
74 _dynamicDataSourceTargetSource.pushMethod(sb.toString());
75
76 Object returnValue = null;
77
78 try {
79 returnValue = super.invoke(methodInvocation);
80 }
81 finally {
82 _dynamicDataSourceTargetSource.popMethod();
83 }
84
85 return returnValue;
86 }
87
88 public void setDynamicDataSourceTargetSource(
89 DynamicDataSourceTargetSource dynamicDataSourceTargetSource) {
90
91 _dynamicDataSourceTargetSource = dynamicDataSourceTargetSource;
92 }
93
94 private DynamicDataSourceTargetSource _dynamicDataSourceTargetSource;
95
96 }