package chat.module;
|
|
import java.sql.Connection;
|
import java.util.concurrent.Executors;
|
|
import org.apache.log4j.Logger;
|
|
import chat.message.MessageRunner;
|
import chat.message.MessagesPublisher;
|
import chat.module.entity.ChatSpaceType;
|
import chat.module.entity.FriendShip;
|
import chat.module.entity.GroupType;
|
import chat.module.entity.MessageContainer;
|
import chat.module.friendcircle.FriendCircle;
|
import chat.user.ClientStore;
|
import chat.user.NotifyStore;
|
import chat.user.User;
|
import chat.user.UserStore;
|
import chat.util.DBUtil;
|
import frame.object.data.Entity;
|
import frame.object.data.EntitySet;
|
import frame.persist.NamedSQL;
|
import frame.persist.SQLRunner;
|
|
public class ModuleLoader {
|
|
private static Logger logger;
|
private static PrivateFriendBucket privateFriendBucket;
|
private static String cachedSpaceId;
|
private static MessageContainer cachedContainer;
|
private static String cachedUserId;
|
private static User cachedUser;
|
public static Connection connDB;
|
private static MessageRunner imBusinessScheduler;
|
private static MessagesPublisher messagePublisher;
|
|
static {
|
logger = Logger.getLogger(ModuleLoader.class);
|
|
privateFriendBucket = PrivateFriendBucket.getInstance();
|
}
|
|
public static PrivateFriendBucket getPrivateFriendBucket() {
|
return privateFriendBucket;
|
}
|
|
public static void setPrivateFriendBucket(PrivateFriendBucket privateFriendBucket) {
|
ModuleLoader.privateFriendBucket = privateFriendBucket;
|
}
|
|
public static void load() throws Exception {
|
//1.
|
loadUser();
|
loadClient();
|
loadNotify();
|
|
//2.群组
|
loadChatSpace();
|
|
//3.群组成员
|
loadMember();
|
|
//4.群组消息
|
loadMessage();
|
|
//5. 群组消息关系
|
loadMessageRelation();
|
|
//6.加好友关系
|
LoadFriendShip();
|
|
//7.加朋友圈
|
LoadFriendCircle();
|
|
//8.加数据库连接
|
connDB = LoadDBConn();
|
|
//9.加载执行线程池
|
int threadNum = Runtime.getRuntime().availableProcessors() * 2;
|
imBusinessScheduler = new MessageRunner(Executors.newScheduledThreadPool(threadNum));
|
|
//10.实例化消息发送
|
messagePublisher = new MessagesPublisher();
|
}
|
|
private static Connection LoadDBConn() throws Exception {
|
DBUtil dbUtil = new DBUtil();
|
Connection conn = dbUtil.getConnection();
|
return conn;
|
}
|
|
private static void loadUser() throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("usr");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
int cnt = 0;
|
for (Entity entity: entitySet) {
|
UserStore.loadOne(entity);
|
cnt++;
|
}
|
|
if (logger.isDebugEnabled()) {
|
logger.debug("load user: " + cnt);
|
}
|
}
|
|
private static void loadClient() throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("client");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
int cnt = 0;
|
for (Entity entity: entitySet) {
|
ClientStore.loadOne(entity);
|
cnt++;
|
}
|
|
if (logger.isDebugEnabled()) {
|
logger.debug("load client: " + cnt);
|
}
|
}
|
|
private static void loadNotify() throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("notify");
|
namedSQL.setFilter("isread = 'F' ");
|
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
int cnt = 0;
|
for (Entity entity: entitySet) {
|
NotifyStore.loadOne(entity);
|
cnt++;
|
}
|
|
if (logger.isDebugEnabled()) {
|
logger.debug("load client: " + cnt);
|
}
|
}
|
|
private static void loadChatSpace() throws Exception {
|
int cnt = 0;
|
ChatSpaceType spaceType;
|
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("chatSpace");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
for (Entity entity: entitySet) {
|
spaceType = ChatSpaceType.pase(entity.getString("typeCode"));
|
|
if (ChatSpaceType.Private == spaceType) {//私聊
|
privateFriendBucket.load(entity);
|
}
|
else if (ChatSpaceType.GroupDoctor == spaceType) {//医生群
|
GroupBucket.load(GroupType.Doctor, entity);
|
}
|
else if (ChatSpaceType.GroupPatient == spaceType) {//患者群
|
GroupBucket.load(GroupType.Patient, entity);
|
}
|
else if (ChatSpaceType.GroupFriend == spaceType) {//朋友群
|
GroupBucket.load(GroupType.Friend, entity);
|
}
|
else if (ChatSpaceType.Assistant == spaceType) {//医助
|
|
}
|
else if (ChatSpaceType.Channel == spaceType) {//频道
|
|
}
|
else if (ChatSpaceType.ChatRoom == spaceType) {//聊天室
|
|
}
|
else if (ChatSpaceType.FriendCircle == spaceType) {//朋友圈
|
|
}
|
|
cnt++;
|
}
|
|
if (logger.isDebugEnabled()) {
|
logger.debug("load chat space: " + cnt);
|
}
|
}
|
|
private static void loadMember() throws Exception {
|
//1.私聊
|
doLoadMember(ChatSpaceType.Private, privateFriendBucket);
|
//2.医生群组
|
doLoadMember(ChatSpaceType.GroupDoctor, GroupBucket.getInstance(GroupType.Doctor));
|
//3.患者群组
|
doLoadMember(ChatSpaceType.GroupPatient, GroupBucket.getInstance(GroupType.Patient));
|
//4.朋友群组
|
doLoadMember(ChatSpaceType.GroupFriend, GroupBucket.getInstance(GroupType.Friend));
|
}
|
|
private static void doLoadMember(ChatSpaceType spaceType, Bucket<?> spaceBucket) throws Exception {
|
String spaceId;
|
MessageContainer messageContainer;
|
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("member").setOrderBy("spaceid");
|
namedSQL.setFilter("spacecode = '" + spaceType + "' ");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
for (Entity entity: entitySet) {
|
spaceId = entity.getString("spaceid");
|
messageContainer = getMessageContainer(spaceBucket, spaceId);
|
messageContainer.loadOneMember(entity);
|
}
|
}
|
|
private static void loadMessage() throws Exception {
|
doLoadMessage(ChatSpaceType.Private, privateFriendBucket);
|
doLoadMessage(ChatSpaceType.GroupDoctor, GroupBucket.getInstance(GroupType.Doctor));
|
doLoadMessage(ChatSpaceType.GroupPatient, GroupBucket.getInstance(GroupType.Patient));
|
doLoadMessage(ChatSpaceType.GroupFriend, GroupBucket.getInstance(GroupType.Friend));
|
}
|
|
private static void doLoadMessage(ChatSpaceType spaceType, Bucket<?> spaceBucket) throws Exception {
|
String spaceId;
|
MessageContainer messageContainer;
|
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("message").setOrderBy("spaceid, createtime asc");
|
namedSQL.setFilter("TO_DAYS(NOW()) - TO_DAYS(createtime) >= 0 and spacecode = '" + spaceType + "' ");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
for (Entity entity: entitySet) {
|
spaceId = entity.getString("spaceid");
|
messageContainer = getMessageContainer(spaceBucket, spaceId);
|
messageContainer.loadOneMessage(entity);
|
}
|
}
|
|
//消息关系 Private, GroupDoctor, GroupPatient, GroupFriend, Assistant, Channel, ChatRoom, FriendCircle, Unknown;
|
private static void loadMessageRelation() throws Exception {
|
//1.私聊
|
doLoadMessageRelation(ChatSpaceType.Private, privateFriendBucket);
|
//2.医生群组
|
doLoadMessageRelation(ChatSpaceType.GroupDoctor, GroupBucket.getInstance(GroupType.Doctor));
|
//3.患者群组
|
doLoadMessageRelation(ChatSpaceType.GroupPatient, GroupBucket.getInstance(GroupType.Patient));
|
//4.朋友群组
|
doLoadMessageRelation(ChatSpaceType.GroupFriend, GroupBucket.getInstance(GroupType.Friend));
|
}
|
|
private static void doLoadMessageRelation(ChatSpaceType spaceType, Bucket<?> spaceBucket) throws Exception {
|
String spaceId;
|
MessageContainer messageContainer;
|
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("messagerelation").setOrderBy("spaceid, receivetime asc");
|
namedSQL.setFilter("TO_DAYS(NOW()) - TO_DAYS(receivetime) >=0 and spacecode = '" + spaceType + "' ");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
for (Entity entity : entitySet) {
|
spaceId = entity.getString("spaceid");
|
|
if (spaceId == null) {
|
continue;
|
}
|
|
messageContainer = getMessageContainer(spaceBucket, spaceId);
|
messageContainer.loadOneMessageRelation(entity);
|
}
|
}
|
|
private static void LoadFriendShip() throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getActiveFriendship");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
User user, friend;
|
FriendShip friendShip;
|
|
for (Entity entity : entitySet) {
|
//1.
|
user = getUser(entity.getString("userId"));
|
//friend = UserStore.getById(entity.getString("friendId"));
|
friend = getUser(entity.getString("friendId"));
|
|
if (user == null || friend == null) {
|
continue;
|
}
|
|
//如果,朋友关系还处于审请状态,那么,将信息加入到朋友推送list中
|
if ("apply".equals(entity.getString("statuscode"))) {
|
friendShip = new FriendShip();
|
friendShip.load(entity);
|
user.addOnePushFriendShip(user.getId(), friendShip);
|
continue;
|
}
|
|
friendShip = new FriendShip();
|
friendShip.load(entity);
|
//user.addOneFrieldShip(friend.getId(), friendShip);
|
user.addOneFrieldShip(user.getId(), friendShip);
|
|
friendShip = friendShip.getReverseInstance();
|
friend.addOneFrieldShip(friendShip.getUserid(), friendShip);
|
}
|
}
|
|
private static void LoadFriendCircle() throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getEntitySet");
|
namedSQL.setTableName("friendcircle").setOrderBy("senderid, createtime asc");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
String userId; User user;
|
FriendCircle friendCircle;
|
|
for (Entity entity : entitySet) {
|
userId = entity.getString("senderid");
|
user = UserStore.getCachedById(userId);
|
|
if (user == null) {
|
continue;
|
}
|
|
friendCircle = user.getFriendCircle();
|
friendCircle.loadOneCricleObject(entity);
|
}
|
}
|
|
private static MessageContainer getMessageContainer(Bucket<?> spaceBucket, String spaceId) {
|
if (spaceId.equals(cachedSpaceId)) {
|
return cachedContainer;
|
}
|
|
cachedSpaceId = spaceId;
|
cachedContainer = spaceBucket.getOne(cachedSpaceId);
|
return cachedContainer;
|
}
|
|
private static User getUser(String userId) {
|
if (userId.equals(cachedUserId)) {
|
return cachedUser;
|
}
|
|
cachedUserId = userId;
|
cachedUser = UserStore.getById(cachedUserId);
|
return cachedUser;
|
}
|
|
public static MessageRunner getImBusinessScheduler() {
|
return imBusinessScheduler;
|
}
|
|
public static void setImBusinessScheduler(MessageRunner imBusinessScheduler) {
|
ModuleLoader.imBusinessScheduler = imBusinessScheduler;
|
}
|
|
public static MessagesPublisher getMessagePublisher() {
|
return messagePublisher;
|
}
|
|
public static void setMessagePublisher(MessagesPublisher messagePublisher) {
|
ModuleLoader.messagePublisher = messagePublisher;
|
}
|
|
}
|