package jef.database; import java.lang.ref.WeakReference; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 该对象描述一个lazyload策略,多个对象公用,因此不保存状态 * @author jiyi * */ public final class LazyLoadProcessor { private WeakReference<Session> session; private DbClient parent; private final List<LazyLoadTask> tasks=new ArrayList<LazyLoadTask>(); private final Map<String,Integer> onFields=new HashMap<String,Integer>(8,0.6f); public LazyLoadProcessor(LazyLoadTask task,Session session) { this.session=new WeakReference<Session>(session); this.parent=session.getNoTransactionSession(); this.register(task); } public LazyLoadProcessor(List<LazyLoadTask> tasks,Session session) { this.session=new WeakReference<Session>(session); this.parent=session.getNoTransactionSession(); for(LazyLoadTask t:tasks){ this.register(t); } } public void doTask(IQueryableEntity obj,int id) throws SQLException{ Session s = null; if(session!=null){ s=session.get(); if(s==null){ session.clear(); session=null; }else if(!s.isOpen()){ session.clear(); session=null; s=null; } } if(s==null)s=parent; tasks.get(id).process(s, obj); } public void register(LazyLoadTask vsManyLoadTask) { tasks.add(vsManyLoadTask); Integer id=tasks.size()-1;//该任务的序号 for(String fieldName: vsManyLoadTask.getEffectFields()){ onFields.put(fieldName,id); } } public int getTaskId(String field) { Integer id=onFields.get(field); return id==null?-1:id.intValue(); } public int size() { return tasks.size(); } public List<LazyLoadTask> getTasks() { return tasks; } public Map<String,Integer> getOnFields(){ return onFields; } @Override public String toString() { StringBuilder sb=new StringBuilder(); for(Map.Entry<String,Integer> entry:onFields.entrySet()){ sb.append('[').append(entry.getKey()).append('=').append(tasks.get(entry.getValue())); sb.append(']'); } return sb.toString(); } }