package chat.module;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import org.apache.log4j.Logger;
|
|
import chat.consts.ProtoConstants;
|
import chat.module.entity.Group;
|
import chat.module.entity.GroupType;
|
import chat.module.entity.Member;
|
import chat.module.entity.MessageRecord;
|
import chat.user.User;
|
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage.GroupInfo;
|
import cn.wildfirechat.proto.WFCMessage.UserRequest;
|
import frame.object.data.DataObject;
|
import frame.object.data.Entity;
|
import frame.object.data.ID;
|
|
|
public class GroupBucket extends Bucket<Group> {
|
|
protected static final Logger logger;
|
private static GroupBucket groupDoctorBucket;
|
private static GroupBucket groupPatientBucket;
|
private static GroupBucket groupFriendBucket;
|
private static GroupBucket allGroupBucket;
|
private static ConcurrentMapList<Group> allGroups;
|
private GroupType groupType;
|
private static int pullType;
|
|
static {
|
logger = Logger.getLogger(GroupBucket.class);
|
allGroupBucket = new GroupBucket();
|
groupDoctorBucket = new GroupBucket(GroupType.Doctor);
|
groupPatientBucket = new GroupBucket(GroupType.Patient);
|
groupFriendBucket = new GroupBucket(GroupType.Friend);
|
allGroups = new ConcurrentMapList<Group>();
|
pullType = ProtoConstants.PullType.Pull_Normal;
|
}
|
|
public static synchronized GroupBucket getInstance() {
|
if (allGroupBucket == null) {
|
allGroupBucket = new GroupBucket();
|
}
|
|
return allGroupBucket;
|
}
|
|
public GroupBucket() {}
|
|
public static synchronized GroupBucket getInstance(GroupType type) {
|
if (GroupType.Doctor == type) {
|
return groupDoctorBucket;
|
}
|
else if (GroupType.Patient == type) {
|
return groupPatientBucket;
|
}
|
else if (GroupType.Friend == type) {
|
return groupFriendBucket;
|
}
|
|
return null;
|
}
|
|
public GroupBucket(GroupType groupType) {
|
this.groupType = groupType;
|
}
|
|
public static void load(GroupType type, Entity entity) {
|
Group group = new Group();
|
group.load(entity);
|
|
if (GroupType.Doctor == type) {
|
groupDoctorBucket.addOne(group.getId(), group);
|
}
|
else if (GroupType.Patient == type) {
|
groupPatientBucket.addOne(group.getId(), group);
|
}
|
else if (GroupType.Friend == type) {
|
groupFriendBucket.addOne(group.getId(), group);
|
}
|
|
allGroups.add(group.getId(), group);
|
allGroupBucket.addOne(group.getId(), group);
|
}
|
|
public void addGroupMember(WFCMessage.AddGroupMemberRequest addGroupMemberRequest) throws Exception {
|
String groupId = addGroupMemberRequest.getGroupId();
|
Group friendGroup = getOne(groupId);
|
|
//1.不存在群组,则直接退出
|
if (friendGroup == null) {
|
return;
|
}
|
|
//2.存在群组,则将新增加的给员增加到群组中
|
friendGroup = new Group(groupId, "", "GroupDoctor");
|
friendGroup.loadMember(addGroupMemberRequest);
|
|
addFriendGroupMembers(friendGroup);
|
//更换群组的组员
|
refreshOne(addGroupMemberRequest);
|
}
|
|
//将groupId,对应的组成员进行更新
|
public void refreshOne(WFCMessage.AddGroupMemberRequest addGroupMemberRequest) {
|
Group existFriendGroup = getOne(addGroupMemberRequest.getGroupId());
|
if (existFriendGroup == null) {
|
return;
|
}
|
List<WFCMessage.GroupMember> wfcMemberList = existFriendGroup.getWFCMemberList();
|
wfcMemberList.addAll(addGroupMemberRequest.getAddedMemberList());
|
|
deleteOne(addGroupMemberRequest.getGroupId());
|
|
addOne(addGroupMemberRequest.getGroupId(), existFriendGroup);
|
}
|
|
public void createGroup() throws Exception {
|
|
}
|
|
public Group getOrCreate(WFCMessage.Group group, User sender) throws Exception {
|
WFCMessage.GroupInfo groupInfo = group.getGroupInfo();
|
String groupId = groupInfo.getTargetId();
|
|
//1. get group from cache
|
Group friendGroup = getOne(groupId);
|
|
//2. create new group
|
if (friendGroup == null) {
|
if (groupId == null || ("").equals(groupId)) {
|
groupId = ID.newValue();
|
}
|
|
friendGroup = new Group(groupId, sender.getId(), "GroupDoctor");
|
friendGroup.load(groupId, group, sender);
|
createOneFriendGroup(friendGroup);
|
addOne(groupId, friendGroup);
|
}
|
|
//3. create hello message
|
// MessageRecord record = MessageRecord.getTextInstance(sender.getName() + "拉你入群", sender);
|
// friendGroup.addOneMessage(ProtoConstants.PullType.Pull_Normal, record, sender, null);
|
|
//4. send message to members
|
// friendGroup.publishOneMessage(record, sender, true, content);
|
|
//5. return
|
return friendGroup;
|
}
|
|
public List<WFCMessage.GroupInfo> getList(List<UserRequest> groupList) {
|
List<WFCMessage.GroupInfo> result = new ArrayList<WFCMessage.GroupInfo>();
|
|
for (UserRequest user: groupList) {
|
String id = user.getUid();
|
Group group = getOne(id);
|
|
if (group != null) {
|
result.add(group.toWFCMessage());
|
}
|
}
|
|
return result;
|
}
|
|
public static Group getGroup(String groupId) {
|
return allGroups.get(groupId);
|
}
|
|
public static List<GroupInfo> getGroupList(List<UserRequest> groupList) {
|
List<WFCMessage.GroupInfo> result = new ArrayList<WFCMessage.GroupInfo>();
|
|
for (UserRequest groupRquest: groupList) {
|
String id = groupRquest.getUid();
|
Group group = allGroups.get(id);
|
|
if (group != null) {
|
result.add(group.toWFCMessage());
|
}
|
}
|
|
return result;
|
}
|
|
private void addFriendGroupMembers(Group friendGroup) throws Exception {
|
DataObject dataObject;
|
Entity entity;
|
|
//1. insert group members
|
List<Member> memberList = friendGroup.getMemberList();
|
|
dataObject = DataObject.getInstance("friendgroupmember");
|
|
for (Member member: memberList) {
|
entity = dataObject.newEntity();
|
member.pushTo(entity);
|
dataObject.insertToDataBase(entity);
|
}
|
|
}
|
|
private void createOneFriendGroup(Group friendGroup) throws Exception {
|
DataObject dataObject;
|
Entity entity;
|
|
//1. insert group
|
dataObject = DataObject.getInstance("chatspace");
|
|
entity = dataObject.newEntity();
|
friendGroup.pushTo(entity);
|
|
allGroups.add(friendGroup.getId(), friendGroup);
|
|
if (friendGroup.getTypecode().equals("GroupDoctor")) {
|
groupDoctorBucket.addOne(friendGroup.getId(), friendGroup);
|
}
|
else if (friendGroup.getTypecode().equals("GroupFriend")) {
|
groupFriendBucket.addOne(friendGroup.getId(), friendGroup);
|
}
|
|
dataObject.insertToDataBase(entity);
|
|
//2. insert members
|
List<Member> memberList = friendGroup.getMemberList();
|
|
dataObject = DataObject.getInstance("member");
|
|
for (Member member: memberList) {
|
entity = dataObject.newEntity();
|
member.pushTo(entity);
|
dataObject.insertToDataBase(entity);
|
}
|
}
|
|
@Override
|
public String toString() {
|
return groupType + ", size: " + size();
|
}
|
|
public static int getPullType() {
|
return pullType;
|
}
|
|
public static void setPullType(int pullType) {
|
GroupBucket.pullType = pullType;
|
}
|
|
public static ConcurrentMapList<Group> getAllGroups() {
|
return allGroups;
|
}
|
|
public static void setAllGroups(ConcurrentMapList<Group> allGroups) {
|
GroupBucket.allGroups = allGroups;
|
}
|
|
}
|