kimi
2021-02-18 0ac056bb5b4c567293482286c80a1b83a467cd33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
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;
    }
    
}