package com.alibaba.tamper.core.introspect;
import net.sf.cglib.beans.BulkBean;
import net.sf.cglib.reflect.FastMethod;
import com.alibaba.tamper.core.BeanMappingException;
/**
* 基于Property属性的batch处理:支持get/set的批量处理
*
* @author jianghang 2011-5-31 下午09:00:24
*/
public class PropertyBatchExecutor extends AbstractBatchExecutor {
private BulkBean bulkBean = null;
public PropertyBatchExecutor(Introspector is, Class<?> clazz, String[] fields, Class[] args){
super(clazz);
bulkBean = buildGetBulkBean(is, clazz, fields, args);
}
public Object[] gets(Object obj) throws BeanMappingException {
return bulkBean.getPropertyValues(obj);
}
public void sets(Object obj, Object[] values) throws BeanMappingException {
bulkBean.setPropertyValues(obj, values);
}
/**
* 判断当前executor是否可用
*
* @return
*/
public final boolean isAlive() {
return (bulkBean != null);
}
protected BulkBean buildGetBulkBean(Introspector is, Class<?> clazz, String[] fields, Class[] args) {
if (fields.length != args.length) {
throw new BeanMappingException("fields and args size is not match!");
}
String[] getters = new String[fields.length];
String[] setters = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
String property = fields[i];
Class arg = args[i];
FastMethod setMethod = FastPropertySetExecutor.discover(is, clazz, property, arg);
FastMethod getMethod = FastPropertyGetExecutor.discover(is, clazz, property);
if (setMethod == null) {
throw new BeanMappingException("class[" + clazz.getName() + "] field[" + property + "] arg["
+ arg.getName() + "] set Method is not exist!");
}
if (getMethod == null) {
throw new BeanMappingException("class[" + clazz.getName() + "] field[" + property
+ "] get Method is not exist!");
}
if (getMethod.getReturnType() != arg) {
throw new BeanMappingException("class[" + clazz.getName() + "] field[" + property
+ "] getMethod does not match declared type");
}
setters[i] = setMethod.getName();
getters[i] = getMethod.getName();
}
bulkBean = BulkBean.create(clazz, getters, setters, args);
return bulkBean;
}
}