View Javadoc

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   * An adaptor class for {@link CredentialsProvider} and some of the higher level operations of {@link com.opensymphony.user.UserManager}
21   * <p/>
22   * The rule is to use the credentialsProvider and/or profileProvider (for propertySets) for most things. Store() operations
23   * must be called on the entity itself.
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          //this is a very poor condition to run into but what can be done about it?
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       * Encrypts the plain password, sets it on the user, and saves the user.
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         // need to remove properties from a user as its deleted
113         // See: http://jira.atlassian.com/browse/USER-192
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 }