1 package com.atlassian.user.impl.memory.provider;
2
3 import com.atlassian.user.EntityException;
4 import com.atlassian.user.Group;
5 import com.atlassian.user.User;
6 import com.atlassian.user.search.page.DefaultPager;
7 import com.atlassian.user.search.page.Pager;
8
9 import java.text.Collator;
10 import java.util.*;
11
12
13
14
15 public class MemoryProvider
16 {
17 private HashMap<String, User> users;
18 private HashMap<String, Group> groups;
19 private List<Membership> localMembership;
20 private List<Membership> externalMembership;
21
22 class Membership
23 {
24
25 Group group;
26
27 User user;
28
29 public Membership(Group group, User user)
30 {
31 this.group = group;
32 this.user = user;
33 }
34
35 public Group getGroup()
36 {
37 return group;
38 }
39
40 public User getUser()
41 {
42 return user;
43 }
44
45 public boolean equals(Object o)
46 {
47 if (this == o) return true;
48 if (!(o instanceof Membership)) return false;
49
50 final Membership membership = (Membership) o;
51
52 if (group != null ? !group.equals(membership.group) : membership.group != null) return false;
53 if (user != null ? !user.equals(membership.user) : membership.user != null) return false;
54
55 return true;
56 }
57
58 public int hashCode()
59 {
60 int result;
61 result = (group != null ? group.hashCode() : 0);
62 result = 29 * result + (user != null ? user.hashCode() : 0);
63 return result;
64 }
65
66 }
67
68 public MemoryProvider()
69 {
70 users = new HashMap<String, User>();
71 groups = new HashMap<String, Group>();
72 localMembership = new ArrayList<Membership>();
73 externalMembership = new ArrayList<Membership>();
74 }
75
76 public Pager<String> getUserNames()
77 {
78 List<String> usernames = new ArrayList<String>();
79
80 for (User user : users.values())
81 {
82 usernames.add(user.getName());
83 }
84
85 return new DefaultPager<String>(usernames);
86 }
87
88 public Pager<User> getUsers()
89 {
90 return new DefaultPager<User>(new ArrayList<User>(users.values()));
91 }
92
93 public User getUser(String username)
94 {
95 return users.get(username);
96 }
97
98 public Pager<Group> getGroups()
99 {
100 return new DefaultPager<Group>(new ArrayList<Group>(groups.values()));
101 }
102
103 public Pager<Group> getGroups(User user)
104 {
105 ArrayList<Group> groupList = new ArrayList<Group>();
106
107 for (Membership membership : localMembership)
108 {
109 if (membership.getUser().equals(user))
110 groupList.add(membership.getGroup());
111 }
112 return new DefaultPager<Group>(groupList);
113 }
114
115 public void addGroup(Group group) throws EntityException
116 {
117 groups.put(group.getName(), group);
118 }
119
120 public void removeGroup(Group group) throws EntityException, IllegalArgumentException
121 {
122 if (group == null || getGroup(group.getName()) == null)
123 {
124 throw new IllegalArgumentException("Group is null or doesn't exist in repository");
125 }
126
127 groups.remove(group.getName());
128 for (Iterator<Membership> iter = localMembership.iterator(); iter.hasNext();)
129 {
130 Membership membership = iter.next();
131 if (membership.getGroup().equals(group))
132 iter.remove();
133 }
134 for (Iterator<Membership> iter = externalMembership.iterator(); iter.hasNext();)
135 {
136 Membership membership = iter.next();
137 if (membership.getGroup().equals(group))
138 iter.remove();
139 }
140 }
141
142 public Group getGroup(String groupName)
143 {
144 return groups.get(groupName);
145 }
146
147 public void addUser(User user)
148 {
149 users.put(user.getName(), user);
150 }
151
152 public void saveUser(User user)
153 {
154 users.put(user.getName(), user);
155 }
156
157 public void removeUser(User user) throws EntityException
158 {
159 users.remove(user.getName());
160
161 for (int i = 0; i < localMembership.size(); i++)
162 {
163 Membership membership1 = localMembership.get(i);
164
165 if (membership1.getUser().equals(user))
166 {
167 localMembership.remove(membership1);
168 if (localMembership.size() > 0 && i != localMembership.size())
169 i--;
170 }
171 }
172
173 for (int i = 0; i < externalMembership.size(); i++)
174 {
175 Membership membership1 = externalMembership.get(i);
176
177 if (membership1.getUser().equals(user))
178 {
179 externalMembership.remove(membership1);
180 if (externalMembership.size() > 0 && i != externalMembership.size())
181 i--;
182 }
183 }
184
185 }
186
187
188
189
190
191
192 public void addMembership(Group group, User user)
193 {
194 if (group == null)
195 throw new IllegalArgumentException("Cannot add membership for user [" + user + "] to a null group.");
196
197 if (user == null)
198 throw new IllegalArgumentException("Cannot add membership for null user to group [" + group + "]");
199
200 Membership membership1 = new Membership(group, user);
201
202 List<Membership> check;
203 if (isUserLocal(user))
204 check = localMembership;
205 else
206 check = externalMembership;
207
208 for (Membership membership2 : check)
209 {
210 if (membership2.equals(membership1))
211 return;
212 }
213
214 check.add(membership1);
215 }
216
217 boolean isUserLocal(User user)
218 {
219 return (users.get(user.getName()) != null);
220 }
221
222 public void removeMembership(Group group, User user)
223 {
224 List<Membership> check;
225 if (isUserLocal(user))
226 check = localMembership;
227 else
228 check = externalMembership;
229
230 for (int i = 0; i < check.size(); i++)
231 {
232 Membership membership1 = check.get(i);
233 if (membership1.getUser().equals(user) && membership1.getGroup().equals(group))
234 check.remove(membership1);
235 }
236 }
237
238 public Pager<String> getMemberNames(Group group)
239 {
240 List<String> memberNames = new ArrayList<String>();
241 memberNames.addAll(getLocalMemberNamesAsList(group));
242 memberNames.addAll(getExternalMemberNamesAsList(group));
243 Collections.sort(memberNames, Collator.getInstance());
244 return new DefaultPager<String>(memberNames);
245 }
246
247 public Pager<String> getExternalMemberNames(Group group)
248 {
249 List<String> members = getExternalMemberNamesAsList(group);
250 return new DefaultPager<String>(members);
251 }
252
253 private List<String> getExternalMemberNamesAsList(Group group)
254 {
255 List<String> members = new ArrayList<String>();
256
257 for (Membership membership : externalMembership)
258 {
259 if (membership.getGroup().equals(group))
260 members.add(membership.getUser().getName());
261 }
262 return members;
263 }
264
265 public Pager<User> getExternalMembers(Group group)
266 {
267 ArrayList<User> members = new ArrayList<User>();
268
269 for (Membership membership : externalMembership)
270 {
271 if (membership.getGroup().equals(group))
272 members.add(membership.getUser());
273 }
274
275 return new DefaultPager<User>(members);
276 }
277
278 public Pager<String> getLocalMemberNames(Group group)
279 {
280 List<String> memberNames = getLocalMemberNamesAsList(group);
281
282 Collections.sort(memberNames, Collator.getInstance());
283 return new DefaultPager<String>(memberNames);
284 }
285
286 private List<String> getLocalMemberNamesAsList(Group group)
287 {
288 List<String> memberNames = new ArrayList<String>();
289
290 for (Membership membership : localMembership)
291 {
292 if (membership.getGroup().equals(group))
293 memberNames.add(membership.getUser().getName());
294 }
295 return memberNames;
296 }
297
298 public Pager<User> getLocalMembers(Group group)
299 {
300 ArrayList<User> members = new ArrayList<User>();
301
302 for (Membership membership : localMembership)
303 {
304 if (membership.getGroup().equals(group))
305 members.add(membership.getUser());
306 }
307
308 return new DefaultPager<User>(members);
309 }
310
311 public boolean hasMembership(Group group, User user)
312 {
313 if (isUserLocal(user))
314 {
315 for (Membership membership : localMembership)
316 {
317 if (membership.getGroup().equals(group) && membership.getUser().equals(user))
318 return true;
319 }
320 }
321 else
322 {
323 for (Membership membership : externalMembership)
324 {
325 if (membership.getGroup().equals(group) && membership.getUser().equals(user))
326 return true;
327 }
328 }
329
330 return false;
331 }
332 }