/**
* Author: zero
* Created: 2012-8-22
*/
package com.cwa.petserver.memory.activeuser;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Logger;
/**
* 活跃玩家的内存池,只针对包内的ISearchAlgo相关类暴露接口。
* @author zero
*/
public class ActiveUserPool
{
private final static Logger logger = Logger.getLogger(ActiveUserPool.class);
private Map<Integer, Vector<Integer>> userLvlMap;
private Map<Integer, ActiveUser> userMap;
protected ActiveUserPool()
{
userLvlMap = new ConcurrentHashMap<Integer, Vector<Integer>>();
userMap = new ConcurrentHashMap<Integer, ActiveUser>();
}
/**
* 通过玩家等级获取ActiveUser的列表,如果没有,就返回一个空列表。
* @param lvl
* @return
*/
protected List<Integer> getUserListClone(int lvl)
{
return cloneToList(userLvlMap.get(lvl));
}
private List<Integer> cloneToList(Vector<Integer> src)
{
return new ArrayList<Integer>(src);
}
/**
* 将一个玩家添加到指定等级的容器里
* @param lvl
* @param user
*/
protected void addUser(int lvl, ActiveUser user)
{
userMap.put(user.getRoleId(), user);
add(userLvlMap, lvl, user.getRoleId());
}
/**
* 添加一对值到map包含的list中,如果对应的list是空的,就新建一个list。
* @param map
* @param key
* @param obj
*/
private void add(Map<Integer, Vector<Integer>> map, Integer key, Integer obj)
{
Vector<Integer> list = map.get(key);
if (null == list) {
list = new Vector<Integer>();
map.put(key, list);
}
list.add(obj);
}
/**
* 将一个列表的玩家放置到指定等级的列表中。
* @param lvl 等级
* @param users 待载入的玩家列表
*/
protected void pushUsers(int lvl, List<ActiveUser> users)
{
removeAllUser(lvl);
userLvlMap.put(lvl, cloneToVector(users));
for (ActiveUser u : users) {
userMap.put(u.getRoleId(), u);
}
}
private void removeAllUser(int lvl)
{
List<Integer> userList = getUserListClone(lvl);
for (Integer id : userList) {
removeUser(id);
}
}
private Vector<Integer> cloneToVector(List<ActiveUser> src)
{
Vector<Integer> dest = new Vector<Integer>();
if (src != null) {
for (ActiveUser u : src) {
dest.add(u.getRoleId());
}
}
return dest;
}
/**
* 更新玩家的状态
* @param user
*/
protected void updateUser(ActiveUser user)
{
removeUser(user.getRoleId());
addUser(user.getLevel(), user);
}
/**
* 获取玩家
* @param roleId
* @return
*/
protected ActiveUser getUser(int roleId)
{
ActiveUser user = userMap.get(roleId);
return user;
}
/**
* 将某个玩家从指定等级的容器中移除。
* @param lvl 等级
* @param roleId 待移除的玩家的Id
*/
protected void removeUser(int roleId)
{
ActiveUser user = userMap.remove(roleId);
if (null == user)
return;
int lvl = user.getLevel();
try {
userLvlMap.get(lvl).remove(new Integer(roleId));
} catch (NullPointerException e) {
// 以防止数据不对称的异常,在userLvlMap中已经没有这个等级的玩家列表了。
logger.fatal(e, e);
}
}
}