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