1 package com.atlassian.user.impl.osuser;
2
3 import com.atlassian.user.Entity;
4 import com.atlassian.user.EntityException;
5 import com.atlassian.user.User;
6 import com.atlassian.user.UserManager;
7 import com.atlassian.user.impl.RepositoryException;
8 import com.atlassian.user.repository.RepositoryIdentifier;
9 import com.atlassian.user.search.EntityNameAlphaComparator;
10 import com.atlassian.user.search.page.DefaultPager;
11 import com.atlassian.user.search.page.Pager;
12 import com.atlassian.user.util.Assert;
13 import com.opensymphony.module.propertyset.PropertySet;
14 import com.opensymphony.user.ImmutableException;
15 import com.opensymphony.user.provider.CredentialsProvider;
16
17 import java.util.*;
18
19
20
21
22
23
24
25 public class OSUUserManager extends OSUEntityManager implements UserManager
26 {
27 private final OSUAccessor accessor;
28
29 public OSUUserManager(RepositoryIdentifier repository, OSUAccessor accessor)
30 {
31 super(repository);
32 this.accessor = accessor;
33 }
34
35 public Pager<User> getUsers()
36 {
37 Collection<String> userNames = getUserNamesInternal();
38 SortedSet<User> atlassianUsers = new TreeSet<User>(new EntityNameAlphaComparator());
39
40 for (String username : userNames)
41 {
42 OSUUser user = getWrappedOpensymphonyUser(username);
43 if (user != null)
44 atlassianUsers.add(user);
45 }
46
47 return new DefaultPager<User>(atlassianUsers);
48 }
49
50 public Pager<String> getUserNames() throws EntityException
51 {
52 return new DefaultPager<String>(getUserNamesInternal());
53 }
54
55 public User getUser(String username)
56 {
57 return getWrappedOpensymphonyUser(username);
58 }
59
60 private OSUUser getWrappedOpensymphonyUser(String username)
61 {
62 com.opensymphony.user.User opensymphonyUser = getOpensymphonyUser(username);
63 return opensymphonyUser == null ? null : new OSUUser(opensymphonyUser);
64 }
65
66 private com.opensymphony.user.User getOpensymphonyUser(String username)
67 {
68 String lcUsername = username.toLowerCase();
69 if (accessor.getCredentialsProvider().handles(lcUsername))
70 return new com.opensymphony.user.User(username.toLowerCase(), accessor);
71 else
72 return null;
73 }
74
75 public User createUser(String username) throws com.atlassian.user.EntityException
76 {
77 boolean usernameHandled = accessor.getCredentialsProvider().handles(username);
78
79 if (usernameHandled)
80 throw new com.atlassian.user.impl.DuplicateEntityException("User [" + username
81 + "] already exists in credentialsProvider [" + accessor.getCredentialsProvider().toString() + "]");
82
83 if (accessor.getCredentialsProvider().create(username))
84 {
85 accessor.getProfileProvider().create(username);
86 return getWrappedOpensymphonyUser(username);
87 }
88
89
90 throw new EntityException("Was unable to create user [" + username + "] but the credentials provider ["
91 + accessor.getCredentialsProvider().toString() + "] did not say why.");
92 }
93
94
95
96
97 public void alterPassword(User user, String plainTextPass) throws EntityException
98 {
99 user.setPassword(plainTextPass);
100 saveUser(user);
101 }
102
103 public void removeUser(User user) throws EntityException
104 {
105 Assert.notNull(user, "User must not be null");
106 Assert.isInstanceOf(OSUUser.class, user);
107 Assert.isTrue(getUser(user.getName()) != null,
108 "User is not managed by this user manager: [" + user.getName() + "]");
109
110 String userName = user.getName();
111
112
113
114 PropertySet propertySet = accessor.getProfileProvider().getPropertySet(userName);
115
116 for (Object o : propertySet.getKeys())
117 {
118 String key = (String) o;
119 propertySet.remove(key);
120 }
121
122 List<String> groupsOfUser = new ArrayList<String>(getGroupsContainingUserInternal(userName));
123
124 for (String groupName : groupsOfUser)
125 {
126 accessor.getAccessProvider().removeFromGroup(userName, groupName);
127 }
128
129 boolean result = accessor.getCredentialsProvider().remove(userName);
130
131 if (!result)
132 throw new EntityException("Could not remove user!");
133
134 accessor.getProfileProvider().remove(userName);
135 }
136
137 public boolean isReadOnly(User user)
138 {
139 return getUser(user.getName()) == null;
140 }
141
142 public void saveUser(User user) throws EntityException
143 {
144 Assert.notNull(user, "User must not be null");
145 com.opensymphony.user.User osUser = getOpensymphonyUser(user.getName());
146 osUser.setEmail(user.getEmail());
147
148 try
149 {
150 osUser.store();
151 }
152 catch (ImmutableException e)
153 {
154 throw new RepositoryException(e);
155 }
156 }
157
158 public RepositoryIdentifier getRepository(Entity entity) throws EntityException
159 {
160 return getUser(entity.getName()) == null ? null : repository;
161 }
162
163 public OSUAccessor getAccessor()
164 {
165 return accessor;
166 }
167
168 @SuppressWarnings({"unchecked"})
169 private List<String> getUserNamesInternal()
170 {
171 return accessor.getCredentialsProvider().list();
172 }
173
174 @SuppressWarnings({"unchecked"})
175 private List<String> getGroupsContainingUserInternal(String userName)
176 {
177 return (List<String>) accessor.getAccessProvider().listGroupsContainingUser(userName);
178 }
179 }