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   * @deprecated since 2.2 because it should not be used in production. Will be moved to test code in 3.0.
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      * This might have been done at a higher level but it will generally be done at the provider level,
190      * for non-memory implementations. It's good practice to situate it here, in the prototype.
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 }