package net.tooan.ynpay.commons.service.ibatis;
import com.ibatis.sqlmap.client.SqlMapClient;
import net.tooan.ynpay.commons.ObjectFieldUtils;
import net.tooan.ynpay.third.jfinal.log.Logger;
import org.apache.commons.lang.StringUtils;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
/**
* Created with IntelliJ IDEA.
* User: Jing
* Date: 13-10-15
* Time: 下午9:15
*/
public abstract class SqlMapClientInterceptor implements IbatisSupport {
protected Logger logger = Logger.getLogger(this.getClass());
@AroundInvoke
public Object inject(InvocationContext ctx) throws Exception {
Object target = ctx.getTarget();
Class<?> clazz = target.getClass();
Field[] fields = ObjectFieldUtils.getAllField(clazz);
for (Field field : fields) {
if (field.getType().isAssignableFrom(SqlMapClient.class)) {
if (logger.isDebugEnabled()) {
logger.debug(String.format("%s.%s type is SqlMapClient", clazz.getName(), field.getName()));
}
for (Annotation annotation : field.getAnnotations()) {
if (annotation instanceof IbatisClient) {
if (logger.isDebugEnabled()) {
logger.debug(String.format("%s.%s is IbatisClient Annotation", clazz.getName(), field.getName()));
}
if (!field.isAccessible()) {
field.setAccessible(true);
}
SqlMapClient sqlMapClient = SqlMapClientUtils.getSqlMapClient(getDataSource(), StringUtils.isBlank(((IbatisClient) annotation).resource()) ? getResource() : ((IbatisClient) annotation).resource());
field.set(target, sqlMapClient);
if (logger.isDebugEnabled()) {
logger.debug(String.format("%s.%s set SqlMapClient", clazz.getName(), field.getName()));
}
break;
}
}
}
}
return ctx.proceed();
}
}