package com.egls.server.core.db.executor;
import com.egls.server.core.db.TaskBackHandler;
import com.egls.server.core.exception.AsyncMapperException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author twjitm - [Created on 2018-09-11 10:52]
* @company http://www.g2us.com/
* @jdk java version "1.8.0_77"
*/
public class AsyncMapperObjectProxy<T> implements InvocationHandler {
private T mapper;
public AsyncMapperObjectProxy(T mapper) {
this.mapper = mapper;
}
@Override
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
if (isCallbackMethod(method, params)) {
TaskBackHandler<T> handler = null;
for (Object param : params) {
if (param != null) {
if (TaskBackHandler.class.isAssignableFrom(param.getClass())) {
handler = (TaskBackHandler<T>) param;
}
}
}
AsyncMapperExecutor.executeRunnable(mapper, method, params, handler);
return null;
} else {
return method.invoke(mapper, params);
}
}
/**
* 获取 Override 方法
*
* @param method
* @param args
* @return
* @throws NoSuchMethodException
*/
private Method getOverrideMethod(Method method, Object[] args) throws NoSuchMethodException {
Class<?>[] parameterTypes = method.getParameterTypes();
Class<?>[] newParameterTypes = new Class<?>[args.length - 1];
int i = 0;
for (Class<?> clazz : parameterTypes) {
if (!TaskBackHandler.class.isAssignableFrom(clazz)) {
newParameterTypes[i++] = clazz;
}
}
return mapper.getClass().getDeclaredMethod(method.getName(), newParameterTypes);
}
/**
* 是否为异步调用mapper方法
*
* @param method
* @param args
* @return
*/
private boolean isCallbackMethod(Method method, Object[] args) {
boolean hasAsyncCallback = false;
if (args == null) {
return false;
}
int count = 0;
for (Object arg : args) {
if (arg != null) {
if (TaskBackHandler.class.isAssignableFrom(arg.getClass())) {
hasAsyncCallback = true;
count++;
}
}
}
if (hasAsyncCallback && count > 1) {
throw new AsyncMapperException(
"Method[" + method.getName() + "] has more than one callback" +
" method!");
}
return hasAsyncCallback;
}
}