CLOUDSTACK-1562: Replace @DB support to be the formal implementation instead of a temporary hacking one

This commit is contained in:
Kelven Yang 2013-03-06 16:43:48 -08:00
parent 837f7e1950
commit 89f4ac0439
2 changed files with 16 additions and 8 deletions

View File

@ -28,10 +28,7 @@ import javax.management.NotCompliantMBeanException;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.Advised;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
@ -39,7 +36,6 @@ import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import com.cloud.utils.db.TransactionContextBuilder;
import com.cloud.utils.mgmt.JmxUtil;
import com.cloud.utils.mgmt.ManagementBean;

View File

@ -32,8 +32,8 @@ public class TransactionContextBuilder implements MethodInterceptor {
public Object AroundAnyMethod(ProceedingJoinPoint call) throws Throwable {
MethodSignature methodSignature = (MethodSignature)call.getSignature();
Method targetMethod = methodSignature.getMethod();
if(true) { // TODO ??? needToIntercept(targetMethod)) {
Method targetMethod = methodSignature.getMethod();
if(needToIntercept(targetMethod, call.getTarget())) {
Transaction txn = Transaction.open(call.getSignature().getName());
Object ret = null;
try {
@ -50,7 +50,7 @@ public class TransactionContextBuilder implements MethodInterceptor {
public Object invoke(MethodInvocation method) throws Throwable {
Method targetMethod = method.getMethod();
if(needToIntercept(targetMethod)) {
if(needToIntercept(targetMethod, method.getThis())) {
Transaction txn = Transaction.open(targetMethod.getName());
Object ret = null;
try {
@ -63,13 +63,25 @@ public class TransactionContextBuilder implements MethodInterceptor {
return method.proceed();
}
private boolean needToIntercept(Method method) {
private boolean needToIntercept(Method method, Object target) {
DB db = method.getAnnotation(DB.class);
if (db != null) {
return true;
}
Class<?> clazz = method.getDeclaringClass();
if(clazz.isInterface()) {
clazz = target.getClass();
for(Method m : clazz.getMethods()) {
// it is supposed that we need to check against type arguments,
// this can be simplified by just checking method name
if(m.getName().equals(method.getName())) {
if(m.getAnnotation(DB.class) != null)
return true;
}
}
}
do {
db = clazz.getAnnotation(DB.class);
if (db != null) {