View Javadoc

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      * This might have been done at a higher level but it will generally be done at the provider level,
179      * for non-memory implementations. It's good practice to situate it here, in the prototype.
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 }