package com.mogujie.tt.cache;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import android.text.TextUtils;
import com.mogujie.tt.biz.MessageDistCenter;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.db.biz.DataBaseHelper;
import com.mogujie.tt.entity.MessageInfo;
import com.mogujie.tt.entity.User;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.utils.CommonUtil;
import com.mogujie.tt.utils.FileUtil;
/**
* @author seishuchen
*/
public class CacheModel {
private static Map<String, Integer> hmPullLastMsgFromDB = new ConcurrentHashMap<String, Integer>(); // 记录用户是否从DB中拉取过最后一天消息
private static DataBaseHelper dbHelper = null;
private static Logger logger = Logger.getLogger(CacheModel.class);
private static CacheModel instance = null;
public static CacheModel getInstance() {
if (null == instance) {
instance = new CacheModel();
}
return instance;
}
private CacheModel() {
dbHelper = DataBaseHelper.getInstance();
initCahce();
}
/*
* 初始化缓存
*/
private void initCahce() {
initMessageID();
// 用户登录才可以初始化,否则直接退出
User loginUser = getLoginUser();
if (null == loginUser) {
return;
}
initContactCache(loginUser.getUserId());
List<String> friendIds = ContactCacheImpl.getFriendIdList();
initMessageCache(friendIds, loginUser.getUserId());
reviseMsgLoadingStatusInDB(loginUser.getUserId());
IMCacheImpl.setIsFristLogin(false); // 设置不再需要初始化缓存
}
/*
* 清空缓存
*/
public void clear() {
IMCacheImpl.getInstance().clear();
ContactCacheImpl.getInstance().clear();
MessageCacheImpl.getInstance().clear();
UserCacheImpl.getInstance().clear();
instance = null;
}
/*
* 初始化消息缓存
* @param onwerId 当前登录用户ID
*/
private Boolean initMessageCache(List<String> friendIds, String onwerId) {
Boolean success = false;
if (TextUtils.isEmpty(onwerId)) {
return success;
}
success = initLastMessageAndCount(friendIds, onwerId);
return success;
}
/*
* 从DB获得前一条消息ID(最大的消息ID)并初始化消息缓存中的消息ID
*/
private Boolean initMessageID() {
int preMsgId = dbHelper.queryLastMsgId();
MessageCacheImpl.initMsgId(preMsgId); // 初始化消息ID
return true;
}
/*
* 初始化用户最后一天消息及未读消息计数(从DB获得未读消息计数)
* @param userId 用户ID
*/
private Boolean initLastMessageAndCount(List<String> friendIds,
String ownerId) {
// try {
// if (null == friendIds || 0 == friendIds.size()) {
// return true;
// }
// Iterator<String> itr = friendIds.iterator();
// int unreadCount = 0;
// MessageInfo msgInfo = null;
// while (itr.hasNext()) {
// String friendUserId = itr.next();
// unreadCount = dbHelper.getMsgUnreadCount(ownerId, ownerId,
// friendUserId);
// MessageCacheImpl.getInstance().incUnreadCount(friendUserId,
// unreadCount);
//
// msgInfo = dbHelper.pullMsg(ownerId, ownerId, friendUserId);
// if (null != msgInfo
// && SysConstant.DISPLAY_TYPE_TEXT == msgInfo
// .getDisplayType()) {
// msgInfo = dbHelper.pullMsgById(msgInfo.getMsgId());
// MessageCacheImpl.getInstance().set(friendUserId, msgInfo);
// } else {
// MessageCacheImpl.getInstance().set(friendUserId, msgInfo);
// }
// }
// return true;
// } catch (Exception e) {
// logger.e(e.getMessage());
// return false;
// }
return false;
}
/*
* 获得用户未读消息计数从DB获得未读消息计数
* @param userId 用户ID
*/
private Boolean initContactCache(String onwerId) {
Boolean success = false;
success = initContactFriendIds(onwerId);
return success;
}
/*
* 从DB获得本地好友id列表
* @param onwerId 当前登录用户ID
*/
private Boolean initContactFriendIds(String onwerId) {
if (!TextUtils.isEmpty(onwerId)) {
List<String> friendUserIds = dbHelper.pullFriendUserIds(onwerId);
Iterator<String> itr = friendUserIds.iterator();
while (itr.hasNext()) {
String friendUserId = itr.next();
ContactCacheImpl.getInstance().addFriendId(friendUserId);
}
return true;
}
return false;
}
/*
* 将DB中所有当前用户信息中加载状态为loading的修正为failed状态
* @param userId 用户ID
*/
private Boolean reviseMsgLoadingStatusInDB(String onwerId) {
return dbHelper.updateMsgStatusFromStatus(onwerId,
SysConstant.MESSAGE_STATE_FINISH_FAILED,
SysConstant.MESSAGE_STATE_LOADDING);
}
/*
* 设置用户信息
* @param user 用户信息
*/
public void setUser(User user) {
if (null != user && null != user.getUserId()) {
UserCacheImpl.getInstance().set(user.getUserId(), user);
}
}
/*
* 获得用户信息
* @param userId 用户ID
*/
public User getUser(String userId) {
return (User) UserCacheImpl.getInstance().get(userId);
}
/*
* 设置当前登入用户
* @param user 用户信息
*/
public static void setLoginUser(User user) {
UserCacheImpl.getInstance().setLoginUser(user);
}
/*
* 获得当前登入用户
*/
public static User getLoginUser() {
return UserCacheImpl.getInstance().getLoginUser();
}
/*
* 设置当前登入用户
* @param user 用户信息
*/
public static void setLoginUserId(String userId) {
UserCacheImpl.getInstance().setLoginUserId(userId);
}
/*
* 获得当前登入用户
*/
public static String getLoginUserId() {
return UserCacheImpl.getInstance().getLoginUserId();
}
/*
* 设置当前聊天对象ID
* @param userId 聊天对象用户ID
*/
public void setChatUserId(String userId) {
setChatUser(new User(userId));
}
/*
* 获得当前聊天对象用户ID
*/
public String getChatUserId() {
return UserCacheImpl.getInstance().getChatUserId();
}
/*
* 设置当前聊天对象
* @param user 用户信息
*/
public void setChatUser(User user) {
UserCacheImpl.getInstance().setChatUser(user);
if (null != user) {
ContactCacheImpl.getInstance().addFriendId(user.getUserId());
}
}
/*
* 清空当前聊天对象
* @param user 用户信息
*/
public void clearChatUser() {
UserCacheImpl.getInstance().clearChatUser();
}
/*
* 获得当前聊天对象
*/
public User getChatUser() {
return UserCacheImpl.getInstance().getChatUser();
}
// /*
// * 设置前一回聊天对象
// */
// public void setLastChatUser(User user) {
// UserCacheImpl.getInstance().setLastChatUser(user);
// }
//
// /*
// * 清空前一回聊天对象
// */
// public void clearLastChatUser() {
// UserCacheImpl.getInstance().clearLastChatUser();
// }
//
// /*
// * 获得前一回聊天对象
// */
// public User getLastChatUser() {
// return UserCacheImpl.getInstance().getLastChatUser();
// }
/*
* 获得与好友聊天的最后一条信息
* @param userId 用户ID
*/
public MessageInfo getLastMessage(String friendUserId) {
// try {
// MessageInfo msgInfo = (MessageInfo) MessageCacheImpl.getInstance().get(
// friendUserId);
// if (null == msgInfo) {
// if (toPullLasgMsgFromDB(friendUserId)) {
// msgInfo = dbHelper.pullMsg(getLoginUserId(), getLoginUserId(),
// friendUserId);
// if (null != msgInfo
// && SysConstant.DISPLAY_TYPE_TEXT == msgInfo
// .getDisplayType()) {
// msgInfo = dbHelper.pullMsgById(msgInfo.getMsgId());
// MessageCacheImpl.getInstance().set(friendUserId, msgInfo);
// } else {
// MessageCacheImpl.getInstance().set(friendUserId, msgInfo);
// }
// }
// return msgInfo;
// }
// return msgInfo;
// } catch (Exception e) {
// logger.e(e.getMessage());
// return null;
// }
return null;
}
/*
* 判断用户是否需要从DB拉取最后一条消息
*/
private Boolean toPullLasgMsgFromDB(String userId) {
if (null == userId) {
return false;
}
int currCount = 1;
if (hmPullLastMsgFromDB.containsKey(userId)) {
synchronized (hmPullLastMsgFromDB) {
currCount += hmPullLastMsgFromDB.get(userId);
hmPullLastMsgFromDB.put(userId, currCount);
}
} else {
synchronized (hmPullLastMsgFromDB) {
hmPullLastMsgFromDB.put(userId, currCount);
}
}
return hmPullLastMsgFromDB.get(userId) > 5 ? false : true;
}
/*
* 获得唯一的自增的消息ID,确保在使用前已经初始化preMsgId
*/
public int obtainMsgId() {
return MessageCacheImpl.getInstance().obtainMsgId();
}
/*
* 推送一条消息到消息队列
*/
public boolean push(MessageInfo msgInfo) {
return MessageDistCenter.getInstance().push(msgInfo);
}
/*
* 推送一条消息到DB
*/
public int pushMsg(MessageInfo msgInfo) {
int msgId = SysConstant.DEFAULT_MESSAGE_ID;
if (null == msgInfo) {
return msgId;
}
return dbHelper.pushMsg(getLoginUserId(), msgInfo);
}
/**
* 从数据库拉取信息两个用户之间部分信息(由偏移量和信息条数决定)
*
* @param userId 用户ID
* @param friendUserId 好友ID
* @param msgId 起始ID
* @param offset 距离起始ID的偏移量
* @param size 拉取的消息条数
* @return MessageInfo
*/
public List<MessageInfo> pullMsg(String userId, String friendUserId,
int msgId, int offset, int size) {
return dbHelper.pullMsg(userId, friendUserId, msgId, offset, size);
}
public List<String> getFriendIdList() {
return ContactCacheImpl.getFriendIdList();
}
public void setFriendIdList(List<String> list) {
ContactCacheImpl.setFriendIdList(list);
}
public boolean setLoadedFriendId(String friendId) {
return ContactCacheImpl.getInstance().setLoaded(friendId);
}
public boolean isLoadedFriendId(String friendId) {
return ContactCacheImpl.getInstance().isLoaded(friendId);
}
/**
* 更改图片存储路径
*
* @param entityId
* @param friendUserId
* @return Boolean
*/
public Boolean updateMsgImageSavePath(String MsgId, String newPath) {
//return dbHelper.updateMsgImageSavePath(MsgId, newPath);
return false;
}
public Boolean updateMsgStatus(int msgId, int state) {
return dbHelper.updateMsgStatus(msgId, state);
}
public Boolean updateMsgReadStatus(int msgId, int state) {
// 更新DB中消息是否已读状态,单例模式下ojDB不为空
return dbHelper.updateMsgReadStatus(msgId, state);
}
public Boolean updateMsgParentId(int msgId, int msgParentId) {
// 更新DB中消息消息ID,主要针对图文混排消息,单例模式下ojDB不为空
return dbHelper.updateMsgParentId(msgId, msgParentId);
}
public Boolean updateMsgStatus(String userId, String friendUserId, int state) {
// 更新DB中两用户之间所有消息加载状态, 单例模式下ojDB不为空
return dbHelper.updateMsgStatus(userId, friendUserId, state);
}
public Boolean updateMsgReadStatus(String userId, String friendUserId,
int state) {
// 更新DB中两用户之间所有消息状态(是否已读或展现),一般为已读 单例模式下ojDB不为空
return dbHelper.updateMsgReadStatus(userId, friendUserId, state);
}
/*
* @return 返回删除消息的时间分隔线
*/
public int checkAndDeleteIfNeed() {
// 如果需要的话,删除最老的部分历史信息
int timeLine = dbHelper.checkAndDeleteIfNeed();
if (0 < timeLine) {
File audioDirFile = new File(
CommonUtil.getSavePath(SysConstant.FILE_SAVE_TYPE_AUDIO));
File imageDirFile = new File(
CommonUtil.getSavePath(SysConstant.FILE_SAVE_TYPE_IMAGE));
FileUtil.deleteHistoryFiles(audioDirFile, timeLine);
FileUtil.deleteHistoryFiles(imageDirFile, timeLine);
}
return timeLine;
}
}