Now working with both hibernate and eclipselink
[utils] / security / impl / src / main / java / org / wamblee / usermgt / jpa / JpaUserSet.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.usermgt.jpa;
17
18 import java.util.List;
19 import java.util.Set;
20 import java.util.TreeSet;
21
22 import javax.persistence.EntityManager;
23 import javax.persistence.NoResultException;
24 import javax.persistence.TypedQuery;
25
26 import org.wamblee.cache.Cache;
27 import org.wamblee.persistence.JpaMergeSupport;
28 import org.wamblee.security.encryption.MessageDigester;
29 import org.wamblee.usermgt.AbstractUserSet;
30 import org.wamblee.usermgt.Group;
31 import org.wamblee.usermgt.NameValidator;
32 import org.wamblee.usermgt.User;
33
34 /**
35  * User set backed by the database.
36  * 
37  * @author Erik Brakkee
38  */
39 public class JpaUserSet extends AbstractUserSet {
40
41     /**
42      * Cache of users. Every user in the cache has its password validator and
43      * encoder set.
44      */
45     private Cache<String, User> cache;
46
47     private EntityManager entityManager;
48
49     /**
50      * Constructs a user set backed by the database.
51      * 
52      * @param aCache
53      *            User cache to use.
54      */
55     public JpaUserSet(Cache<String, User> aCache,
56         NameValidator aPasswordValidator, MessageDigester aPasswordEncoder,
57         EntityManager aEntityManager) {
58         super(aPasswordValidator, aPasswordEncoder);
59         cache = aCache;
60         entityManager = aEntityManager;
61     }
62
63     /*
64      * (non-Javadoc)
65      * 
66      * @see org.wamblee.usermgt.UserSet#userModified(org.wamblee.usermgt.User)
67      */
68     public void userModified(User aUser) {
69         assert aUser.getPrimaryKey() != null;
70         User merged = entityManager.merge(aUser);
71         // Need to flush the entity manager to make sure the version is updated. 
72         entityManager.flush();
73         JpaMergeSupport.merge(merged, aUser);
74         cache.remove(aUser.getName());
75         setPasswordInfo(aUser);
76         cache.put(aUser.getName(), new User(aUser));
77     }
78
79     /*
80      * (non-Javadoc)
81      * 
82      * @see org.wamblee.usermgt.UserSet#find(java.lang.String)
83      */
84     public User find(String aName) {
85         User user = cache.get(aName);
86
87         if (user != null) {
88             return user;
89         }
90
91         TypedQuery<User> query = entityManager.createNamedQuery(
92             User.QUERY_FIND_BY_NAME, User.class);
93         query.setParameter(User.NAME_PARAM, aName);
94         try {
95             user = query.getSingleResult();
96             user = new User(user);
97             setPasswordInfo(user);
98             cache.put(aName, user);
99             return user;
100         } catch (NoResultException e) {
101             return null;
102         }
103     }
104
105     /*
106      * (non-Javadoc)
107      * 
108      * @see org.wamblee.usermgt.UserSet#contains(org.wamblee.usermgt.User)
109      */
110     public boolean contains(User aUser) {
111         return find(aUser.getName()) != null;
112     }
113
114     /*
115      * (non-Javadoc)
116      * 
117      * @see org.wamblee.usermgt.UserSet#add(org.wamblee.usermgt.User)
118      */
119     public boolean add(User aUser) {
120         assert aUser.getPrimaryKey() == null;
121
122         if (contains(aUser)) {
123             return false;
124         }
125
126         entityManager.persist(aUser);
127         entityManager.flush(); // to make sure the version is updated. 
128         setPasswordInfo(aUser);
129         cache.put(aUser.getName(), aUser);
130
131         return true;
132     }
133
134     /*
135      * (non-Javadoc)
136      * 
137      * @see org.wamblee.usermgt.UserSet#remove(org.wamblee.usermgt.User)
138      */
139     public boolean remove(User aUser) {
140         if (!contains(aUser)) {
141             return false;
142         }
143
144         User user = entityManager.merge(aUser);
145         entityManager.remove(user);
146         cache.remove(aUser.getName());
147
148         return true;
149     }
150
151     /*
152      * (non-Javadoc)
153      * 
154      * @see org.wamblee.usermgt.UserSet#list()
155      */
156     public Set<User> list() {
157         Set<User> users = new TreeSet<User>();
158         List<User> list = entityManager.createNamedQuery(User.QUERY_ALL_USERS,
159             User.class).getResultList();
160
161         for (User user : list) {
162             setPasswordInfo(user);
163             users.add(user);
164         }
165
166         return users;
167     }
168
169     /*
170      * (non-Javadoc)
171      * 
172      * @see org.wamblee.usermgt.UserSet#list(org.wamblee.usermgt.Group)
173      */
174     public Set<User> list(Group aGroup) {
175         Set<User> users = new TreeSet<User>();
176         TypedQuery<User> query = entityManager.createNamedQuery(
177             User.QUERY_FIND_BY_GROUP_NAME, User.class);
178         query.setParameter(User.NAME_PARAM, aGroup.getName());
179         
180         List<User> list = query.getResultList();
181         users.addAll(list);
182         for (User user : users) {
183             setPasswordInfo(user);
184         }
185
186         return users;
187     }
188
189     /*
190      * (non-Javadoc)
191      * 
192      * @see org.wamblee.usermgt.UserSet#size()
193      */
194     public int size() {
195         Long result = entityManager.createNamedQuery(User.QUERY_COUNT_USERS, Long.class).getSingleResult();
196         return result.intValue();
197     }
198 }