packagecom.sw.vo.sy;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importorg.springframework.util.Assert;importcom.sw.tool.Struts2Utils;public classEmplList {public static final int LIST_MAX_SIZE = 100;public static final int INIT = 1;public static final int TIME_OUT = 6 * 60; //应该和服务器周期相同
private static int mapIndex =INIT;private static final Map> emplMap = new HashMap>();private static EmplList emplList = newEmplList();privateEmplList() {
}public staticEmplList getInstance() {returnemplList;
}/*** 添加一个在线用户
*
*@parame*/
private synchronized voidadd(EmplInfo e) {
List l =getList();
e.mapIndex=mapIndex;
e.listIndex= l.size() + 1;
l.add(e);
}public voidaddUser(EmplInfo e) {
EmplInfo e2=getUserByID(e.emplId,e.ip);if(e2!=null){
e2.sessionId=e.sessionId;
}else{
add(e);
}
}/*** 对比IP和ID,查找ID,IP都相等的用户,
* 如果查找出多个,则去除第一个之后的所有。
*@paramid
*@paramip
*@return
*/
privateEmplInfo getUserByID(String id, String ip) {
EmplInfo e2= null;if (id == null || ip == null)returne2;boolean b = true;for (Listl : emplMap.values()) {
Iterator el2 =l.iterator();while(el2.hasNext()) {
EmplInfo e=el2.next();if (id.equals(e.emplId) &&ip.equals(e.ip)) {if(b) {
e2=e;
b= false;
}else{
el2.remove();
}
}
}
}returne2;
}/*** 根据分组号,和sessionid获取用户
*
*@authorzhong
*@parami
*@paramsid
*@return
*/
publicEmplInfo getUserBySID(Integer i, String sid) {
List list =emplMap.get(i);for(EmplInfo e : list) {if (e.sessionId ==sid)returne;
}return null;
}/*** 根据索引值查找用户
*
*@parammapIndex
*@paramListIndex
*@return
*/
privateEmplInfo getUserByIndex(Integer mapIndex, Integer ListIndex) {
EmplInfo e= null;try{
e=emplMap.get(mapIndex).get(ListIndex);
}catch(Exception e2) {return null;
}return Struts2Utils.getSession().getId() == e.sessionId ? e : null;
}/*** 更新用户状态
*
*@authorzhong
*@parame*/
public voidupdate(EmplInfo e) {
EmplInfo e2=getUserByIndex(e.mapIndex, e.listIndex);if (e2 != null)
e2.date= newDate();
}/*** 检查用户状态,并且移除超时用户
*
*@authorzhong*/
public voidcheckStatus() {
Date time= newDate();for(Map.Entry e : emplMap.entrySet()) {
List el = (List) e.getValue();
Iterator el2 =el.iterator();while(el2.hasNext()) {
EmplInfo e2=el2.next();if (time.getTime() - e2.date.getTime() > TIME_OUT * 1000) {
el2.remove();
}
}
}
}/*** 移除一个用户
*
*@authorzhong
*@parame*/
public voidreMove(EmplInfo e) {
List l =emplMap.get(e.mapIndex);
EmplInfo e1=l.get(e.listIndex);if (e.sessionId.equals(e1.sessionId) &&e.emplId.equals(e1.emplId)) {
l.remove(e.listIndex);
}
}/*** 获取一组list,如果超出组边界,就创建一个新组
*
*@authorzhong
*@return
*/
private ListgetList() {int i = 1; //用于记录mapIndex。给add方法使用
for (Listl : emplMap.values()) {if (l.size()
i++;
}
mapIndex=i;
List l2 = new ArrayList();
emplMap.put(i, l2);returnl2;
}public intgetMaxMapIndex() {returnemplMap.size();
}/*** 测试方法,不建议使用,仅用来看值
*@return
*/
public Map>getMap(){returnemplMap;
}
}