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 { protected static final Logger logger; private static GroupBucket groupDoctorBucket; private static GroupBucket groupPatientBucket; private static GroupBucket groupFriendBucket; private static GroupBucket allGroupBucket; private static ConcurrentMapList 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(); 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 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 getList(List groupList) { List result = new ArrayList(); 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 getGroupList(List groupList) { List result = new ArrayList(); 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 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 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 getAllGroups() { return allGroups; } public static void setAllGroups(ConcurrentMapList allGroups) { GroupBucket.allGroups = allGroups; } }