package jef.database; import java.sql.SQLException; import java.util.BitSet; /** * 在每个需要延迟加载的对象中存放一个。 * 用于记录已经加载的字段和尚未加载的字段。 * @author jiyi * */ final class LazyLoadContext implements ILazyLoadContext { //策略 private LazyLoadProcessor processor; //已经load过的数据 private BitSet loaded; //load过的次数 private int executed; public LazyLoadContext(LazyLoadProcessor processor2) { this.processor=processor2; executed=0; } /** * 返回需要执行的加载任务ID(对应LazyLoadProcessor中的Task序号)。 * 返回-1表示无任务需要执行 */ public int needLoad(String field){ int id=processor.getTaskId(field); if(id==-1)return id; if(loaded==null){ loaded=new BitSet(processor.size()); }else{ if(loaded.get(id)){ return -1; } } return id; } @Override public void markProcessed(String field) { int id=processor.getTaskId(field); if(id==-1)return; if(loaded==null){ loaded=new BitSet(processor.size()); } loaded.set(id,true); } public boolean process(DataObject dataObject, int id) throws SQLException { if(!loaded.get(id)){ processor.doTask(dataObject,id); loaded.set(id,true); executed++; } return executed>=processor.size(); } public LazyLoadProcessor getProcessor() { return processor; } @Override public String toString() { return processor.toString(); } }