package com.jiuqi.mobile.nigo.comeclose.bean;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.annotations.Expose;
import com.google.gson.internal.$Gson$Types;
import com.jiuqi.mobile.nigo.comeclose.exception.IndexOutException;
import com.jiuqi.mobile.nigo.comeclose.manager.ILoadDataHandler;
/**
* 返回结果集封装,此类包含数据请求。不利于用户远程使用。<br/>
* 客户端访问时,请谨慎使用。。。使用前请于本人沟通<br/>
* 客户端使用方法:<br/>
* void handler(){<br/>
* String session = "";<br/>
* INewsManager manager = ManagerFactory.instanceManager(INewsManager.class,
* session );<br/>
* int pageSize = 15;<br/>
* long startIndex = 0;<br/>
* SelectNewsKey key = new SelectNewsKey(pageSize);<br/>
* key.setStartIndex(startIndex);<br/>
* iterateList(manager, pageSize, startIndex, key);<br/>
* //第二次请求<br/>
* startIndex += pageSize;<br/>
* key.setStartIndex(startIndex);<br/>
* iterateList(manager, pageSize, startIndex, key);<br/>
* ...<br/>
* }<br/>
* private void iterateList(INewsManager manager, int pageSize,<br/>
* long startIndex, SelectNewsKey key) {<br/>
* LoadOnGetList<CarTaskNewsBean> list = manager.get(CarTaskNewsBean.class,
* key);<br/>
* for(long i=startIndex; i<Math.min(pageSize+startIndex,
* list.getTotalCount());i++){<br/>
* CarTaskNewsBean bean = list.get(startIndex);<br/>
* }<br/>
* }<br/>
*
* @author modi
*
* @param <T>
*/
public class LoadOnGetList<T> {
@Expose(deserialize = false, serialize = false)
private ILoadDataHandler<T> loadData;
private int size;
// private final SelectKey key;
private List<T> list = new ArrayList<T>();
private Map<Long, T> map= new HashMap<Long,T>();
private long startIndex;
private long totalCount;
public LoadOnGetList() {
}
public LoadOnGetList(List<T> list) {
this.list = list;
this.totalCount = list.size();
this.startIndex = list.size();
this.size = list.size();
}
public LoadOnGetList(ILoadDataHandler<T> loadData, SelectKey key) {
this.size = key.getSize();
this.loadData = loadData;
this.startIndex = key.getStartIndex()<0?0:key.getStartIndex();
setTotalCount(initTotalCount());
list = loadData.getData(startIndex,size);
}
public T get(long index) throws IndexOutException {
if(list!=null&&list.size()==0){//第一次初始化
list = loadData.getData(startIndex, size);
}
if(list!=null&&list.size()==totalCount){//将集合转化为loadongetlist使用 不是分页!使用的是第一个构造函数
return list.get((int)index);
}else{
if(list!=null&&list.size()!=0){
long startTemp = startIndex;
if(!map.containsKey(startTemp)){//初始化map从stratindex 到size 的条数
for(int i=0;i<list.size();i++){
synchronized (map) {
map.put(startTemp++, list.get(i));
}
}
}else{//取得是 startindex到size意外的条数 比如 取0-15条记录 但是get(16)放入map
startTemp = index;
for(int i=0;i<list.size();i++){
synchronized (map) {
map.put(startTemp++, list.get(i));
}
}
}
}
list = null;
if(!map.containsKey(index)){//取得是 startindex到size意外的条数 比如 取0-15条记录 但是get(16)重新再数据库取
list = loadData.getData(index, size);
return get(index);
}else{
return map.get(index);
}
}
}
private long initTotalCount(){
return loadData.getTotalCount();
}
public long getTotalCount() {
return totalCount;
}
public void setTotalCount(long totalCount) {
this.totalCount = totalCount;
}
/**
* 服务端禁用,仅限android客户端使用
* 只允许查询范围之内的
* @return
*/
public List<T> getList() {
// list = loadData.getData(startIndex, size);
return list;
}
public Type getType() {
Type superclass = getClass().getGenericSuperclass();
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types
.canonicalize(parameterized.getActualTypeArguments()[0]);
}
}