package jef.database.innerpool;
import java.sql.SQLException;
import javax.persistence.PersistenceException;
import jef.accelerator.bean.BeanAccessor;
import jef.accelerator.bean.FastBeanWrapperImpl;
import jef.common.log.LogUtil;
import jef.database.dialect.DatabaseDialect;
import jef.database.dialect.type.ColumnMapping;
import jef.database.dialect.type.ColumnMappings;
import jef.database.jdbc.result.IResultSet;
import jef.database.meta.IReferenceColumn;
import jef.database.wrapper.populator.ColumnDescription;
import jef.database.wrapper.populator.ColumnMeta;
import jef.database.wrapper.populator.IPopulator;
import jef.tools.reflect.BeanWrapper;
public class FieldPopulator implements IPopulator{
private String name;
private String columnName;
private ColumnDescription desc;
public FieldPopulator(IReferenceColumn field,DatabaseDialect profile,String schema,ColumnMeta columns,BeanAccessor ba){
this.columnName=field.getResultAlias(schema, profile);
ColumnDescription desc = columns.getByUpperName(columnName);
if (desc == null) {
throw new PersistenceException("Column not in ResultSet:" + columnName + " all:" + columns);
}
// Assert.notNull(columnName);
this.name = field.getName();
//计算元模型类型
ColumnMapping t = field.getTargetColumnType();
//判断计算容器类型
String name=this.name;
int n = name.indexOf('.');
BeanAccessor bw = ba;
while (n > -1) {
String thisName = name.substring(0, n);
name = name.substring(n + 1);
n = name.indexOf('.');
Class<?> type = bw.getPropertyType(thisName); //FIXME这里没有NestedObjectPopulator健壮
bw = FastBeanWrapperImpl.getAccessorFor(type);
}
Class<?> javaContainer=bw.getPropertyType(name);
desc.setAccessor(ColumnMappings.getAccessor(javaContainer, t, desc, true));
this.desc=desc;
}
public void process(BeanWrapper wrapper, IResultSet rs) throws SQLException {
String name=this.name;
int n = name.indexOf('.');
BeanWrapper bw = wrapper;
while (n > -1) {
String thisName = name.substring(0, n);
name = name.substring(n + 1);
n = name.indexOf('.');
Object bean = bw.getPropertyValue(thisName); //FIXME这里没有NestedObjectPopulator健壮
bw = BeanWrapper.wrap(bean);
}
try {
bw.setPropertyValue(name, desc.getAccessor().jdbcGet(rs, desc.getN()));
} catch (SQLException s) {
LogUtil.exception("[" + columnName + "] is not found from the resultset.", s);
throw s;
}
}
}