2 * Copyright 2005-2010 the original author or authors.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.wamblee.security.authentication.jpa;
18 import java.util.List;
20 import java.util.TreeSet;
22 import javax.persistence.EntityManager;
23 import javax.persistence.NoResultException;
24 import javax.persistence.TypedQuery;
26 import org.wamblee.cache.Cache;
27 import org.wamblee.cache.ZeroCache;
28 import org.wamblee.persistence.JpaMergeSupport;
29 import org.wamblee.security.authentication.AbstractUserSet;
30 import org.wamblee.security.authentication.Group;
31 import org.wamblee.security.authentication.NameValidator;
32 import org.wamblee.security.authentication.User;
33 import org.wamblee.security.encryption.MessageDigester;
36 * User set backed by the database.
38 * @author Erik Brakkee
40 public class JpaUserSet extends AbstractUserSet {
43 * Cache of users. Every user in the cache has its password validator and
46 private Cache<String, User> cache;
48 private EntityManager entityManager;
51 * Constructs a user set backed by the database.
56 public JpaUserSet(Cache<String, User> aCache,
57 NameValidator aPasswordValidator, MessageDigester aPasswordEncoder,
58 EntityManager aEntityManager) {
59 super(aPasswordValidator, aPasswordEncoder);
61 entityManager = aEntityManager;
65 public void userModified(User aUser) {
66 assert aUser.getPrimaryKey() != null;
67 User merged = entityManager.merge(aUser);
68 // Need to flush the entity manager to make sure the version is updated.
69 entityManager.flush();
70 JpaMergeSupport.merge(merged, aUser);
71 cache.remove(aUser.getName());
72 setPasswordInfo(aUser);
73 cache.put(aUser.getName(), new User(aUser));
77 public User find(String aName) {
78 User user = cache.get(aName);
84 TypedQuery<User> query = entityManager.createNamedQuery(
85 User.QUERY_FIND_BY_NAME, User.class);
86 query.setParameter(User.NAME_PARAM, aName);
88 user = query.getSingleResult();
89 setPasswordInfo(user);
90 cache.put(aName, user);
92 } catch (NoResultException e) {
98 public boolean contains(User aUser) {
99 return find(aUser.getName()) != null;
103 public boolean add(User aUser) {
104 assert aUser.getPrimaryKey() == null;
106 if (contains(aUser)) {
110 entityManager.persist(aUser);
111 entityManager.flush(); // to make sure the version is updated.
112 setPasswordInfo(aUser);
113 cache.put(aUser.getName(), aUser);
119 public boolean remove(User aUser) {
120 if (!contains(aUser)) {
124 User user = entityManager.merge(aUser);
125 entityManager.remove(user);
126 cache.remove(aUser.getName());
132 public Set<User> list() {
133 Set<User> users = new TreeSet<User>();
134 List<User> list = entityManager.createNamedQuery(User.QUERY_ALL_USERS,
135 User.class).getResultList();
137 for (User user : list) {
138 setPasswordInfo(user);
146 public Set<User> list(Group aGroup) {
147 Set<User> users = new TreeSet<User>();
148 TypedQuery<User> query = entityManager.createNamedQuery(
149 User.QUERY_FIND_BY_GROUP_NAME, User.class);
150 query.setParameter(User.NAME_PARAM, aGroup.getName());
152 List<User> list = query.getResultList();
154 for (User user : users) {
155 setPasswordInfo(user);
163 Long result = entityManager.createNamedQuery(User.QUERY_COUNT_USERS, Long.class).getSingleResult();
164 return result.intValue();
168 public void clearCache() {